Drupal 8/9 Override twig с настраиваемым модулем

Я перепробовал все, что нашел, для изменения поля views_view_field, начиная с официальных документов. Я также пробовал несколько способов и параметров для хуков HOOK_theme (с параметрами 'path', 'base hook' и без них) и HOOK_theme_registry_alter, но я все еще не могу заставить ветку в моем модуле переопределить оригинал.

Чтобы упростить задачу, я тестирую без какой-либо настраиваемой темы, без каких-либо папок в /templates, а представление, которое я пытаюсь изменить, связано на страницах администратора. Предложения по ветке поясняют, что отображаемая ветка является "стабильной" темой.

2 ответа

Шаблон в теме имеет приоритет над шаблоном в вашем модуле, поэтому вам нужно будет реализовать HOOK_theme_registry_alter чтобы заставить Drupal получить шаблон из папки вашего модуля.

/**
 * Implements hook_theme_registry_alter().
 */
function mymodule_theme_registry_alter(&$theme_registry) {
  // Replace the path to the registered template so that Drupal looks for
  // it in your module's templates folder.
  $theme_registry['views_view_field']['path'] = drupal_get_path('module', 'mymodule') . '/templates';
}

Убедитесь, что вы очистили кеш, чтобы обновить реестр тем.

Для Drupal 9.3.0 и выше: Drupal_get_path() и drupal_get_filename() устарели в Drupal 9.3.0 и полностью удалены в Drupal 10.0.0.

Вот рабочий пример для более новых версий:

      /**
 * Implements hook_theme_registry_alter().
 */
function mycustommodule_theme_registry_alter(&$theme_registry) {
  // Override an existing Twig template file with the one provided by my custom module
  $theme_registry['views_view_field']['path'] = \Drupal::service('extension.list.module')->getPath('mycustommodule') . '/tpl';
}

Поместите файл шаблона Twig в папку шаблонов вашего пользовательского модуля (в данном случае:/mycustommodule/tpl).

Другие вопросы по тегам