Это определенно потому, что ваша тема администратора активна, когда вы выполняете рендеринг.
Не существует прямого и простого способа переключить тему в середине запроса, и вы, вероятно, столкнетесь с дальнейшими проблемами.
Я бы рассмотрел другие варианты, т.е. создание разметки узлов с помощью обратного вызова меню, использующего тему внешнего интерфейса, либо непосредственно в вашем hook_entity_postsave
или, например, в задании cron.
Если вы все еще хотите попробовать это, переключив темы, вот как это сработало для меня сейчас, после того, как я немного возился с кодом из https://stackoverflow.com/a/56358189/368479 и заимствование кода из drupal_theme_initialize().
Наиболее заметным изменением является очистка кеша в конце функции переключения. С точки зрения производительности это ужасно, но я не мог заставить его работать без него.
/**
* Переключение на альтернативную тему или с нее в середине запроса.
*
* Это полезно, если вам нужно отобразить что-то (например, узел) в другом
* тема без изменения темы всей страницы. Пример использования:
* когда вам нужно отрендерить что-то для внешнего пользователя со страницы администратора.
*
* Пример использования:
* my_module_switch_theme('бартик');
* $узел = node_load(1);
* $renderable = node_view($node);
* $рендеринг = рендеринг($рендеринг);
* my_module_switch_theme();
*
* @param string|null $to
* Название темы для переключения. Если NULL, он переключается обратно на
* оригинальная тема.
*/
функция my_module_switch_theme (строка $ to = NULL) {
глобальная $theme, $theme_key;
// Резервное копирование оригинальной темы.
статическая $original_theme;
если (пусто($original_theme)) {
$original_theme = $тема;
}
// Выполнить переключение.
$тема = $к ?? $оригинальная_тема;
$theme_key = $тема;
// Находим все темы наших предков и помещаем их в массив.
$темы = list_themes();
$base_theme = массив();
$ предок = $ тема;
в то время как ($ancestor && isset($themes[$ancestor]->base_theme)) {
$ancestor = $themes[$ancestor]->base_theme;
$base_theme[] = $themes[$ancestor];
}
_drupal_theme_initialize($themes[$theme], array_reverse($base_theme));
// Темы могут иметь функции изменения, поэтому сбросьте кеш drupal_alter().
drupal_static_reset('drupal_alter');
// Очистить кеш.
drupal_flush_all_caches();
}
Обратите внимание, что это может не сработать, если вы реализуете hook_custom_theme для страницы, на которой происходит действие, но если вы используете тему администратора, я думаю, это не так.
Затем приведенный выше код можно использовать, как в следующем примере, и он правильно использует узел.tpl.php
из темы bartik вместо той, которую использует текущая тема, по крайней мере, в моей тестовой настройке.
my_module_switch_theme('бартик');
$узел = node_load(1);
$renderable = node_view($node);
$ рендеринг = рендеринг ($ рендеринг);
my_module_switch_theme();