You are here

public function Mapping::buildOptionsForm in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/views/src/Plugin/views/style/Mapping.php \Drupal\views\Plugin\views\style\Mapping::buildOptionsForm()

Provide a form to edit options for this plugin.

Overrides StylePluginBase::buildOptionsForm

File

core/modules/views/src/Plugin/views/style/Mapping.php, line 69

Class

Mapping
Allows fields to be mapped to specific use cases.

Namespace

Drupal\views\Plugin\views\style

Code

public function buildOptionsForm(&$form, FormStateInterface $form_state) {
  parent::buildOptionsForm($form, $form_state);

  // Get the mapping.
  $mapping = $this
    ->defineMapping();

  // Restrict the list of defaults to the mapping, in case they have changed.
  $options = array_intersect_key($this->options['mapping'], $mapping);

  // Get the labels of the fields added to this display.
  $field_labels = $this->displayHandler
    ->getFieldLabels();

  // Provide some default values.
  $defaults = [
    '#type' => 'select',
    '#required' => FALSE,
    '#multiple' => FALSE,
  ];

  // For each mapping, add a select element to the form.
  foreach ($options as $key => $value) {

    // If the field is optional, add a 'None' value to the top of the options.
    $field_options = [];
    $required = !empty($mapping[$key]['#required']);
    if (!$required && empty($mapping[$key]['#multiple'])) {
      $field_options = [
        '' => $this
          ->t('- None -'),
      ];
    }
    $field_options += $field_labels;

    // Optionally filter the available fields.
    if (isset($mapping[$key]['#filter'])) {
      $this->view
        ->initHandlers();
      $filter = $mapping[$key]['#filter'];
      $this::$filter($field_options);
      unset($mapping[$key]['#filter']);
    }

    // These values must always be set.
    $overrides = [
      '#options' => $field_options,
      '#default_value' => $options[$key],
    ];

    // Optionally allow the select to be toggleable.
    if (!empty($mapping[$key]['#toggle'])) {
      $form['mapping']["toggle_{$key}"] = [
        '#type' => 'checkbox',
        '#title' => $this
          ->t('Use a custom %field_name', [
          '%field_name' => strtolower($mapping[$key]['#title']),
        ]),
        '#default_value' => $this->options['mapping']["toggle_{$key}"],
      ];
      $overrides['#states']['visible'][':input[name="style_options[mapping][' . "toggle_{$key}" . ']"]'] = [
        'checked' => TRUE,
      ];
    }
    $form['mapping'][$key] = $overrides + $mapping[$key] + $defaults;
  }
}