Создание DisplayExtender плагина для Views

Пример создания простейшего Display Extender плагина для Views.

Шаг 1. Создаем класс плагина в src/Plugin/views/display_extender/ExampleDisplayExtender.php:

<?php

namespace Drupal\MODULENAME\Plugin\views\display_extender;

use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase;

/**
 * Example display extender plugin.
 *
 * @ViewsDisplayExtender(
 *   id = "example_display_extender",
 *   title = @Translation("Example display extender"),
 *   help = @Translation("Example display extender description."),
 *   no_ui = FALSE
 * )
 *
 * @ingroup views_display_extender_plugins
 */
class ExampleDisplayExtender extends DisplayExtenderPluginBase {

  /**
   * {@inheritDoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state): void {
    if ($form_state->get('section') !== 'example_display_extender') {
      return;
    }

    $form['#title'] .= $this->t('Example display extender');

    $form['enabled'] = [
      '#type' => 'checkbox',
      '#title' => $this->t('Enable'),
      '#default_value' => $this->options['enabled'],
      '#description' => $this->t('Check if you want to enable plugin.'),
    ];
  }

  /**
   * {@inheritDoc}
   */
  public function submitOptionsForm(&$form, FormStateInterface $form_state): void {
    if ($form_state->get('section') !== 'example_display_extender') {
      return;
    }

    $this->options['enabled'] = (bool) $form_state->getValue('enabled');
  }

  /**
   * {@inheritDoc}
   */
  public function optionsSummary(&$categories, &$options): void {
    $options['example_display_extender'] = [
      'category' => 'other',
      'title' => $this->t('Example display extender'),
      'value' => $this->options['enabled'] ? $this->t('Yes') : $this->t('No'),
    ];
  }

  /**
   * Checks if a plugin enabled.
   *
   * @return bool
   *   True if enabled, false otherwise.
   */
  public function isEnabled(): bool {
    return (bool) $this->options['enabled'];
  }

  /**
   * {@inheritDoc}
   */
  protected function defineOptions(): array {
    $options = parent::defineOptions();
    $options['enabled'] = ['default' => FALSE];

    return $options;
  }

}

Шаг 2. Создаем Configuration Schema для плагина в config/schema/MODULENAME.views.schema.yml:

views.display_extender.example_display_extender:
  type: views_display_extender
  mapping:
    enabled:
      label: 'Enable'
      type: boolean

Шаг 3. Имплементируем hook_install() и hook_uninstall() в MODULENAME.install:

<?php

/**
 * Implements hook_install().
 */
function MODULENAME_install() {
  $config = Drupal::service('config.factory')->getEditable('views.settings');

  $display_extenders = $config->get('display_extenders') ?: [];
  $display_extenders[] = 'example_display_extender';

  $config->set('display_extenders', $display_extenders);
  $config->save();
}

/**
 * Implements hook_uninstall().
 */
function MODULENAME_uninstall() {
  $config = Drupal::service('config.factory')->getEditable('views.settings');

  $display_extenders = $config->get('display_extenders') ?: [];
  $key = array_search('example_display_extender', $display_extenders, TRUE);

  if ($key !== FALSE) {
    unset($display_extenders[$key]);

    $config->set('display_extenders', $display_extenders);
    $config->save();
  }
}

Шаг 4. Применение:

<?php

use Drupal\MODULENAME\Plugin\views\display_extender\ExampleDisplayExtender;
use Drupal\views\ViewExecutable;

function _MODULENAME_example_function(ViewExecutable $view): void {
  $extenders = $view->getDisplay()->getExtenders();
  $extender = $extenders['example_display_extender'] ?? NULL;
  
  if (!$extender instanceof ExampleDisplayExtender || !$extender->isEnabled()) {
    return;
  }

  // Do something.
}
Benya