Рейтинг:0

Изменить объект абзаца для рендеринга

флаг mx

У меня есть тип абзаца с полем ссылки на узел, которое, если вы оставите его пустым, должно отображать случайный узел с использованием определенной логики.

У меня есть код для выполнения запроса и получения узла, и в идеале я хотел бы поместить его в объект абзаца в какой-то хук перед рендерингом, чтобы абзац мог нормально отображаться, используя его обычную конфигурацию. Что-то вроде этого (предупреждение: псевдокод):

функция mymodule_paragraph_view($build, $paragraph, $display, $view_mode) {
  если (!is_my_paragraph_type($paragraph)) вернуть;

  если (!$paragraph->field_mynoderef->isEmpty()) return;

  $узел = getRandomNode();
  $paragraph->set('field_mynoderef', $node);
}

Это правильная установка значения, но кажется, что в процессе рендеринга уже слишком поздно, чтобы он мог повлиять на визуализированный вывод (т. Е. На самом деле он не показывает узел). Я также пытался сделать это на $сборка['#абзац'] объект, содержащий тот же абзац, с аналогичными результатами. Как я могу заставить это работать?

БОНУС: как сделать так, чтобы вывод кэшировался с использованием конфигурации, основанной на времени (например, истечение срока действия через 60 секунд, чтобы каждую минуту он показывал другой узел и не запускал логику запроса при каждом запросе).

Рейтинг:0
флаг de

Вам нужно встроить загруженный узел в массив для рендеринга и добавить его в $сборка множество.

$узел = getRandomNode();

$entity_type = $node->getEntityTypeId();
$view_mode = 'тизер';
$view_builder = \Drupal::entityTypeManager()->getViewBuilder($entity_type);
$storage = \Drupal::entityTypeManager()->getStorage($entity_type);
$build['field_mynoderef'] = $view_builder->view($node, $view_mode);

Ваш вопрос по кэшированию не относится к этой теме и должен быть выделен в отдельный вопрос. Drupal Answers — это сайт вопросов и ответов с форматом один вопрос к одному ответу, и добавление ответа на этот вопрос разбавило бы эту тему.

флаг mx
Что делать, если я хочу повторно использовать конфигурацию отображения абзаца? (может быть, я прошу слишком многого, но кажется, что это должно быть возможно). Вот почему я хотел изменить сам объект абзаца, а не играть с массивами рендеринга для фактического узла. Идея состоит в том, чтобы иметь возможность забыть об этом коде на случай, если конфигурация отображения абзаца когда-либо изменится (например, режим просмотра для узла).
флаг mx
Кроме того, подходит ли для этого hook_paragraph_view? Потому что есть еще hook_paragraph_view_alter и, конечно же, hook_preprocess_paragraph (последний из которых, я думаю, явно запоздал).
Jaypan avatar
флаг de
Я бы использовал для этого `hook_paragraph_view_alter()`. И вы должны создать новый режим просмотра для этого дисплея и назначить поля этому режиму просмотра. Затем используйте этот режим просмотра вместо «тизера», и вам не придется беспокоиться о том, что кто-то изменит отображение, так как он будет использоваться только для этого просмотра.

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

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