Як вставити представлення у конкретний вузол?


13

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

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

Але я шукаю шлях у Drupal 8 із гілочками-шаблонами. Я спробував викликати views_embed_view()функцію в hook_node_view()і призначити її на вузол, щоб я міг роздрукувати її в twig-Template. Але, схоже, цей гачок ніколи не називається.

Будь-які підказки / рішення, як це зробити способом Drupal 8?

Відповіді:


19

Вставити гілочки

Цей модуль дозволяє вбудовувати подання за допомогою функції гілочки.

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

Наведений вище модуль був амортизований на користь

Підкручувати гілочку

Модуль Twig Tweak пропонує розширення Twig з деякими корисними функціями та фільтрами, які можуть покращити досвід розробника.

Наприклад: <dd>{{ drupal_view('view_name', 'view_machine_name') }}</dd>

Ви можете знайти view_machine_name тут


@TiMESPLiNTER просто піднімає голову.
Без зачистки

Відколи? Версія?
Вішал Кумар Саху

1
@VishalKumarSahu, оскільки моя відповідь була опублікована, 18 березня 1616 року. Я думаю, що модуль все ще працює, це просто те, що він більше не підтримується і не розробляється.
Без розмивання

Ідеально ідеально. Це чудово працює, і я маю з цим хороший досвід. Спасибі
Вішал Кумар Саху

Накручуйте гілочку! Хороший модуль
Harish ST

5

Ось так це працювало для мене в підтемі «Класик» Drupal 8 beta 12.

У файлі 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

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

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

Тоді, розмістити результат подання в $ build досить просто і більш-менш працює, як у 7.x. Замість використання функції вбудовування розглянемо використання $ views = Views :: getView (), а потім $ views-> buildRenderable ()

Дві поради:

  • Зробіть ключ, який ви використовуєте для $ build, доступним у якості додаткового поля в гачку_entity_extra_field_info () , а потім перевірте, чи компонент увімкнено (див., Як користувач користується користувачем_view () це робить. Це дозволяє вам налаштувати вагу / розміщення представлення даних у Користувальницький інтерфейс, а також приховати його в певних режимах перегляду.
  • Якщо у вашому перегляді є сторінка, то це дещо складніше, оскільки керований вихід вузла кешується. Тоді потрібно додати ключ кешу до відома пейджера, для прикладу дивіться comment_entity_build_defaults_alter () (не перегляд, але це найближчий приклад, який має ядро).

Перш за все це за цю чудову відповідь. Ну я "включив" settings.local.phpі очистив усі кеші. Але мій гак themename_node_view()в themename.themeще отримує не називається. Чи маєте ви ідею, чому це могло бути так?
TiMESPLiNTER

1
У налаштуваннях.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 }}

1
Все це було одним лайнером у Drupal 7. Цікаво.
WM

0

У межах представлень ви можете створити блок із відповідними даними.

Після створення блоку ви можете призначити блоку відображення у бажаній області вмісту (колонтитул / заголовок / контент / тощо). Призначте це, а потім натисніть "Налаштувати". Ви повинні мати можливість "Показати блок на певних сторінках". Вибір "Тільки перерахованих сторінок" та додавання / node / your-node-number до специфікації сторінки повинно обмежувати показ / блок відображення лише з потрібним вузлом.

Ура!


Thx для вашої відповіді :-). Але тоді я повинен створити область вмісту для кожного випадку. Тож якщо мені подобається спочатку текст, потім перегляд, а потім знову текст. Або якщо мені подобається мати перший текст, а потім перегляд або спочатку перегляд, а потім текст. Тоді я повинен створити 3 різні області вмісту, які я надаю у конкретних шаблонах вузлів. Але views_embed_view()підхід набагато простіший і чистіший, мабуть.
TiMESPLiNTER

0

Я знаю, ви згадуєте, що ви хочете використовувати гілочки шаблонів, але ви можете використовувати модуль Поле посилання Views, щоб уникнути необхідності копатися в шаблонах. Також надається перевага в тому, що можна додати його до будь-якого фільтруючого об'єкта, щоб редактори вмісту могли налаштувати перегляд / вихід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.