Далее в статье предполагается, что у Вас установлен Drupal версии 5, установлены модули CCK, Views, и что интерфейс Drupal и этих модулей русифицирован. В скобках иногда будут даваться английские тексты, для большей однозначности.
Если вы хотите вставить вид в документ определённого типа, то вполне вероятно, что вы захотите сделать его контекстно-зависимым.
Например, у меня есть два типа документов: проект и запрос. В каждом документе типа Проект я хочу показать список (предоставляемый видом) Запросов, связанных с этим Проектом. Таким образом, у нас "контекстным" документом является Проект, а "контекстно-зависимым", или "перечисляемым" (тем, который будет отображён через Views) является Запрос.
Хитрость здесь действительно состоит в том, чтобы обрабатывать аргументы вида, но во-первых:
Запрос с конкретным Проектом.Простой метод заключается в том, чтобы добавить поле CCK типа NodeReference в документы типа Запрос. В настройках поля NodeReference:
Проекты,Проект.Теперь самое время, чтобы создать пару новых запросов и связать их Проектом, используя выпадающий список Проекты.
issue_view.Для того чтобы аргументы вида заработали в качестве "контекстного фильтра", необходимо получить аргумент из документа, в котором размещен вид. Как мы отправим этот аргумент, зависит от метода встраивания вида в документ.
В этом примере мы хотим, чтобы каждый проект включал в себя перечень соответствующих ему запросов, и мы не хотим, чтобы пользователи или редакторы могли измененять такое поведение, поэтому мы жестко впишем его в тему оформления, используя файл шаблона Проекта node-project.tpl.php. (Есть несколько недостатков этого метода: [1] он работает только с темами для PHPTemplate и [2] это произвольная темизация, поэтому, если вы используете больше одной темы на вашем сайте, вам нужно создать и соответствующим образом изменить файл project.tpl.php для каждой используемой темы.)
После создания файла project.tpl.php в папке вашей темы оформления (можно создать его путем копирования и переименования файла node.tpl.php), добавьте следующий код там, где должен отображаться встроенный вид:
// load the context-node's 'metadata' global $current_view; // * define the context-node's NID as the argument $current_view->args[0]=$node->nid; // * select the name of the view to embed as $view1 $view1 = views_get_view('issue_view'); // * define this section for CSS print '<div class="issue_view">'; // * display a subtitle for the view section print '<h2>' . t($node->title . ' Issues') . '</h2>'; // send $args to the View's Argument Handler and display $view1 in the context-node print (views_build_view('embed', $view1, $current_view->args, false, false)); print '</div>';
Вещи, которые Вы, возможно, захотите изменить, помечены звёздочкой *:
//* define the context-node's NID as the <code>$args // (передать идентификатор (NID) контекстного документа, как аргумент $args) $current_view->args[0]=$node->nid;
$node->nid; делает то, что нужно, но я обнаружил, что родитель "relativity module", например, требует $parent->nid;.$node->type;.//* select the name of the view to embed as $view1 // (выбрать имя вида, который будет вставлен в $view1): $view1 = views_get_view('issue_view');
issue_view, нужно задать используемое имя здесь.//* define this section for CSS // (задать этот раздел для CSS): print '<div class="issue_view">';
issue_view и вы хотите иметь внятные CSS-теги, вам нужно заменить CSS-класс здесь.//* display a subtitle for the view section // (отображение подзаголовков для разделов вида): print '<h2>' . t($node->title . 'Issues') . '</h2>';
print '<h2>' . t('Issues') . '</h2>';Добавление дополнительных видов в документ - это очень просто, как вы можете видеть из модифицированного кода файла node-project.tpl.php, который отображает список соответствующих Запросов, а затем список соответствующих документов "Как сделать" (англ. "How to"):
// load the context-node's 'metadata' global $current_view; // * define the context-node's NID as the argument $current_view->args[0]=$node->nid; // * select the name of the view to embed as $view1 $view1 = views_get_view('issue_view'); // * define this section for CSS print '<div class="issue_view">'; // * display a subtitle for the view section print '<h2>' . t($node->title . ' Issues') . '</h2>'; // send $args to the View's Argument Handler and display $view1 in the context-node print (views_build_view('embed', $view1, $current_view->args, false, false)); print '</div>'; // * select the name of the view to embed as $view2 $view2 = views_get_view('how-to_view'); // * define this section for CSS print '<div class="how-to_view">'; // * display a subtitle for the view section print '<h2>' . t($node->title . ' How-to') . '</h2>'; // send $args to the View's Argument Handler and display $view2 in the context-node print (views_build_view('embed', $view2, $current_view->args, false, false)); print '</div>';
Спасибо!
Эта статья очень здорово помогла.
Я использовал эти техники, чтобы автоматически вставлять небольшую галерею изображений с каждым документом конкретного типа. Документы с изображениями "знали", где они должны отображаться (использование NodeReference), небольшая пользовательская темизация, чтобы встроить вид, - вуаля! Я описал свой подход здесь: http://drupal.org/node/221919, поскольку он несколько другой, и использует несколько отличные техники.
Источник: context-sensitive embedded views
Комментарии
Отправить комментарий