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'];
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc