Пример создания простейшего 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.
}