abstract class SelectOrOtherWidgetBase in Select (or other) 8.3
Base class for the 'select_or_other_*' widgets.
Field types willing to enable one or several of the widgets defined in select_or_other.module (select, radios/checkboxes, on/off checkbox) need to implement the AllowedValuesInterface to specify the list of options to display in the widgets.
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Field\WidgetBase implements WidgetInterface, ContainerFactoryPluginInterface uses AllowedTagsXssTrait
- class \Drupal\select_or_other\Plugin\Field\FieldWidget\SelectOrOtherWidgetBase
 
 
 - class \Drupal\Core\Field\WidgetBase implements WidgetInterface, ContainerFactoryPluginInterface uses AllowedTagsXssTrait
 
 - class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
 
 - class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
 
Expanded class hierarchy of SelectOrOtherWidgetBase
See also
\Drupal\Core\TypedData\AllowedValuesInterface
3 files declare their use of SelectOrOtherWidgetBase
- ReferenceWidget.php in src/
Plugin/ Field/ FieldWidget/ EntityReference/ ReferenceWidget.php  - Contains \Drupal\select_or_other\Plugin\Field\FieldWidget\EntityReference\ReferenceWidget.
 - ReferenceWidgetTest.php in Tests/
src/ Unit/ ReferenceWidgetTest.php  - SelectOrOtherWidgetBaseTest.php in tests/
src/ Unit/ SelectOrOtherWidgetBaseTest.php  
File
- src/
Plugin/ Field/ FieldWidget/ SelectOrOtherWidgetBase.php, line 25  - Contains \Drupal\select_or_other\Plugin\Field\FieldWidget\SelectOrOtherWidgetBase.
 
