В одной views вставить другую views, дочернюю

Столкнулся с необходимостью в одной вьюсине показать блок другой вьюс, которая бы зависела от родителя. Более конкретно: у меня была вьюс с видом отображения "табы", которая показывала в каждом табе по одной ноде. Нужно было чтобы в этом же табе показывался блок jCarusel с фотками, добавленными именно к этой ноде которая отображается в табе.

Сначала естественно пробовал просто создать вьюс, ей указать поле отображения - эти фотки, но они тогда цеплялись не списком ul, а просто раздельными блоками field-photo , и к этому jCarusel у меня не получалось прикрутить.

Что я сделал: добавил новую вьюс, в ней сказал принимать аргумент: nid , и показывать все фотки этой ноды. Стиль отображения поставил html list , ненумерованный. Создал этой вьюс дисплей: страница.
Дальше я зашел в вьюс с табами, добавил поле php code:

<?php
    print views_embed_view('tabs_on_front_page','page_1', $data->nid);
 ?>

Здесь tabs_on_front_page - техничекое имя вьюсины, содержащей страницу с фотками (я ее сделал в той же вьюсине, которая отображает табы) , page_1 - тип дисплея_номер дисплея. Внимание - это не название дисплея! Если у вас несколько дисплеев-страниц, то надо просто посмотреть, какой по счету является нужный вам дисплей, и написать page_N. Если нужно вывести блок, то будет block_N
В качестве аргументов передается nid, соответсвенно у каждой ноды будут отображаться только ее фотки в jCarusel.

На всякий случай сохраню еще здесь справку о том, как отображать разными способами views (oба аналогичные)
Если нужно просто показать созданный views, можно использовать код:

<?php $view = views_get_view('имя_вьюс');print $view->preview('default');?>

Если есть необходимость в передаче аргументов, то:

<?php $args = array(аргумент(ы));$view = views_get_view('имя_вьюс');print $view->preview('default', $args);?>

или

<?php  print views_embed_view('my_view', 'block_1', $arg1, $arg2);?>

Предупреждаю всех - при использовании такого подхода увеличивается нагрузка на сервер, т.к. вьюсина, которая вложена в поле другой вьюсины по своей сути означает, что в цикле будет идти столько запросов к базе данных, сколько строчек у первой вьюсины. Поэтому такое решение является неправильным. Надо в препроцессах вьюсины делать _один_ раз запрос (т.е. только один раз вызвать другую вьюсину), и потом добавить ее результат к результату первой. (подробнее о препроцессах вьюс написано здесь http://graker.ru/drupal/20_api_za_20_dnei/views_api)

Drupal 6, 7

Комментарии

Добавить комментарий