Рейтинг:0

Укажите тему при создании контента/импорте контента через каналы

флаг cn

Я хочу, чтобы весь контент создавался с использованием моей основной темы сайта. Я хочу сделать это, потому что я использую рендерер в MYMODULE_node_presave() как это:

функция MYMODULE_node_presave (NodeInterface $ node) {
  $renderer = \Drupal::service('renderer');

  $content_type = $node->getType();
  если ($content_type == 'страница') {
    $viewmode_render = $node->get('field_text_main_to_render')
      -> представление ('рендеринг_выход');
    $processed_display = $renderer->renderPlain($viewmode_render);
    $node->set('field_text_main_display', "$processed_display");
    $node->field_text_main_display->format = 'обработано';
}

Мой сайт использует Bartik в качестве основной темы и Seven в качестве темы администратора.

В настройках внешнего вида (/admin/appearance) я проверил предпочтение Используйте тему администрирования при редактировании или создании контента. Это гарантирует, что узлы отображаются в Bartik при создании в пользовательском интерфейсе.

Однако, когда я повторно сохраняю узлы на /админ/контент, ноды пересохраняются с помощью Seven, вместо Bartik. Поэтому я добавил Тема Negotiator:

/**
 * Выберите правильную тему для различных маршрутов.
 */
класс ThemeNegotiator реализует ThemeNegotiatorInterface {

  /**
   * {@inheritDoc}
   */
  применяется публичная функция (RouteMatchInterface $route_match) {
    вернуть $this->negotiateRoute($route_match)? ИСТИНА: ЛОЖЬ;
  }

  /**
   * {@inheritDoc}
   */
  общедоступная функция defineActiveTheme (RouteMatchInterface $ route_match) {
    вернуть $this->negotiateRoute($route_match) ?: NULL;
  }

  /**
   * Выберите тему для особых случаев.
   *
   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
   * Текущий маршрут.
   *
   * @return bool|строка
   * Имя темы для использования (строка) или ложь (bool).
   */
  частная функция переговоров по маршруту (RouteMatchInterface $ route_match) {
    $route_name = $route_match->getRouteName();
    // Страница содержимого администратора должна использовать тему рендеринга узла.
    // Почему: Действие "Сохранить контент" будет использовать тему этой страницы.
    если ($ route_name === 'system.admin_content') {
      вернуть «бартик»;
    }
    еще {
      вернуть ЛОЖЬ;
    }
  }

}

Теперь, когда я запускаю массовое повторное сохранение узла на /админ/контент, узлы корректно отображаются с помощью Bartik.

Далее я установил Фиды модуль. Теперь, когда я импортирую узлы через CSV с помощью Feeds, они отображаются с помощью Seven, а не Bartik. Я хочу, чтобы эти узлы также отображались с помощью Bartik, но я не знаю, как это сделать. (Например, если бы был способ использовать договоритьсяМаршрут в Тема Negotiator, это было бы хорошо, но я не знаю, как это настроить.) Есть идеи?

4uk4 avatar
флаг cn
Я бы использовал переговорщика темы в подзапросе, где контроллер возвращает ответ с визуализированным узлом. Посмотрите это как пример того, как сделать подзапрос, а также как избежать основной ошибки: https://drupal.stackexchange.com/questions/303396/making-an-http-subrequest-causes-currentroutematch-to-have- неправильный маршрут
Рейтинг:0
флаг de

Контент может отображаться в любой теме и в любой момент времени отображается в текущей теме. Вы не сохраняете контент как относящийся к теме. Скорее, если вы хотите, чтобы разные темы отображали контент, вы можете попробовать Модуль «Переключить тему страницы».

флаг cn
«Вы не сохраняете контент как принадлежащий теме». Да в общем так и есть. Но, как указано в моем вопросе, я использую `hook_node_presave()` для рендеринга некоторых полей и сохранения обработанного вывода, то есть сохранения содержимого как принадлежащего определенной теме. Поэтому мне нужно контролировать, какая тема используется для рендеринга контента для этого конкретного сохранения контента.
Jaypan avatar
флаг de
Эти элементы будут отображаться в текущей теме во время рендеринга. В вашем случае это, вероятно, путь, по которому происходит импорт, поэтому вы можете использовать вышеуказанный модуль, чтобы установить тему для пути канала. Тем не менее, сохранение отображаемого HTML-кода не кажется отличным архитектурным решением — что, если вы захотите изменить свою тему в будущем или выполнить поиск в этом поле. Обычно вам нужно хранить данные и выполнять визуализацию на выходе, кэшируя визуализированный вывод, если это дорогостоящая сборка. Лично я предпочел бы архитектурную реструктуризацию манипулированию темой.

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

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