Namespace
Drupal\select_or_other\Plugin\Field\FieldWidgetView source
abstract class SelectOrOtherWidgetBase extends WidgetBase {
  /**
   * Identifies a 'None' option.
   */
  const SELECT_OR_OTHER_EMPTY_NONE = 'options_none';
  /**
   * Identifies a 'Select a value' option.
   */
  const SELECT_OR_OTHER_EMPTY_SELECT = 'options_select';
  /**
   * @var string
   */
  private $has_value;
  /**
   * Helper method to determine the identifying column for the field.
   *
   * @return string
   *   The name of the column.
   */
  protected function getColumn() {
    static $property_names;
    if (empty($property_names)) {
      $property_names = $this->fieldDefinition
        ->getFieldStorageDefinition()
        ->getPropertyNames();
    }
    return reset($property_names);
  }
  /**
   * Helper method to determine if the field supports multiple values.
   *
   * @return bool
   */
  protected function isMultiple() {
    return $this->fieldDefinition
      ->getFieldStorageDefinition()
      ->isMultiple();
  }
  /**
   * Helper method to determine if the field is required.
   * @return bool
   */
  protected function isRequired() {
    return $this->fieldDefinition
      ->isRequired();
  }
  /**
   * {@inheritdoc}
   */
  public static function defaultSettings() {
    return [
      'select_element_type' => 'select_or_other_select',
      'available_options' => '',
      'other' => 'Other',
      'other_title' => '',
      'other_unknown_defaults' => 'other',
      'other_size' => 60,
      'sort_options' => 0,
    ] + parent::defaultSettings();
  }
  /**
   * {@inheritdoc}
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $form = parent::settingsForm($form, $form_state);
    $form['select_element_type'] = [
      '#title' => $this
        ->t('Type of select form element'),
      '#type' => 'select',
      '#options' => $this
        ->selectElementTypeOptions(),
      '#default_value' => $this
        ->getSetting('select_element_type'),
    ];
    return $form;
  }
  /**
   * {@inheritdoc}
   */
  public function settingsSummary() {
    $summary = parent::settingsSummary();
    $options = $this
      ->selectElementTypeOptions();
    $summary[] = $this
      ->t('Type of select form element') . ': ' . $options[$this
      ->getSetting('select_element_type')];
    return $summary;
  }
  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    // Prepare some properties for the child methods to build the actual form
    // element.
    $this->has_value = isset($items[0]->{$this
      ->getColumn()});
    $element += [
      '#type' => $this
        ->getSetting('select_element_type'),
      '#options' => $this
        ->getOptions(),
      '#default_value' => $this
        ->getSelectedOptions($items),
      // Do not display a 'multiple' select box if there is only one option.
      '#multiple' => $this
        ->isMultiple() && count($this
        ->getOptions()) > 1,
      '#key_column' => $this
        ->getColumn(),
      '#element_validate' => [
        [
          get_class($this),
          'validateElement',
        ],
      ],
    ];
    // The rest of the $element is built by child method implementations.
    return $element;
  }
  /**
   *
   * Return whether $items of formElement method contains any data.
   *
   * @return bool
   */
  public function hasValue() {
    return $this->has_value;
  }
  /**
   * Form validation handler for widget elements.
   *
   * @param array $element
   *   The form element.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   */
  public static function validateElement(array $element, FormStateInterface $form_state) {
    if ($element['#required'] && $element['#value'] == '_none') {
      $form_state
        ->setError($element, t('@name field is required.', array(
        '@name' => $element['#title'],
      )));
    }
    // Massage submitted form values.
    // Drupal\Core\Field\WidgetBase::submit() expects values as
    // an array of values keyed by delta first, then by column, while our
    // widgets return the opposite.
    if (is_array($element['#value'])) {
      $values = array_values($element['#value']);
    }
    else {
      $values = array(
        $element['#value'],
      );
    }
    // Filter out the 'none' option. Use a strict comparison, because
    // 0 == 'any string'.
    $index = array_search('_none', $values, TRUE);
    if ($index !== FALSE) {
      unset($values[$index]);
    }
    // Transpose selections from field => delta to delta => field.
    $items = array();
    foreach ($values as $value) {
      $items[] = array(
        $element['#key_column'] => $value,
      );
    }
    $form_state
      ->setValueForElement($element, $items);
  }
  /**
   * Returns the array of options for the widget.
   *
   * @return array
   *   The array of available options for the widget.
   */
  protected abstract function getOptions();
  /**
   * Determines selected options from the incoming field values.
   *
   * @param \Drupal\Core\Field\FieldItemListInterface $items
   *   The field values.
   *
   * @return array
   *   The array of corresponding selected options.
   */
  protected function getSelectedOptions(FieldItemListInterface $items) {
    $selected_options = [];
    foreach ($items as $item) {
      $selected_options[] = $item->{$this
        ->getColumn()};
    }
    $selected_options = $this
      ->prepareSelectedOptions($selected_options);
    if ($selected_options) {
      // We need to check against a flat list of options.
      $flattened_options = $this
        ->flattenOptions($this
        ->getOptions());
      foreach ($selected_options as $key => $selected_option) {
        // Remove the option if it does not exist in the options.
        if (!isset($flattened_options[$selected_option])) {
          unset($selected_options[$key]);
        }
      }
    }
    return $selected_options;
  }
  /**
   * Flattens an array of allowed values.
   *
   * @param array $array
   *   A single or multidimensional array.
   *
   * @return array
   *   The flattened array.
   */
  protected function flattenOptions(array $array) {
    $result = array();
    array_walk_recursive($array, function ($a, $b) use (&$result) {
      $result[$b] = $a;
    });
    return $result;
  }
  /**
   * Indicates whether the widgets support optgroups.
   *
   * @return bool
   *   TRUE if the widget supports optgroups, FALSE otherwise.
   */
  protected function supportsGroups() {
    return FALSE;
  }
  /**
   * Sanitizes a string label to display as an option.
   *
   * @param string $label
   *   The label to sanitize.
   */
  protected static function sanitizeLabel(&$label) {
    // Allow a limited set of HTML tags.
    $label = Xss::filter($label);
  }
  /**
   * Returns the empty option to add to the list of options, if any.
   *
   * @return string|null
   *   Either static::OPTIONS_EMPTY_NONE, static::OPTIONS_EMPTY_SELECT, or NULL.
   */
  protected function getEmptyOption() {
  }
  /**
   * Prepares selected options for comparison to the available options.
   *
   * Sometimes widgets have to change the keys of their available options. This
   * method allows those widgets to do the same with the selected options to
   * ensure they actually end up selected in the widget.
   *
   * @param array $options
   *   The options to prepare.
   *
   * @return array
   *   The prepared option.
   */
  protected function prepareSelectedOptions(array $options) {
    return $options;
  }
  /**
   * Returns the types of select elements available for selection.
   *
   * @return array
   *   The available select element types.
   *
   * @codeCoverageIgnore
   *   Testing this method would only test if this hard-coded array equals the
   *   one in the test case.
   */
  private function selectElementTypeOptions() {
    return [
      'select_or_other_select' => $this
        ->t('Select list'),
      'select_or_other_buttons' => $this
        ->t('Radiobuttons/checkboxes'),
    ];
  }
}Members
| 
            Name | 
                  Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| 
            AllowedTagsXssTrait:: | 
                  public | function | Returns a list of tags allowed by AllowedTagsXssTrait::fieldFilterXss(). | |
