View source
<?php
namespace Drupal\yamlform\Element;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\FormElement;
abstract class YamlFormExcludedBase extends FormElement {
public function getInfo() {
$class = get_class($this);
return [
'#input' => TRUE,
'#process' => [
[
$class,
'processYamlFormExcluded',
],
],
'#yamlform' => NULL,
'#theme_wrappers' => [
'form_element',
],
];
}
public static function processYamlFormExcluded(&$element, FormStateInterface $form_state, &$complete_form) {
$options = static::getYamlFormExcludedOptions($element);
$default_value = array_diff(array_keys($options), array_keys($element['#default_value'] ?: []));
$element['#tree'] = TRUE;
$element['#element_validate'] = [
[
get_called_class(),
'validateYamlFormExcluded',
],
];
$element['tableselect'] = [
'#type' => 'tableselect',
'#header' => static::getYamlFormExcludedHeader(),
'#options' => $options,
'#js_select' => TRUE,
'#empty' => t('No elements are available.'),
'#default_value' => array_combine($default_value, $default_value),
];
$properties = [
'#title',
'#title_display',
'#description',
'#description_display',
'#ajax',
'#states',
];
$element['tableselect'] += array_intersect_key($element, array_combine($properties, $properties));
return $element;
}
public static function validateYamlFormExcluded(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);
$form_state
->setValueForElement($element, array_combine($excluded, $excluded));
}
public static function getYamlFormExcludedOptions(array $element) {
$yamlform = $element['#yamlform'];
$element_manager = \Drupal::service('plugin.manager.yamlform.element');
$options = [];
$elements = $yamlform
->getElementsInitializedAndFlattened();
foreach ($elements as $key => $element) {
$element_handler = $element_manager
->getElementInstance($element);
if (!$element_handler
->isInput($element)) {
continue;
}
$options[$key] = [
[
'title' => $element['#admin_title'] ?: $element['#title'] ?: $key,
],
[
'name' => $key,
],
[
'type' => isset($element['#type']) ? $element['#type'] : '',
],
];
}
return $options;
}
public static function getYamlFormExcludedHeader() {
return [
t('Title'),
t('Name'),
t('Type'),
];
}
}