Mapping.php 4.27 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
<?php

/**
 * @file
 * Definition of Drupal\views\Plugin\views\style\Mapping.
 */

namespace Drupal\views\Plugin\views\style;

/**
 * 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 function defineMapping() {
    return array();
  }

  /**
   * Overrides Drupal\views\Plugin\views\style\StylePluginBase::defineOptions().
   */
  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']) ? array() : '';
      $options['mapping']['contains'][$key] = array(
        'default' => isset($value['#default_value']) ? $value['#default_value'] : $default,
      );
      if (!empty($value['#toggle'])) {
        $options['mapping']['contains']["toggle_$key"] = array(
          'default' => FALSE,
          'bool' => TRUE,
        );
      }
    }

    return $options;
  }

  /**
   * Overrides Drupal\views\Plugin\views\style\StylePluginBase::buildOptionsForm().
   */
  public function buildOptionsForm(&$form, &$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->display->handler->getFieldLabels();

    // Provide some default values.
    $defaults = array(
      '#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 = array();
      $required = !empty($mapping[$key]['#required']);
      if (!$required && empty($mapping[$key]['#multiple'])) {
        $field_options = array('' => t('- None -'));
      }
      $field_options += $field_labels;

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

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

      // Optionally allow the select to be toggleable.
      if (!empty($mapping[$key]['#toggle'])) {
        $form['mapping']["toggle_$key"] = array(
          '#type' => 'checkbox',
          '#title' => t('Use a custom %field_name', array('%field_name' => strtolower($mapping[$key]['#title']))),
          '#default_value' => $this->options['mapping']["toggle_$key"],
        );
        $overrides['#states']['visible'][':input[name="style_options[mapping][' . "toggle_$key" . ']"]'] = array('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.
   */
  function render() {
    return theme($this->themeFunctions(), array(
      'view' => $this->view,
      'options' => $this->options,
      'rows' => $this->view->result,
      'mapping' => $this->defineMapping(),
    ));
  }

}