| 
            AllowedTagsXssTrait:: | 
                  public | function | Returns a human-readable list of allowed tags for display in help texts. | |
| 
            AllowedTagsXssTrait:: | 
                  public | function | Filters an HTML string to prevent XSS vulnerabilities. | |
| 
            DependencySerializationTrait:: | 
                  protected | property | An array of entity type IDs keyed by the property name of their storages. | |
| 
            DependencySerializationTrait:: | 
                  protected | property | An array of service IDs keyed by property name used for serialization. | |
| 
            DependencySerializationTrait:: | 
                  public | function | 1 | |
| 
            DependencySerializationTrait:: | 
                  public | function | 2 | |
| 
            MessengerTrait:: | 
                  protected | property | The messenger. | 29 | 
| 
            MessengerTrait:: | 
                  public | function | Gets the messenger. | 29 | 
| 
            MessengerTrait:: | 
                  public | function | Sets the messenger. | |
| 
            PluginBase:: | 
                  protected | property | Configuration information passed into the plugin. | 1 | 
| 
            PluginBase:: | 
                  protected | property | The plugin implementation definition. | 1 | 
| 
            PluginBase:: | 
                  protected | property | The plugin_id. | |
| 
            PluginBase:: | 
                  constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
| 
            PluginBase:: | 
                  public | function | 
            Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: | 
                  |
| 
            PluginBase:: | 
                  public | function | 
            Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: | 
                  |
| 
            PluginBase:: | 
                  public | function | 
            Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: | 
                  3 | 
| 
            PluginBase:: | 
                  public | function | 
            Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: | 
                  |
| 
            PluginBase:: | 
                  public | function | Determines if the plugin is configurable. | |
| 
            PluginSettingsBase:: | 
                  protected | property | Whether default settings have been merged into the current $settings. | |
| 
            PluginSettingsBase:: | 
                  protected | property | The plugin settings injected by third party modules. | |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: | 
                  6 | 
| 
            PluginSettingsBase:: | 
                  public | function | 
            Returns the value of a setting, or its default value if absent. Overrides PluginSettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Returns the array of settings, including defaults for missing settings. Overrides PluginSettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  protected | function | Merges default settings values into $settings. | |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Informs the plugin that some configuration it depends on will be deleted. Overrides PluginSettingsInterface:: | 
                  3 | 
| 
            PluginSettingsBase:: | 
                  public | function | 
            Sets the value of a setting for the plugin. Overrides PluginSettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Sets the settings for the plugin. Overrides PluginSettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: | 
                  |
| 
            PluginSettingsBase:: | 
                  public | function | 
            Unsets a third-party setting. Overrides ThirdPartySettingsInterface:: | 
                  |
| 
            SelectOrOtherWidgetBase:: | 
                  private | property | ||
| 
            SelectOrOtherWidgetBase:: | 
                  public static | function | 
            Defines the default settings for this plugin. Overrides PluginSettingsBase:: | 
                  |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Flattens an array of allowed values. | |
| 
            SelectOrOtherWidgetBase:: | 
                  public | function | 
            Returns the form for a single field widget. Overrides WidgetInterface:: | 
                  2 | 
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Helper method to determine the identifying column for the field. | |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Returns the empty option to add to the list of options, if any. | 1 | 
| 
            SelectOrOtherWidgetBase:: | 
                  abstract protected | function | Returns the array of options for the widget. | 2 | 
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Determines selected options from the incoming field values. | |
| 
            SelectOrOtherWidgetBase:: | 
                  public | function | Return whether $items of formElement method contains any data. | |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Helper method to determine if the field supports multiple values. | |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Helper method to determine if the field is required. | |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Prepares selected options for comparison to the available options. | 1 | 
| 
            SelectOrOtherWidgetBase:: | 
                  protected static | function | Sanitizes a string label to display as an option. | 1 | 
