Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 59 |
Checkboxes | |
0.00% |
0 / 1 |
|
0.00% |
0 / 3 |
272 | |
0.00% |
0 / 59 |
getInfo | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 12 |
|||
processCheckboxes | |
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 27 |
|||
valueCallback | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 20 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Render\Element\Checkboxes. | |
*/ | |
namespace Drupal\Core\Render\Element; | |
use Drupal\Core\Form\FormStateInterface; | |
/** | |
* 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: | |
* @code | |
* $form['high_school']['tests_taken'] = array( | |
* '#type' => 'checkboxes', | |
* '#options' => array('SAT' => t('SAT'), 'ACT' => t('ACT'))), | |
* '#title' => t('What standardized tests did you take?'), | |
* ... | |
* ); | |
* @endcode | |
* | |
* @see \Drupal\Core\Render\Element\Radios | |
* @see \Drupal\Core\Render\Element\Checkbox | |
* | |
* @FormElement("checkboxes") | |
*/ | |
class Checkboxes extends FormElement { | |
use CompositeFormElementTrait; | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getInfo() { | |
$class = get_class($this); | |
return array( | |
'#input' => TRUE, | |
'#process' => array( | |
array($class, 'processCheckboxes'), | |
), | |
'#pre_render' => array( | |
array($class, 'preRenderCompositeFormElement'), | |
), | |
'#theme_wrappers' => array('checkboxes'), | |
); | |
} | |
/** | |
* Processes a checkboxes form element. | |
*/ | |
public static function processCheckboxes(&$element, FormStateInterface $form_state, &$complete_form) { | |
$value = is_array($element['#value']) ? $element['#value'] : array(); | |
$element['#tree'] = TRUE; | |
if (count($element['#options']) > 0) { | |
if (!isset($element['#default_value']) || $element['#default_value'] == 0) { | |
$element['#default_value'] = array(); | |
} | |
$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; | |
$element += array($key => array()); | |
$element[$key] += array( | |
'#type' => 'checkbox', | |
'#title' => $choice, | |
'#return_value' => $key, | |
'#default_value' => isset($value[$key]) ? $key : NULL, | |
'#attributes' => $element['#attributes'], | |
'#ajax' => isset($element['#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 = array(); | |
$element += array('#default_value' => array()); | |
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]); | |
} | |
} | |
return array_combine($input, $input); | |
} | |
else { | |
return array(); | |
} | |
} | |
} |