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

13

Я пытаюсь встроить представление в определенный узел. Я нашел учебники для этого с Drupal 7 и PHP-шаблонами:

<?php print views_embed_view('view_name'); ?>

Но я ищу путь в Drupal 8 с шаблонами веток. Я попытался вызвать views_embed_view()функцию в hook_node_view()и назначить ее узлу, чтобы я мог распечатать ее в шаблоне ветки. Но кажется, что этот крюк никогда не вызывается.

Любые советы / решения, как это сделать в Drupal 8 способом?

TiMESPLiNTER
источник

Ответы:

19

Twig Views Embed

Этот модуль позволяет встраивать виды с помощью функции ветки.

{{ views_embed_view('view_name', 'view_id') }}

Вышеуказанный модуль был амортизирован в пользу

Twig Tweak

Модуль Twig Tweak предоставляет расширение Twig с некоторыми полезными функциями и фильтрами, которые могут улучшить опыт разработчика.

Пример: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

Вы можете найти view_machine_name здесь

Нет Sssweat
источник
@TiMESPLiNTER просто дает вам голову.
Нет Sssweat
С каких пор? Версия?
Вишал Кумар Саху
1
@VishalKumarSahu, так как мой ответ был опубликован 18 марта 16 года. Я думаю, что модуль все еще работает, просто он больше не поддерживается и не дорабатывается.
Нет Sssweat
Идеально идеально. Это прекрасно работает, и у меня есть хороший опыт с этим. Спасибо
Вишал Кумар Саху
Twig Tweak! Хороший модуль
Хариш ST
5

Вот как это работает для меня в подтеме Drupal 8 beta 12 Classy.

В файле your_theme.info.theme

function stjameskidsclub_preprocess_node(&$variables){
  $stuff  = views_embed_view('policy_documents', 'embed_1', 28);
  $variables["my_view"] = \Drupal::service('renderer')->renderRoot($stuff);
}  

Я скопировал node.html.twig и окружил теги статьи (или область, которую вы хотите заменить) блоком веток. Я поместил это в папку / template / content.

{% block replace_area %}
  <article{{ attributes.addClass(classes) }}>

    ...

  </article>  
{% endblock replace_area %}

Затем я создал узел - 2.html.twig (замените 2 нужным узлом) в папке / template / content со следующим кодом.

{% extends "node.html.twig" %}

{% block replace_page %}
  {{ my_view }}
{% endblock %}
Джордж
источник
4

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

Однако это довольно легко отключить, см. Settings.local.php.

Затем поместить вывод представления в $ build довольно просто и более или менее работает как в 7.x. Вместо использования функции встраивания рассмотрите возможность использования $ views = Views :: getView () и затем $ views-> buildRenderable ()

Два совета:

  • Сделайте ключ, который вы используете для $ build, доступным в качестве дополнительного поля в hook_entity_extra_field_info () , затем проверьте отображение, если компонент включен (посмотрите, как это делает user_user_view () . Это позволяет вам настроить вес / расположение представления в Пользовательский интерфейс, а также скрыть его в определенных режимах просмотра.
  • Если у вашего представления есть страница, то это немного сложнее, поскольку выходные данные узла кэшируются. Вам необходимо сообщить ключу кэша о пейджере, см. Пример для comment_entity_build_defaults_alter () (не для представления, но это ближайший пример, который имеет ядро).
Berdir
источник
Прежде всего, спасибо за этот отличный ответ. Ну я "включил" settings.local.phpи очистил все кеши. Но мой хук themename_node_view()по- themename.themeпрежнему не вызывается. Ты хоть представляешь, почему это может быть так?
TiMESPLiNTER
1
В файле settings.php есть фрагмент, который нужно раскомментировать (в конце). чтобы убедиться, что загружен файл settings.local.php, добавьте неверный PHP, что приведет к фатальной ошибке. если ваш сайт не выходит из строя, файл не загружается.
Бердир
2

Поскольку Бердир ссылался на View-> buildRenderable, это то, что вы ищете, но чтобы дать больше контекста в модуле, вам нужно сделать следующее.

//use core libraries
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

//use views class
use \Drupal\views\Views;

function hook_node_view(&$build, $node, $display, $view_mode){

 $thisView = Views::getView('view_name');

 $build['arbitrary_render_array_key_here'] = $thisView->buildRenderable('block_1',array($your_arguments));

}

Затем в шаблоне вашей страницы вы можете получить к нему доступ с помощью

{{ page.content.theme_name_content }}
ummdorian
источник
1
Все это был один лайнер в Drupal 7. Интересно.
WM
0

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

После создания блока вы можете назначить блок для отображения в нужной области содержимого (нижний колонтитул / заголовок / содержимое / и т. Д.). Назначьте его и нажмите «настроить». Вы должны быть в состоянии «Показать блок на определенных страницах». Выбор «Только перечисленные страницы» и добавление / node / your-node-number к спецификации страницы должно ограничить это представление / блок отображением только с желаемым узлом.

Ура!

Люк Реманн
источник
Спасибо за ваш ответ :-). Но тогда я должен создать область контента для каждого случая. Так что, если мне нравится иметь первый текст, то представление, а затем снова текст. Или, если мне нравится, чтобы сначала текст, а затем представление или сначала представление, а затем текст. Затем я должен создать 3 различных области содержимого, которые я отображаю в конкретном узле temapltes. Но views_embed_view()подход намного проще и чище, я думаю.
TiMESPLiNTER
0

Я знаю, что вы упомянули, что хотели бы использовать шаблоны веточек, но вы могли бы использовать модуль « Справочное поле видов », чтобы не копаться в шаблонах. Также дает преимущество возможности добавлять его к любому настраиваемому объекту, чтобы редакторы содержимого могли настраивать представление / вывод.

joekers
источник