| 
            SelectOrOtherWidgetBase:: | 
                  private | function | Returns the types of select elements available for selection. | |
| 
            SelectOrOtherWidgetBase:: | 
                  constant | Identifies a 'None' option. | ||
| 
            SelectOrOtherWidgetBase:: | 
                  constant | Identifies a 'Select a value' option. | ||
| 
            SelectOrOtherWidgetBase:: | 
                  public | function | 
            Returns a form to configure settings for the widget. Overrides WidgetBase:: | 
                  1 | 
| 
            SelectOrOtherWidgetBase:: | 
                  public | function | 
            Returns a short summary for the current widget settings. Overrides WidgetBase:: | 
                  |
| 
            SelectOrOtherWidgetBase:: | 
                  protected | function | Indicates whether the widgets support optgroups. | 1 | 
| 
            SelectOrOtherWidgetBase:: | 
                  public static | function | Form validation handler for widget elements. | |
| 
            StringTranslationTrait:: | 
                  protected | property | The string translation service. | 1 | 
| 
            StringTranslationTrait:: | 
                  protected | function | Formats a string containing a count of items. | |
| 
            StringTranslationTrait:: | 
                  protected | function | Returns the number of plurals supported by a given language. | |
| 
            StringTranslationTrait:: | 
                  protected | function | Gets the string translation service. | |
| 
            StringTranslationTrait:: | 
                  public | function | Sets the string translation service to use. | 2 | 
| 
            StringTranslationTrait:: | 
                  protected | function | Translates a string to the current language or to a given language. | |
| 
            WidgetBase:: | 
                  protected | property | The field definition. | |
| 
            WidgetBase:: | 
                  protected | property | 
            The widget settings. Overrides PluginSettingsBase:: | 
                  |
| 
            WidgetBase:: | 
                  public static | function | Ajax callback for the "Add another item" button. | |
| 
            WidgetBase:: | 
                  public static | function | Submission handler for the "Add another item" button. | |
| 
            WidgetBase:: | 
                  public static | function | After-build handler for field elements in a form. | |
| 
            WidgetBase:: | 
                  public static | function | 
            Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: | 
                  5 | 
| 
            WidgetBase:: | 
                  public | function | 
            Assigns a field-level validation error to the right widget sub-element. Overrides WidgetInterface:: | 
                  8 | 
| 
            WidgetBase:: | 
                  public | function | 
            Extracts field values from submitted form values. Overrides WidgetBaseInterface:: | 
                  2 | 
| 
            WidgetBase:: | 
                  public | function | 
            Reports field-level validation errors against actual form elements. Overrides WidgetBaseInterface:: | 
                  2 | 
| 
            WidgetBase:: | 
                  public | function | 
            Creates a form element for a field. Overrides WidgetBaseInterface:: | 
                  3 | 
| 
            WidgetBase:: | 
                  protected | function | Special handling to create form elements for multiple values. | 1 | 
| 
            WidgetBase:: | 
                  protected | function | Generates the form element for a single copy of the widget. | |
| 
            WidgetBase:: | 
                  protected | function | Returns the value of a field setting. | |
| 
            WidgetBase:: | 
                  protected | function | Returns the array of field settings. | |
| 
            WidgetBase:: | 
                  protected | function | Returns the filtered field description. | |
| 
            WidgetBase:: | 
                  public static | function | 
            Retrieves processing information about the widget from $form_state. Overrides WidgetBaseInterface:: | 
                  |
| 
            WidgetBase:: | 
                  protected static | function | Returns the location of processing information within $form_state. | |
| 
            WidgetBase:: | 
                  protected | function | Returns whether the widget handles multiple values. | |
| 
            WidgetBase:: | 
                  public static | function | 
            Returns if the widget can be used for the provided field. Overrides WidgetInterface:: | 
                  4 | 
| 
            WidgetBase:: | 
                  protected | function | Returns whether the widget used for default value form. | |
| 
            WidgetBase:: | 
                  public | function | 
            Massages the form values into the format expected for field values. Overrides WidgetInterface:: | 
                  7 | 
| 
            WidgetBase:: | 
                  public static | function | 
            Stores processing information about the widget in $form_state. Overrides WidgetBaseInterface:: | 
                  |
| 
            WidgetBase:: | 
                  public | function | 
            Constructs a WidgetBase object. Overrides PluginBase:: | 
                  5 |