htools-8.x-1.x-dev/modules/options_element/options_element.module
modules/options_element/options_element.module
<?php
/**
* @file
* Defines an "options" form element type for entering select list options.
*/
use Drupal\Core\Form\FormStateInterface;
/**
* Implementation of hook_theme().
*/
function options_element_theme($existing, $type, $theme, $path) {
return [
'options' => [
'render element' => 'element',
],
];
}
/**
* Prepares variables for options templates.
*
* Default template: options.html.twig.
*
* @param array $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #attributes.
*/
function template_preprocess_options(&$variables) {
$element = $variables['element'];
$options = [$element['options_field']];
if (isset($element['default_value_field'])) {
$options[] = $element['default_value_field'];
}
if (isset($element['default_value_pattern'])) {
$options[] = $element['default_value_pattern'];
}
$settings = [];
if (isset($element['custom_keys'])) {
$settings[] = $element['custom_keys'];
}
if (isset($element['multiple'])) {
$settings[] = $element['multiple'];
}
if (isset($element['option_settings'])) {
$settings[] = $element['option_settings'];
}
$variables['options'] = [
'#type' => 'container',
'#title' => t('Options'),
'#collapsible' => FALSE,
'#children' => $options,
'#attributes' => ['class' => ['options']],
];
if (!empty($settings)) {
$variables['settings'] = [
'#type' => 'fieldset',
'#title' => t('Option settings'),
'#collapsible' => FALSE,
'#children' => $settings,
'#attributes' => ['class' => ['option-settings']],
];
}
}
/**
* Implements hook_form_FORM_ID_alter() for 'field_storage_config_edit_form'.
*/
function options_element_form_field_storage_config_edit_form_alter(array &$form, FormStateInterface $form_state) {
$field = $form_state->getFormObject()->getEntity();
$type = $field->getType();
if (in_array($type, _options_element_supported_field_types())) {
// Get default value.
$options = \Drupal\options_element\OptionsUtilities::optionsFromText($form['settings']['allowed_values']['#default_value'], 'mixed');
// Toggled by default if options already set.
$key_type_toggled = !empty($options);
$element_overwrite = [
'#options' => $options,
'#multiple' => FALSE,
'#key_type_toggled' => $key_type_toggled,
'#default_value_allowed' => FALSE,
];
_options_element_add_allowed_values_element($form, $element_overwrite);
}
}
/**
* Element #after_build callback for the options list in Field UI.
*
* @param array $element
* @param \Drupal\Core\Form\FormStateInterface $form_state
*
* @return array
*/
function options_element_field_settings_after_build(array $element, FormStateInterface $form_state) {
// Add original data for validating.
$element['options_field'] = array_merge($element['options_field'], $element['#original']);
return $element;
}
/**
* Form #validate callback for Field UI forms that use an options element.
*
* @param array $form
* @param \Drupal\Core\Form\FormStateInterface $form_state
*/
function options_element_field_settings_validate($form, FormStateInterface &$form_state) {
if (!$form_state->getErrors()) {
// Set allowed values.
$form_state->setValueForElement($form['settings']['allowed_values'], $form['settings']['allowed_values']['#value']['options']);
}
}
/**
* Add options_element widget to form.
*
* @param array $form
* @param array $element
*/
function _options_element_add_allowed_values_element(&$form, $element) {
$default_element = [
'#type' => 'options',
'#key_type' => 'mixed', // Optimal for now.
'#key_type_toggle' => t('Custom keys'),
'#key_type_toggled' => TRUE,
'#after_build' => ['options_element_field_settings_after_build'],
'#access' => $form['settings']['allowed_values']['#access'],
'#default_value' => '',
// Pass original data for validating.
'#original' => [
'#title' => $form['settings']['allowed_values']['#title'],
'#field_has_data' => $form['settings']['allowed_values']['#field_has_data'],
'#element_validate' => $form['settings']['allowed_values']['#element_validate'],
],
];
$element = \Drupal\Component\Utility\NestedArray::mergeDeep($default_element, $element);
$form['settings']['allowed_values'] = $element;
// Set proper allowed values in $form_state.
$form['#validate'][] = 'options_element_field_settings_validate';
}
/**
* Returns supported field types.
*/
function _options_element_supported_field_types() {
return ['list_integer', 'list_float', 'list_string'];
}
