Как создавать псевдополя в Drupal с помощью 2 хуков
Что такое псевдополя?
В Drupal псевдополя — это поля, которые не хранят данные в базе данных, а динамически генерируют контент «на лету». Псевдополя позволяют конструкторам сайтов и разработчикам добавлять пользовательский контент к сущностям (таким как узлы, пользователи и термины таксономии) без необходимости создавать для этого отдельное поле.
Псевдополя во многих отношениях ведут себя как обычные поля. Однако вместо хранения данных в базе данных они используют функцию обратного вызова для генерации своего контента при просмотре сущности.
Как создавать псевдополя?
В Drupal 8, 9, 10
Используя hook_ENTITY_TYPE_view()
в сочетании с hook_entity_extra_field_info()
, вы можете определять пользовательские псевдополя и точно указывать, как они должны отображаться при отображении сущности.
В следующем примере мы добавим псевдополе к типу сущности «параграф», которое будет отображать кнопку «Поделиться в Google Classroom» везде, где используется этот параграф. Поле будет отображаться в разделе «Управление отображением» как поля, созданные в сущности.

Рецепт
Убедитесь, что вы добавили две следующие строки в начало файла.
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
В файле my_module.module
вашего пользовательского модуля определите псевдополе с помощью функции hook_entity_extra_field_info()
:
/**
* Реализует hook_entity_extra_field_info().
*/
function MY_MODULE_entity_extra_field_info() {
$display_fields = [];
$display_fields['paragraph']['google_classroom_button']['display']['google_classroom_button'] = [
'label' => t('Кнопка Google Classroom'),
'description' => t('Отображает кнопку Google Classroom'),
'weight' => 100,
'visible' => TRUE,
];
return $display_fields;
}
В этом примере мы определяем псевдополе с именем google_classroom_button
для типа сущности paragraph
и группы google_classroom_button.
Если вы хотите добавить поле к типу контента, вам следует заменить слово paragraph на node, а google_classroom_button — на имя вашего типа контента в приведенном выше коде.
/**
* Реализует hook_ENTITY_TYPE_view().
*/
function MY_MODULE_paragraph_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
if ($display->getComponent('google_classroom_button')) {
$currentUrl = Url::fromRoute('<current>',[] , ['absolute' => 'true'])->toString();
$output = '<script src="https://apis.google.com/js/platform.js" async defer></script>';
$output .= '<div class="g-sharetoclassroom" data-size="64" data-url="' . $currentUrl . '" ></div>';
$build['google_classroom_button'] = [
'#type' => 'markup',
'#markup' => $output,
'#allowed_tags' => ['script', 'div'],
];
}
}
Приведенный выше код проверяет, был ли компонент «google_classroom_button» добавлен в конфигурацию отображения сущности «Параграф». Если да, то он генерирует пользовательский вывод для псевдополя «google_classroom_button».
Сценарии использования псевдополей
- Отображение вычисляемых значений или агрегатов (например, количество комментариев к узлу)
- Встраивание контента из других источников (например, видео YouTube или лент социальных сетей)
- Отображение пользовательской разметки или HTML (например, списка связанных материалов)
Заключительные мысли
- Это быстрый способ получить дополнительную информацию в сущности без необходимости работать с шаблонами twig.
- Псевдополе не будет доступно при создании представления для сущности.