defineMapping() as $key => $value) { $default = !empty($value['#multiple']) ? [] : ''; $options['mapping']['contains'][$key] = [ 'default' => isset($value['#default_value']) ? $value['#default_value'] : $default, ]; if (!empty($value['#toggle'])) { $options['mapping']['contains']["toggle_$key"] = [ 'default' => FALSE, ]; } } return $options; } /** * {@inheritdoc} */ 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; } } /** * Overrides Drupal\views\Plugin\views\style\StylePluginBase::render(). * * Provides the mapping definition as an available variable. */ public function render() { return [ '#theme' => $this->themeFunctions(), '#view' => $this->view, '#options' => $this->options, '#rows' => $this->view->result, '#mapping' => $this->defineMapping(), ]; } }