StateDemo.php

Same filename in other branches
  1. 3.x modules/form_api_example/src/Form/StateDemo.php

Namespace

Drupal\form_api_example\Form

File

modules/form_api_example/src/Form/StateDemo.php

View source
<?php

namespace Drupal\form_api_example\Form;

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements the state demo form controller.
 *
 * This example demonstrates using the #states property to bind the visibility
 * of a form element to the value of another element in the form. In the
 * example, when the user checks the "Need Special Accommodation" checkbox,
 * additional form elements are made visible.
 *
 * The submit handler for this form is implemented by the
 * \Drupal\form_api_example\Form\DemoBase class.
 *
 * @see \Drupal\Core\Form\FormBase
 * @see \Drupal\form_api_example\Form\DemoBase
 * @see drupal_process_states()
 */
class StateDemo extends DemoBase {
    
    /**
     * Build the simple form.
     *
     * @inheritdoc
     */
    public function buildForm(array $form, FormStateInterface $form_state) {
        $form['description'] = [
            '#type' => 'item',
            '#markup' => $this->t('This example demonstrates the #states property. #states makes an element visibility dependent on another.'),
        ];
        $form['needs_accommodation'] = [
            '#type' => 'checkbox',
            '#title' => 'Need Special Accommodations?',
        ];
        // The #states property used here binds the visibility of the
        // container element to the value of the needs_accommodation checkbox above.
        $form['accommodation'] = [
            '#type' => 'container',
            '#attributes' => [
                'class' => 'accommodation',
            ],
            // #states is an associative array. Each key is the name of a state to
            // apply to the element, such as 'visible'. Each value is another array,
            // making a list of conditions that denote when the state should be
            // applied. Every condition is a key/value pair, whose key is a jQuery
            // selector that denotes another element on the page, and whose value is
            // an array of conditions, which must be met on in order for the state to
            // be applied.
            //
            // For additional documentation on the #states property including a list
            // of valid states and conditions see drupal_process_states().
'#states' => [
                // The state being affected is "invisible".
'invisible' => [
                    // Drupal will only apply this state when the element that satisfies
                    // the selector input[name="needs_accommodation"] is un-checked.
':input[name="needs_accommodation"]' => [
                        'checked' => FALSE,
                    ],
                ],
            ],
        ];
        $form['accommodation']['diet'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Dietary Restrictions'),
        ];
        // Add a submit button that handles the submission of the form.
        $form['actions']['submit'] = [
            '#type' => 'submit',
            '#value' => $this->t('Submit'),
        ];
        return $form;
    }
    
    /**
     * Getter method for Form ID.
     *
     * @inheritdoc
     */
    public function getFormId() {
        return 'form_api_example_state_demo';
    }
    
    /**
     * Implements submitForm callback.
     *
     * @inheritdoc
     */
    public function submitForm(array &$form, FormStateInterface $form_state) {
        // Find out what was submitted.
        $values = $form_state->getValues();
        if ($values['needs_accommodation']) {
            $this->messenger()
                ->addMessage($this->t('Dietary Restriction Requested: %diet', [
                '%diet' => $values['diet'],
            ]));
        }
    }

}

Classes

Title Deprecated Summary
StateDemo Implements the state demo form controller.