Рейтинг:-1

Как я могу переопределить отображаемый узел содержимым, отображаемым пользовательским модулем?

флаг de

У меня есть путь/приложение, которое отображается с помощью пользовательского модуля (через комбинацию хука темы/контроллера/маршрутизации/ветки). По сути, это мини-приложение.

У меня также есть узел Drupal /data, который является узлом Drupal с содержимым, загруженным Drupal.

Однако мне нужно загрузить содержимое /application в /data. Я попытался настроить маршрутизацию своего пользовательского модуля на использование /data вместо /application, но Drupal по-прежнему загружает содержимое узла Drupal в /data, а не содержимое пользовательского модуля. Загвоздка в том, что это конкретное приложение использует поля из этого узла, поэтому я не хочу удалять этот узел.Я просто хочу изменить то, что отображается при просмотре узла, но оставить его активным и редактируемым.

Как лучше всего это сделать?

Hodba Khalaf avatar
флаг eg
Чтобы загрузить переменные до того, как узел будет отрендерен, вам нужно использовать HOOK_preprocess_node, вы пробовали это?
флаг cn
Измените путь к узлу на другой, отличный от /data. Проблема решена.
Anton avatar
флаг de
@Clive В идеале я не меняю путь к узлу, потому что хочу сохранить, где узел используется в меню. Нет ли способа переопределить представление узла с помощью пользовательского модуля?
Anton avatar
флаг de
@HodbaKhalaf Я пробовал это, но не вижу способа загрузить все из пользовательского модуля в средство просмотра узлов. Любая идея, как это можно сделать?
apaderno avatar
флаг us
Drupal сначала использует псевдонимы путей, а затем маршруты, определенные из модулей. Если вы добавите узел с /admin/config/people/accounts в качестве псевдонима пути, вы больше не увидите страницу настроек для учетных записей.
Hodba Khalaf avatar
флаг eg
@Anton в препроцессоре вы можете удалить содержимое и установить свои значения, сгенерированные в пользовательском модуле, например. $variables['VARIABLE_NAME'], тогда вы можете создать тему с помощью файла twig.если вы можете поделиться кодом, возможно, я смогу дать вам лучший отзыв.
Рейтинг:1
флаг us

Поскольку /data является псевдонимом пути для узла, Drupal показывает этот узел вместо того, чтобы показывать, что возвращает контроллер, связанный с этим путем. Если бы вы установили псевдоним пути к узлу /admin/config/people/accounts, Drupal отобразил бы этот узел вместо страницы настройки учетных записей.

Если вы хотите изменить массив рендеринга, используемый для узла, вам необходимо реализовать крючок_ENTITY_TYPE_view(). Вы можете сравнить $ сущность-> идентификатор () с идентификатором узла, к которому вы хотите добавить данные в его массив рендеринга.

используйте \Drupal\Core\Entity\EntityInterface;
используйте \Drupal\Core\Entity\Display\EntityViewDisplayInterface;

/**
 * Реализует hook_ENTITY_TYPE_view().
 */
function mymodule_node_view (массив и $ build, EntityInterface $ Entity, EntityViewDisplayInterface $ display, $ view_mode) {
  если ($entity->id() == 3) {
    // Изменить $сборка.
  }
}

Вы также можете найти идентификатор узла по его псевдониму пути, например, с помощью кода, подобного следующему.

используйте \Drupal\Core\Entity\EntityInterface;
используйте \Drupal\Core\Entity\Display\EntityViewDisplayInterface;

/**
 * Реализует hook_ENTITY_TYPE_view().
 */
function mymodule_node_view (массив и $ build, EntityInterface $ Entity, EntityViewDisplayInterface $ display, $ view_mode) {
  $path = \Drupal::service('path_alias.manager')->getPathByAlias('/data');

  если (preg_match('/узел\/(\d+)/', $path, $matches)) {
    если ($entity->id() == $matches[1]) {
      // Изменить $сборка.
    }
  }
}

Видеть Как я могу получить идентификатор узла из псевдонима пути? который также объясняет, когда использовать path_alias.manager или path.alias_manager оказание услуг.

Anton avatar
флаг de
Отличная идея! Вместо этого я смог загрузить содержимое своего пользовательского модуля, добавив в $build. У меня есть один вопрос по этому поводу: внутри hook_ENTITY_TYPE_view() вместо использования $entity->id() есть ли какой-нибудь элегантный способ использовать пользовательский модуль routing.yml для динамического получения и вызова соответствующего метода контроллера? В противном случае я жестко кодирую идентификаторы, которые выглядят так же, как просто создание переопределения типа «node--3.html.twig», а также жестко кодирую, из какого контроллера и метода загружать контент.
apaderno avatar
флаг us
Вы можете получить идентификатор узла с учетом псевдонима пути, как я показываю в обновленном ответе. Код по-прежнему жестко задает значение (псевдоним пути), но проще установить один и тот же псевдоним пути на разных сайтах, чем получать один и тот же идентификатор узла для узлов на разных сайтах.

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

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