You are here

class ViewsMergeRowsDisplayExtenderPlugin in Views Merge Rows 8.2

Provides interface to manage merge options on a per-field basis.

Plugin annotation


@ViewsDisplayExtender(
  id = "views_merge_rows",
  title = @Translation("Merge rows"),
  help = @Translation("Merges rows with the same values in the specified fields."),
  no_ui = FALSE
)

Hierarchy

Expanded class hierarchy of ViewsMergeRowsDisplayExtenderPlugin

File

src/Plugin/views/display_extender/ViewsMergeRowsDisplayExtenderPlugin.php, line 22

Namespace

Drupal\views_merge_rows\Plugin\views\display_extender
View source
class ViewsMergeRowsDisplayExtenderPlugin extends DisplayExtenderPluginBase {

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['merge_rows'] = [
      'default' => FALSE,
    ];
    $options['field_config'] = [
      'default' => [],
    ];
    return $options;
  }

  /**
   * {@inheritdoc}
   *
   * @phpstan-ignore-next-line
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) : void {
    if ($form_state
      ->get('section') != 'views_merge_rows') {
      return;
    }
    $form['#tree'] = TRUE;
    $form['#theme'] = 'merge_rows_theme';
    $form['#title'] .= $this
      ->t('Merge rows with the same content.');
    $form['warning_markup'] = [];
    if ($this->displayHandler
      ->usesPager()) {
      $form['warning_markup'] = [
        '#theme' => 'status_messages',
        '#message_list' => [
          'warning' => [
            $this
              ->t('It is highly recommended to disable pager if you merge rows.'),
          ],
        ],
      ];
    }
    $form['merge_rows'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Merge rows with the same content in the specified fields'),
      '#default_value' => $this->options['merge_rows'],
    ];

    // Create an array of allowed columns from the data we know:
    $field_names = $this->displayHandler
      ->getFieldLabels();
    foreach ($field_names as $field => $name) {

      // Markup for the field name.
      $form['field_config'][$field]['name'] = [
        '#markup' => $name,
      ];

      // Select for merge options.
      $form['field_config'][$field]['merge_option'] = [
        '#type' => 'select',
        '#options' => [
          'filter' => $this
            ->t('Use values of this field as a filter'),
          'merge' => $this
            ->t('Merge values of this field'),
          'merge_unique' => $this
            ->t('Merge unique values of this field'),
          'first_value' => $this
            ->t('Use the first value of this field'),
          'highest_value' => $this
            ->t('Use the highest value of this field'),
          'lowest_value' => $this
            ->t('Use the lowest value of this field'),
          'average' => $this
            ->t('Use the average value of this field'),
          'std_deviation' => $this
            ->t('Use the sample standard deviation of this field'),
          'sum' => $this
            ->t('Sum values of this field'),
          'count' => $this
            ->t('Count merged values of this field'),
          'count_unique' => $this
            ->t('Count merged unique values of this field'),
          'count_minus_count_unique' => $this
            ->t('Calculate the number of merged values minus the number of merged unique values of this field'),
        ],
        '#default_value' => $this->options['field_config'][$field]['merge_option'] ?? 'merge_unique',
      ];
      $form['field_config'][$field]['exclude_first'] = [
        '#type' => 'checkbox',
        '#title' => $this
          ->t('Exclude first option for @field_name', [
          '@field_name' => $name,
        ]),
        '#title_display' => 'invisible',
        '#default_value' => $this->options['field_config'][$field]['exclude_first'] ?? FALSE,
      ];
      $form['field_config'][$field]['prefix'] = [
        '#type' => 'textfield',
        '#title' => $this
          ->t('Prefix for @field_name', [
          '@field_name' => $name,
        ]),
        '#title_display' => 'invisible',
        '#size' => 10,
        '#default_value' => $this->options['field_config'][$field]['prefix'] ?? '',
      ];
      $form['field_config'][$field]['separator'] = [
        '#type' => 'textfield',
        '#title' => $this
          ->t('Separator for @field_name', [
          '@field_name' => $name,
        ]),
        '#title_display' => 'invisible',
        '#size' => 10,
        '#default_value' => $this->options['field_config'][$field]['separator'] ?? ', ',
      ];
      $form['field_config'][$field]['suffix'] = [
        '#type' => 'textfield',
        '#title' => $this
          ->t('Suffix for @field_name', [
          '@field_name' => $name,
        ]),
        '#title_display' => 'invisible',
        '#size' => 10,
        '#default_value' => $this->options['field_config'][$field]['suffix'] ?? '',
      ];
    }
    $form['merge_options_description_title'] = [
      '#type' => 'html_tag',
      '#tag' => 'h2',
      '#value' => $this
        ->t('Merge options details'),
    ];
    $form['merge_options_description'] = [
      '#theme' => 'table',
      '#header' => [
        $this
          ->t('Option'),
        $this
          ->t('Description'),
      ],
      '#rows' => [
        [
          $this
            ->t('Use values of this field as a filter'),
          $this
            ->t('Checks which rows should be merged. If several rows contain exactly the same values in all of these fields, they are merged together.'),
        ],
        [
          $this
            ->t('Merge values of this field'),
          $this
            ->t('All the values appears in the resulting row.'),
        ],
        [
          $this
            ->t('Merge unique values of this field'),
          $this
            ->t('The resulting row will contain unique values from the merged rows.'),
        ],
        [
          $this
            ->t('Use the first value of this field'),
          $this
            ->t('Only the value from the first merged rows is used. The values in other rows are disregarded.'),
        ],
        [
          $this
            ->t('Use the highest value of this field'),
          $this
            ->t('The resulting row will contain the highest numerical value from the merged rows.'),
        ],
        [
          $this
            ->t('Use the lowest value of this field'),
          $this
            ->t('The resulting row will contain the highest numerical value from the merged rows.'),
        ],
        [
          $this
            ->t('Use the average value of this field'),
          $this
            ->t('The resulting row will contain the average value from the merged rows.'),
        ],
        [
          $this
            ->t('Use the sample standard deviation of this field'),
          $this
            ->t('The resulting row will contain the sample standard deviation value from the merged rows.'),
        ],
        [
          $this
            ->t('Sum values of this field'),
          $this
            ->t('The resulting row will contain the sum of values from the merged rows.'),
        ],
        [
          $this
            ->t('Count merged values of this field'),
          $this
            ->t('The resulting row will contain the counter of the merged rows.'),
        ],
        [
          $this
            ->t('Count merged unique values of this field'),
          $this
            ->t('The resulting row will contain the counter of the merged unique values.'),
        ],
        [
          $this
            ->t('Calculate the number of merged values minus the number of merged unique values of this field'),
          $this
            ->t('The resulting row will contain the difference between counter of the merged values and the counter of the merged unique values.'),
        ],
      ],
    ];
  }

  /**
   * {@inheritdoc}
   *
   * @phpstan-ignore-next-line
   */
  public function submitOptionsForm(&$form, FormStateInterface $form_state) : void {
    if ($form_state
      ->get('section') != 'views_merge_rows') {
      return;
    }
    foreach ($form_state
      ->getValue('options') as $option => $value) {
      $this->options[$option] = $value;
    }
  }

  /**
   * {@inheritdoc}
   *
   * @phpstan-ignore-next-line
   */
  public function optionsSummary(&$categories, &$options) : void {
    if (!$this->displayHandler
      ->usesFields()) {
      return;
    }
    $options['views_merge_rows'] = [
      'category' => 'other',
      'title' => $this
        ->t('Merge rows'),
      'value' => $this->options['merge_rows'] ? $this
        ->t('Yes') : $this
        ->t('No'),
      'desc' => $this
        ->t('Allow merging rows with the same content in the specified fields.'),
    ];
  }

  /**
   * Returns configuration for row merging.
   *
   * Only returns the configuration for the fields present in the view. In case
   * configuration still has some entries about removed fields.
   *
   * If a new field was added to the view, the default configuration for this
   * field is returned.
   *
   * Impossible to provide default field values for fields in ::defineOptions()
   * because displayHandler property is not available at this moment.
   *
   * @return array
   *   Configuration for row merging.
   */
  public function getOptions() : array {
    $options = [
      'merge_rows' => FALSE,
      'field_config' => [],
    ];
    if ($this->displayHandler
      ->usesFields()) {
      $options['merge_rows'] = $this->options['merge_rows'];
      $field_default_options = [
        'merge_option' => 'merge_unique',
        'exclude_first' => FALSE,
        'prefix' => '',
        'separator' => ', ',
        'suffix' => '',
      ];
      $fields = $this->displayHandler
        ->getOption('fields');
      foreach (array_keys($fields) as $field) {
        $options['field_config'][$field] = $field_default_options;
        if (isset($this->options['field_config'][$field])) {
          $options['field_config'][$field] = $this->options['field_config'][$field] + $field_default_options;
        }
      }
    }
    return $options;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DisplayExtenderPluginBase::defaultableSections public function Static member function to list which sections are defaultable and what items each section contains. 1
DisplayExtenderPluginBase::defineOptionsAlter public function Provide a form to edit options for this plugin.
DisplayExtenderPluginBase::preExecute public function Set up any variables on the view prior to execution. 1
DisplayExtenderPluginBase::query public function Inject anything into the query that the display_extender handler needs. Overrides PluginBase::query 1
DisplayExtenderPluginBase::validateOptionsForm public function Validate the options form. Overrides PluginBase::validateOptionsForm
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$definition public property Plugins's definition
PluginBase::$displayHandler public property The display object this plugin is for.
PluginBase::$options public property Options for this plugin will be held here.
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::$renderer protected property Stores the render API renderer. 3
PluginBase::$usesOptions protected property Denotes whether the plugin has an additional options form. 8
PluginBase::$view public property The top object of a view. 1
PluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 14
PluginBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 62
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::destroy public function Clears a plugin. Overrides ViewsPluginInterface::destroy 2
PluginBase::doFilterByDefinedOptions protected function Do the work to filter out stored options depending on the defined options.
PluginBase::filterByDefinedOptions public function Filter out stored options depending on the defined options. Overrides ViewsPluginInterface::filterByDefinedOptions
PluginBase::getAvailableGlobalTokens public function Returns an array of available token replacements. Overrides ViewsPluginInterface::getAvailableGlobalTokens
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::getProvider public function Returns the plugin provider. Overrides ViewsPluginInterface::getProvider
PluginBase::getRenderer protected function Returns the render API renderer. 1
PluginBase::globalTokenForm public function Adds elements for available core tokens to a form. Overrides ViewsPluginInterface::globalTokenForm
PluginBase::globalTokenReplace public function Returns a string with any core tokens replaced. Overrides ViewsPluginInterface::globalTokenReplace
PluginBase::INCLUDE_ENTITY constant Include entity row languages when listing languages.
PluginBase::INCLUDE_NEGOTIATED constant Include negotiated languages when listing languages.
PluginBase::init public function Initialize the plugin. Overrides ViewsPluginInterface::init 8
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginBase::listLanguages protected function Makes an array of languages, optionally including special languages.
PluginBase::pluginTitle public function Return the human readable name of the display. Overrides ViewsPluginInterface::pluginTitle
PluginBase::preRenderAddFieldsetMarkup public static function Moves form elements into fieldsets for presentation purposes. Overrides ViewsPluginInterface::preRenderAddFieldsetMarkup
PluginBase::preRenderFlattenData public static function Flattens the structure of form elements. Overrides ViewsPluginInterface::preRenderFlattenData
PluginBase::queryLanguageSubstitutions public static function Returns substitutions for Views queries for languages.
PluginBase::setOptionDefaults protected function Fills up the options of the plugin with defaults.
PluginBase::summaryTitle public function Returns the summary of the settings in the display. Overrides ViewsPluginInterface::summaryTitle 6
PluginBase::themeFunctions public function Provide a full list of possible theme templates used by this style. Overrides ViewsPluginInterface::themeFunctions 1
PluginBase::trustedCallbacks public static function Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface::trustedCallbacks 6
PluginBase::unpackOptions public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away. Overrides ViewsPluginInterface::unpackOptions
PluginBase::usesOptions public function Returns the usesOptions property. Overrides ViewsPluginInterface::usesOptions 8
PluginBase::validate public function Validate that the plugin is correct and can be saved. Overrides ViewsPluginInterface::validate 6
PluginBase::viewsTokenReplace protected function Replaces Views' tokens in a given string. The resulting string will be sanitized with Xss::filterAdmin. 1
PluginBase::VIEWS_QUERY_LANGUAGE_SITE_DEFAULT constant Query string to indicate the site default language.
PluginBase::__construct public function Constructs a PluginBase object. Overrides PluginBase::__construct
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TrustedCallbackInterface::THROW_EXCEPTION constant Untrusted callbacks throw exceptions.
TrustedCallbackInterface::TRIGGER_SILENCED_DEPRECATION constant Untrusted callbacks trigger silenced E_USER_DEPRECATION errors.
TrustedCallbackInterface::TRIGGER_WARNING constant Untrusted callbacks trigger E_USER_WARNING errors.
ViewsMergeRowsDisplayExtenderPlugin::buildOptionsForm public function @phpstan-ignore-next-line Overrides DisplayExtenderPluginBase::buildOptionsForm
ViewsMergeRowsDisplayExtenderPlugin::defineOptions protected function Information about options for all kinds of purposes will be held here. Overrides PluginBase::defineOptions
ViewsMergeRowsDisplayExtenderPlugin::getOptions public function Returns configuration for row merging.
ViewsMergeRowsDisplayExtenderPlugin::optionsSummary public function @phpstan-ignore-next-line Overrides DisplayExtenderPluginBase::optionsSummary
ViewsMergeRowsDisplayExtenderPlugin::submitOptionsForm public function @phpstan-ignore-next-line Overrides DisplayExtenderPluginBase::submitOptionsForm