Назад к блогу

Как создавать псевдополя в Drupal с помощью 2 хуков

2023-03-043 мин

Что такое псевдополя?

В Drupal псевдополя — это поля, которые не хранят данные в базе данных, а динамически генерируют контент «на лету». Псевдополя позволяют конструкторам сайтов и разработчикам добавлять пользовательский контент к сущностям (таким как узлы, пользователи и термины таксономии) без необходимости создавать для этого отдельное поле.

Псевдополя во многих отношениях ведут себя как обычные поля. Однако вместо хранения данных в базе данных они используют функцию обратного вызова для генерации своего контента при просмотре сущности.

Как создавать псевдополя?

В Drupal 8, 9, 10

Используя hook_ENTITY_TYPE_view() в сочетании с hook_entity_extra_field_info(), вы можете определять пользовательские псевдополя и точно указывать, как они должны отображаться при отображении сущности.

В следующем примере мы добавим псевдополе к типу сущности «параграф», которое будет отображать кнопку «Поделиться в Google Classroom» везде, где используется этот параграф. Поле будет отображаться в разделе «Управление отображением» как поля, созданные в сущности.

Псевдополе Drupal появится в списке полей на вкладке «Управление отображением».

Рецепт

Убедитесь, что вы добавили две следующие строки в начало файла.

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.
  • Псевдополе не будет доступно при создании представления для сущности.

Категории: