You are here

class Checkboxes in Drupal 10

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Render/Element/Checkboxes.php \Drupal\Core\Render\Element\Checkboxes
  2. 9 core/lib/Drupal/Core/Render/Element/Checkboxes.php \Drupal\Core\Render\Element\Checkboxes

Provides a form element for a set of checkboxes.

Properties:

  • #options: An associative array whose keys are the values returned for each checkbox, and whose values are the labels next to each checkbox. The #options array cannot have a 0 key, as it would not be possible to discern checked and unchecked states.

Usage example:


$form['favorites']['colors'] = array(
  '#type' => 'checkboxes',
  '#options' => array('blue' => $this->t('Blue'), 'red' => $this->t('Red')),
  '#title' => $this->t('Which colors do you like?'),
  ...
);

Element properties may be set on single option items as follows.

$form['favorites']['colors']['blue']['#description'] = $this
  ->t('The color of the sky.');

Plugin annotation

@FormElement("checkboxes");

Hierarchy

Expanded class hierarchy of Checkboxes

See also

\Drupal\Core\Render\Element\Radios

\Drupal\Core\Render\Element\Checkbox

3 files declare their use of Checkboxes
FilterPluginBase.php in core/modules/views/src/Plugin/views/filter/FilterPluginBase.php
ViewsExposedForm.php in core/modules/views/src/Form/ViewsExposedForm.php
views_ui.theme.inc in core/modules/views_ui/views_ui.theme.inc
Preprocessors and theme functions for the Views UI.
4 string references to 'Checkboxes'
FormTestCheckboxesRadiosForm::buildForm in core/modules/system/tests/modules/form_test/src/Form/FormTestCheckboxesRadiosForm.php
Form constructor.
FormTestInputForgeryForm::buildForm in core/modules/system/tests/modules/form_test/src/Form/FormTestInputForgeryForm.php
Form constructor.
FormTestProgrammaticForm::buildForm in core/modules/system/tests/modules/form_test/src/Form/FormTestProgrammaticForm.php
Form constructor.
FormTestValidateRequiredForm::buildForm in core/modules/system/tests/modules/form_test/src/Form/FormTestValidateRequiredForm.php
Form constructor.
51 #type uses of Checkboxes
AccountForm::form in core/modules/user/src/AccountForm.php
Gets the actual form array to be built.
AdvancedSettingsForm::buildForm in core/modules/views_ui/src/Form/AdvancedSettingsForm.php
Form constructor.
Attachment::buildOptionsForm in core/modules/views/src/Plugin/views/display/Attachment.php
Provide the default form for setting options.
BigPipeTestForm::buildForm in core/modules/big_pipe/tests/modules/big_pipe_test/src/Form/BigPipeTestForm.php
Form constructor.
Block::buildOptionsForm in core/modules/views/src/Plugin/views/display/Block.php
Provide the default form for setting options.

... See full list

File

core/lib/Drupal/Core/Render/Element/Checkboxes.php, line 37

Namespace

