Рейтинг:0

Как получить визуализированный узел в соответствии с активной темой?

флаг jp

В hook_entity_postsave() в моем пользовательском модуле D7, я делаю следующее, когда узел сохраняется:

$_ = node_view($entity, 'полный');   
$html = drupal_render($_);         

Но визуализированный HTML, похоже, пропускает шаблоны активной темы. например включив отладку темы, я получаю

 РЕКОМЕНДУЕМЫЕ НАЗВАНИЯ ФАЙЛА:
   * абзацы-элементы--поля-разделы--full.tpl.php
   * абзацы-элементы--field-sections.tpl.php
   x параграфы-items.tpl.php

Пока что абзацы-элементы--поля-разделы--full.tpl.php определяется в активной теме сайта (и правильно используется при представлении обычных узловых страниц).

РЕДАКТИРОВАТЬ: я думаю, это может быть потому, что тема администратора активна, когда этот код запускается? Есть ли способ переключить это?

Рейтинг:1
флаг bd

Это определенно потому, что ваша тема администратора активна, когда вы выполняете рендеринг.

Не существует прямого и простого способа переключить тему в середине запроса, и вы, вероятно, столкнетесь с дальнейшими проблемами.

Я бы рассмотрел другие варианты, т.е. создание разметки узлов с помощью обратного вызова меню, использующего тему внешнего интерфейса, либо непосредственно в вашем 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();
флаг jp
Спасибо, я пробовал это, но это не работает. Я также пробовал более полную версию на https://stackoverflow.com/a/20476484/623519.Просто не подхватываются шаблоны из темы :-(
berliner avatar
флаг bd
@artfulrobot Вы правы. Также нет глобальной переменной `$custom_theme`. Меня ввело в заблуждение то, что я видел и не проверял. Я обновил свой ответ сейчас. Я настоятельно рекомендую сделать рендеринг позже, если это возможно. Переключение тем во время активного запроса легко приведет к неприятностям.
флаг jp
Спасибо! оно работает! Я обнаружил прирост производительности: замените `drupal_flush_all_caches()` на `system_rebuild_theme_data(); drupal_theme_rebuild();`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.