Пример того, как можно дополнить результаты views в Drupal 9/10.
Задача — вывести для статьи блок со связанными публикациями. В начале нужно было просто выводить последние статьи того же типа, а потом у заказчика возникло желание переопределять выдачу, задавая часть статей вручную для каждой публикации.
Опускаю саму вьюху, рассмотрим лишь реализацию хука hook_views_post_execute(). Он выполняется когда результаты запроса views уже получены и мы можем их изменить.
Хук делает слудующее:
- Проверяет контекст — является ли текущая страница нодой.
- Пытается получить содержимое поля field_news_related, в котором пользователь задаёт вручную статьи.
- Переписывает заданными вручную статьями результаты выдачи.
По умолчанию связанные статьи выбираются, например, из последних новостей с использованием фильтра, например, категории новости (все условия определяются в самой views и нам не важны).
Но если пользователь определил какие то связанные статьи вручную, то они будут поставлены в полученный список, замещая первые элементы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
use Drupal\node\NodeInterface; use Drupal\views\ResultRow; use Drupal\views\ViewExecutable; /** * Implements hook_views_post_execute(). */ function MODULE_NAME_views_post_execute(ViewExecutable $view) { // вьюха называлась news и в ней был блок - news_related if ($view->id() == 'news' && $view->current_display == 'news_related') { // смотрим контекст публикации if ($node = \Drupal::routeMatch()->getParameter('node')) { $related = $node->get('field_news_related'); // получаем из контекста поле field_news_related if ($related) { $index = 0; // подставляем в результаты foreach ($related as $item) { $relatedNode = \Drupal::entityTypeManager() ->getStorage('node') ->load($item->target_id); // тут можно проверить есть ли такая статья вообще // и опубликована ли она в частности if ($relatedNode && $relatedNode->status->value == NodeInterface::PUBLISHED) { $view->result[$index++] = new ResultRow([ '_entity' => $relatedNode, 'index' => $index, 'nid' => $relatedNode->id(), 'node_field_data_langcode' => $relatedNode->language()->getId(), ]); } } } } } } |
В шаблоне вам нужно лишь вызвать это представление вот так (я использую модуль twig_tweak):
1 |
{{ drupal_entity('block', 'views_block__news_news_related') }} |
С помощью написанного нами хука, указанные редактором статьи будут вставлены в результаты.