Mapping.php

Same filename in this branch
  1. 11.x core/lib/Drupal/Core/Config/Schema/Mapping.php
Same filename and directory in other branches
  1. 9 core/modules/views/src/Plugin/views/style/Mapping.php
  2. 9 core/lib/Drupal/Core/Config/Schema/Mapping.php
  3. 8.9.x core/modules/views/src/Plugin/views/style/Mapping.php
  4. 8.9.x core/lib/Drupal/Core/Config/Schema/Mapping.php
  5. 10 core/modules/views/src/Plugin/views/style/Mapping.php
  6. 10 core/lib/Drupal/Core/Config/Schema/Mapping.php

Namespace

Drupal\views\Plugin\views\style

File

core/modules/views/src/Plugin/views/style/Mapping.php

View source
<?php

namespace Drupal\views\Plugin\views\style;

use Drupal\Core\Form\FormStateInterface;

/**
 * Allows fields to be mapped to specific use cases.
 *
 * @ingroup views_style_plugins
 */
abstract class Mapping extends StylePluginBase {
    
    /**
     * Do not use grouping.
     *
     * @var bool
     */
    protected $usesGrouping = FALSE;
    
    /**
     * Use fields without a row plugin.
     *
     * @var bool
     */
    protected $usesFields = TRUE;
    
    /**
     * Builds the list of field mappings.
     *
     * @return array
     *   An associative array, keyed by the field name, containing the following
     *   key-value pairs:
     *   - #title: The human-readable label for this field.
     *   - #default_value: The default value for this field. If not provided, an
     *     empty string will be used.
     *   - #description: A description of this field.
     *   - #required: Whether this field is required.
     *   - #filter: (optional) A method on the plugin to filter field options.
     *   - #toggle: (optional) If this select should be toggled by a checkbox.
     */
    protected abstract function defineMapping();
    
    /**
     * {@inheritdoc}
     */
    protected function defineOptions() {
        $options = parent::defineOptions();
        // Parse the mapping and add a default for each.
        foreach ($this->defineMapping() as $key => $value) {
            $default = !empty($value['#multiple']) ? [] : '';
            $options['mapping']['contains'][$key] = [
                'default' => $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(),
        ];
    }

}

Classes

Title Deprecated Summary
Mapping Allows fields to be mapped to specific use cases.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.