Drupal\Core\Render\Element
View source
class Checkboxes extends FormElement {
  use CompositeFormElementTrait;

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    $class = static::class;
    return [
      '#input' => TRUE,
      '#process' => [
        [
          $class,
          'processCheckboxes',
        ],
      ],
      '#pre_render' => [
        [
          $class,
          'preRenderCompositeFormElement',
        ],
      ],
      '#theme_wrappers' => [
        'checkboxes',
      ],
    ];
  }

  /**
   * Processes a checkboxes form element.
   */
  public static function processCheckboxes(&$element, FormStateInterface $form_state, &$complete_form) {
    $value = is_array($element['#value']) ? $element['#value'] : [];
    $element['#tree'] = TRUE;
    if (count($element['#options']) > 0) {
      if (!isset($element['#default_value']) || $element['#default_value'] == 0) {
        $element['#default_value'] = [];
      }
      $weight = 0;
      foreach ($element['#options'] as $key => $choice) {

        // Integer 0 is not a valid #return_value, so use '0' instead.
        // @see \Drupal\Core\Render\Element\Checkbox::valueCallback().
        // @todo For Drupal 8, cast all integer keys to strings for consistency
        //   with \Drupal\Core\Render\Element\Radios::processRadios().
        if ($key === 0) {
          $key = '0';
        }

        // Maintain order of options as defined in #options, in case the element
        // defines custom option sub-elements, but does not define all option
        // sub-elements.
        $weight += 0.001;

        // Only enabled checkboxes receive their values from the form
        // submission, the disabled checkboxes use their default value.
        $default_value = NULL;
        if (isset($value[$key]) || !empty($element[$key]['#disabled']) && in_array($key, $element['#default_value'], TRUE)) {
          $default_value = $key;
        }
        $element += [
          $key => [],
        ];
        $element[$key] += [
          '#type' => 'checkbox',
          '#title' => $choice,
          '#return_value' => $key,
          '#default_value' => $default_value,
          '#attributes' => $element['#attributes'],
          '#ajax' => $element['#ajax'] ?? NULL,
          // Errors should only be shown on the parent checkboxes element.
          '#error_no_message' => TRUE,
          '#weight' => $weight,
        ];
      }
    }
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
    if ($input === FALSE) {
      $value = [];
      $element += [
        '#default_value' => [],
      ];
      foreach ($element['#default_value'] as $key) {
        $value[$key] = $key;
      }
      return $value;
    }
    elseif (is_array($input)) {

      // Programmatic form submissions use NULL to indicate that a checkbox
      // should be unchecked. We therefore remove all NULL elements from the
      // array before constructing the return value, to simulate the behavior
      // of web browsers (which do not send unchecked checkboxes to the server
      // at all). This will not affect non-programmatic form submissions, since
      // all values in \Drupal::request()->request are strings.
      // @see \Drupal\Core\Form\FormBuilderInterface::submitForm()
      foreach ($input as $key => $value) {
        if (!isset($value)) {
          unset($input[$key]);
        }
      }

      // Because the disabled checkboxes don't receive their input from the
      // form submission, we use their default value.
      if (!empty($element['#default_value'])) {
        foreach ($element['#default_value'] as $key) {
          if (!empty($element[$key]['#disabled'])) {
            $input[$key] = $key;
          }
        }
      }
      return array_combine($input, $input);
    }
    else {
      return [];
    }
  }

  /**
   * Determines which checkboxes were checked when a form is submitted.
   *
   * @param array $input
   *   An array returned by the FormAPI for a set of checkboxes.
   *
   * @return array
   *   An array of keys that were checked.
   */
  public static function getCheckedCheckboxes(array $input) {

    // Browsers do not include unchecked options in a form submission. The
    // FormAPI tries to normalize this to keep checkboxes consistent with other
    // form elements. Checkboxes show up as an array in the form of option_id =>
    // option_id|0, where integer 0 is an unchecked option.
    //
    // @see \Drupal\Core\Render\Element\Checkboxes::valueCallback()
    // @see https://www.w3.org/TR/html401/interact/forms.html#checkbox
    $checked = array_filter($input, function ($value) {
      return $value !== 0;
    });
    return array_keys($checked);
  }

  /**
   * Determines if all checkboxes in a set are unchecked.
   *
   * @param array $input
   *   An array returned by the FormAPI for a set of checkboxes.
   *
   * @return bool
   *   TRUE if all options are unchecked. FALSE otherwise.
   */
  public static function detectEmptyCheckboxes(array $input) {
    return empty(static::getCheckedCheckboxes($input));
  }

}

Members

Namesort descending Modifiers Type Description Overrides
Checkboxes::detectEmptyCheckboxes public static function Determines if all checkboxes in a set are unchecked.
Checkboxes::getCheckedCheckboxes public static function Determines which checkboxes were checked when a form is submitted.
Checkboxes::getInfo public function Returns the element properties for this element. Overrides ElementInterface::getInfo
Checkboxes::processCheckboxes public static function Processes a checkboxes form element.
Checkboxes::valueCallback public static function Determines how user input is mapped to an element's #value property. Overrides FormElement::valueCallback
CompositeFormElementTrait::preRenderCompositeFormElement public static function Adds form element theming to an element if its title or description is set.
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function 2
DependencySerializationTrait::__wakeup public function 2
FormElement::processAutocomplete public static function Adds autocomplete functionality to elements.
FormElement::processPattern public static function #process callback for #pattern form element property.
FormElement::validatePattern public static function #element_validate callback for #pattern form element property.
MessengerTrait::$messenger protected property The messenger. 18
MessengerTrait::messenger public function Gets the messenger. 18
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition.
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function
PluginBase::getDerivativeId public function
PluginBase::getPluginDefinition public function 2
PluginBase::getPluginId public function
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. 53
RenderElement::preRenderAjaxForm public static function Adds Ajax information about an element to communicate with JavaScript.
RenderElement::preRenderGroup public static function Adds members of this group as actual elements for rendering.
RenderElement::processAjaxForm public static function Form element processing handler for the #ajax form property. 1
RenderElement::processGroup public static function Arranges elements into groups.
RenderElement::setAttributes public static function Sets a form element's class attribute. Overrides ElementInterface::setAttributes
StringTranslationTrait::$stringTranslation protected property The string translation service. 3
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 1
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.