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
).