Как написать собственный плагин Views в Drupal
Если поле в Views должно показывать вычисленное значение, а готовых полей не хватает, его можно добавить через собственный плагин. Показываем минимальный вариант для Drupal 10.3 и объясняем, как проверить его в интерфейсе.

В Drupal 10.3 собственный плагин поля Views позволяет вывести вычисленное значение рядом с полями сущности — например, короткую метку для каждой записи. Для этого понадобятся модуль, PHP-класс и пересборка кеша; результат можно проверить в интерфейсе Views. Ниже — один конкретный случай: плагин читает заголовок материала и показывает, заполнен ли он.
Что понадобится
- Drupal 10.3.x с установленным и включённым модулем Views. Пример рассчитан на контентные материалы, у которых есть поле заголовка.
- Доступ к файлам сайта и возможность включить свой модуль. Класс плагина должен лежать в каталоге этого модуля.
- Способ очистить кеш Drupal: Drush или административный интерфейс.
В примере используется система аннотаций плагинов Drupal 10.3. Это не универсальный шаблон для любого типа плагина: поля, фильтры, сортировки и форматы Views имеют разные базовые классы и методы.
Создаём плагин поля
Пусть модуль называется view_label. Создайте файл modules/custom/view_label/view_label.info.yml:
name: View label
type: module
description: Adds a computed field to Views.
core_version_requirement: ^10
package: Custom
В YAML перед type не должно быть лишнего пробела: корректное содержимое файла выглядит так:
name: View label
type: module
description: Adds a computed field to Views
core_version_requirement: ^10
package: Custom
Теперь добавьте класс modules/custom/view_label/src/Plugin/views/field/TitleStatus.php. Идентификатор в аннотации — title_status; именно по нему Views находит плагин.
<?php
namespace Drupal\view_label\Plugin\views\field;
use Drupal\views\Plugin\views\field\FieldPluginBase;
use Drupal\views\ResultRow;
/**
* Provides a computed title status field.
*
* @ViewsField("title_status")
*/
class TitleStatus extends FieldPluginBase {
/**
* {@inheritdoc}
*/
public function query() {
// Поле вычисляется из загруженной сущности, поэтому SQL-колонка не нужна.
}
/**
* {@inheritdoc}
*/
public function render(ResultRow $values) {
$entity = $values->_entity ?? NULL;
if (!$entity || !$entity->hasField('title')) {
return '';
}
return $entity->get('title')->isEmpty() ? 'Без заголовка' : 'Заголовок есть';
}
}
Пустой метод query() важен: обычный плагин поля Views ожидает, что запрос добавит колонку. Здесь значение вычисляется по сущности в строке результата, а отдельная колонка SQL не нужна. Код рассчитан на строки Views, где доступна сущность в ResultRow; на других базах данных или типах строк это допущение нужно проверить.
Обновляем кеш и добавляем поле
- Поместите файлы в указанные каталоги и включите модуль. Если модуль уже включён, заново включать его не нужно. Проверка: Drupal сообщает, что модуль активен, без ошибки разбора YAML.
- Пересоберите кеш. С Drush это обычно делают командой
drush cr; без Drush используйте страницу очистки кеша в административной части. Проверка: в журнале нет ошибки загрузки класса, а список полей Views обновился. - Откройте Views, редактируйте представление материалов и добавьте поле с названием, соответствующим плагину. Проверка: поле появляется в списке доступных полей; если нет, проверьте имя аннотации и расположение PHP-класса.
- Сохраните представление и посмотрите его предпросмотр на материалах с заголовком. Проверка: в строках отображается «Заголовок есть»; для записи с пустым заголовком — «Без заголовка».
В реальном представлении заголовок обычно обязателен. Поэтому пустое значение здесь скорее проверка поведения, чем типичная строка данных.
Почему не стоит начинать с другого типа плагина
Если задача — показать вычисленное значение в каждой строке, поле Views соответствует месту результата. Фильтр меняет состав строк, сортировка — их порядок, а формат определяет представление всего набора. У каждого типа своя логика; переносить класс поля в фильтр, заменив только имя аннотации, нельзя.
| Задача | Что расширять | Цена выбора |
|---|---|---|
| Добавить значение в строку результата | Плагин поля | Нужно учитывать, как Views загружает сущности и выводит результат. |
| Оставить в выдаче только подходящие строки | Плагин фильтра | Придётся встроить условие в запрос и проверить его на выбранной базе данных. |
| Изменить порядок строк | Плагин сортировки | Сортировка должна работать на уровне запроса, а не после вывода строк. |
| Изменить вид всего списка | Плагин формата | Нужно отвечать за отображение набора, а не одного поля. |
Выбирайте тип плагина по тому, что он меняет: значение строки, состав выдачи, порядок или внешний вид всего списка. Это определит, где именно должна выполняться логика.
Что проверить, если поле не работает
- Плагин не появился. Проверьте путь
src/Plugin/views/field, пространство имён и строку@ViewsField("title_status"). После изменений в коде очистите кеш. - Drupal показывает ошибку PHP. Убедитесь, что класс наследуется от
FieldPluginBase, а метод принимаетResultRow. Смотрите сообщение в журнале сайта: одной очистки кеша при синтаксической ошибке недостаточно. - В части строк результат пустой. Проверьте, доступна ли сущность в
$values->_entityи есть ли у неё полеtitle. Представления не всегда работают с тем же типом строк. - Поле выводится, но логика неверна. Сверьте, что View действительно показывает контентные материалы, а не другой тип сущностей. Для другого типа потребуется отдельная проверка данных и полей.
Границы примера и следующий шаг
Этот плагин не добавляет настройки в интерфейс и не участвует в фильтрации или сортировке. Если значение должно влиять на SQL-запрос, понадобится другой тип расширения Views. Если оно зависит от параметров, которые редактор задаёт в настройках поля, нужно отдельно реализовать и проверить форму конфигурации плагина.
После проверки на тестовых материалах посмотрите журнал Drupal и протестируйте View с пустым результатом, несколькими типами строк и реальным объёмом данных. Для нового плагина фильтра или сортировки сверяйте базовый класс и методы с API именно той версии Drupal, на которой работает сайт. Views — система Drupal для построения списков и запросов к содержимому через административный интерфейс.
Тест и проверочная: Быстрые ответы с объяснением, почему остальные варианты неверны
Спросить за 10 ₽Источники: Drupal API: FieldPluginBase, Drupal.org: Plugin API
Частые вопросы
Подойдёт ли этот код для Drupal 11?
Почему после добавления класса поле не видно в Views?
Можно ли этим же классом сделать фильтр?
Что делать, если $values->_entity пустой?
Нужно ли очищать кеш после каждого изменения?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.