View source
<?php
namespace Drupal\webform\Element;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;
use Drupal\webform\Utility\WebformElementHelper;
class WebformCheckboxValue extends FormElement {
public function getInfo() {
$class = get_class($this);
return [
'#input' => TRUE,
'#process' => [
[
$class,
'processWebformCheckboxValue',
],
[
$class,
'processAjaxForm',
],
],
'#theme_wrappers' => [
'form_element',
],
'#states' => [],
];
}
public static function valueCallback(&$element, $input, FormStateInterface $form_state) {
$element += [
'#default_value' => NULL,
];
if ($input === FALSE) {
return [
'checkbox' => $element['#default_value'] ? TRUE : FALSE,
'value' => $element['#default_value'],
];
}
else {
return $input;
}
}
public static function processWebformCheckboxValue(&$element, FormStateInterface $form_state, &$complete_form) {
$element['#tree'] = TRUE;
$properties = [
'#title' => '#title',
'#description' => '#description',
'#help' => '#help',
];
$element['checkbox'] = [
'#type' => 'checkbox',
'#default_value' => !empty($element['#default_value']) ? TRUE : FALSE,
];
$element['checkbox'] += array_intersect_key($element, $properties);
$selector = 'edit-' . str_replace('_', '-', implode('-', $element['#parents'])) . '-checkbox';
$element['value'] = [
'#default_value' => $element['#default_value'],
'#states' => [
'visible' => [
':input[data-drupal-selector="' . $selector . '"]' => [
'checked' => TRUE,
],
],
'required' => [
':input[data-drupal-selector="' . $selector . '"]' => [
'checked' => TRUE,
],
],
],
];
foreach ($element as $key => $value) {
if (strpos($key, '#value__') === 0) {
$value_key = str_replace('#value__', '#', $key);
$element['value'][$value_key] = $value;
}
}
if (isset($element['#element'])) {
$element['value'] += $element['#element'];
}
$element['value'] += [
'#type' => 'textfield',
];
if (!isset($element['value']['#title']) && isset($element['#title'])) {
$element['value']['#title'] = $element['#title'];
$element['value']['#title_display'] = 'invisible';
}
$element['#attached']['library'][] = 'webform/webform.element.checkbox_value';
$element += [
'#element_validate' => [],
];
array_unshift($element['#element_validate'], [
get_called_class(),
'validateWebformCheckboxValue',
]);
$element = array_diff_key($element, $properties);
return $element;
}
public static function validateWebformCheckboxValue(&$element, FormStateInterface $form_state, &$complete_form) {
$value = NestedArray::getValue($form_state
->getValues(), $element['#parents']);
if (!empty($value['checkbox']) && empty($value['value'])) {
WebformElementHelper::setRequiredError($element['value'], $form_state);
}
if (empty($value['checkbox'])) {
$value['value'] = '';
}
$form_state
->setValueForElement($element['checkbox'], NULL);
$form_state
->setValueForElement($element['value'], NULL);
$element['#value'] = $value['value'];
$form_state
->setValueForElement($element, $value['value']);
}
}