View source
<?php
namespace Drupal\webform\Element;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;
use Drupal\webform\Plugin\WebformElement\TableSelect;
abstract class WebformExcludedBase extends FormElement {
public function getInfo() {
$class = get_class($this);
return [
'#input' => TRUE,
'#process' => [
[
$class,
'processWebformExcluded',
],
],
'#webform_id' => NULL,
'#theme_wrappers' => [
'form_element',
],
'#default_value' => [],
];
}
public static function processWebformExcluded(&$element, FormStateInterface $form_state, &$complete_form) {
$options = static::getWebformExcludedOptions($element);
$default_value = array_diff(array_keys($options), array_keys($element['#default_value'] ?: []));
$element['#tree'] = TRUE;
$element += [
'#element_validate' => [],
];
array_unshift($element['#element_validate'], [
get_called_class(),
'validateWebformExcluded',
]);
$element['tableselect'] = [
'#type' => 'tableselect',
'#header' => static::getWebformExcludedHeader(),
'#options' => $options,
'#js_select' => TRUE,
'#empty' => t('No elements are available.'),
'#default_value' => array_combine($default_value, $default_value),
];
TableSelect::setProcessTableSelectCallback($element['tableselect']);
if (isset($element['#parents'])) {
$element['tableselect']['#parents'] = array_merge($element['#parents'], [
'tableselect',
]);
}
$properties = [
'#title',
'#title_display',
'#description',
'#description_display',
'#ajax',
'#states',
];
$element['tableselect'] += array_intersect_key($element, array_combine($properties, $properties));
return $element;
}
public static function validateWebformExcluded(array &$element, FormStateInterface $form_state, &$complete_form) {
$value = array_filter($element['tableselect']['#value']);
$options = array_keys($element['tableselect']['#options']);
$excluded = array_diff($options, $value);
$form_state
->setValueForElement($element['tableselect'], NULL);
$value = array_combine($excluded, $excluded);
$element['#value'] = $value;
$form_state
->setValueForElement($element, $value);
}
public static function getWebformExcludedHeader() {
return [];
}
public static function getWebformExcludedOptions(array $element) {
return [];
}
}