Встроенные в документы контекстно-зависимые виды (модули Drupal: Views)

аватар: andyceo

Далее в статье предполагается, что у Вас установлен Drupal версии 5, установлены модули CCK, Views, и что интерфейс Drupal и этих модулей русифицирован. В скобках иногда будут даваться английские тексты, для большей однозначности.

Если вы хотите вставить вид в документ определённого типа, то вполне вероятно, что вы захотите сделать его контекстно-зависимым.

Например, у меня есть два типа документов: проект и запрос. В каждом документе типа Проект я хочу показать список (предоставляемый видом) Запросов, связанных с этим Проектом. Таким образом, у нас "контекстным" документом является Проект, а "контекстно-зависимым", или "перечисляемым" (тем, который будет отображён через Views) является Запрос.

Хитрость здесь действительно состоит в том, чтобы обрабатывать аргументы вида, но во-первых:

Нам нужен способ связать Запрос с конкретным Проектом.

Простой метод заключается в том, чтобы добавить поле CCK типа NodeReference в документы типа Запрос. В настройках поля NodeReference:

  • назовите поле Проекты,
  • выберите виджет "Выпадающий список" ("Select List"), и
  • в списке типов документов, на которые можно ссылаться, выберите Проект.

Теперь самое время, чтобы создать пару новых запросов и связать их Проектом, используя выпадающий список Проекты.

И теперь нам нужен вид для встраивания.

  • Создать вид с именем issue_view.
  • В группе настроек "Страница" ("Page"): установите флажок "Представлять страничный вид" ("Provide Page View"), и выберите "Список" ("List View").
  • В группе настроек "Поля" ("Fields"): выберите "Документ: Заголовок".
  • В группе настроек "Аргументы" ("Arguments"): выберите "Ссылка на документ: Проекты (field_projects)" и установите задайте ему "Показывать все значения".

Встраивание вида в "контекстный" документ.

Для того чтобы аргументы вида заработали в качестве "контекстного фильтра", необходимо получить аргумент из документа, в котором размещен вид. Как мы отправим этот аргумент, зависит от метода встраивания вида в документ.

В этом примере мы хотим, чтобы каждый проект включал в себя перечень соответствующих ему запросов, и мы не хотим, чтобы пользователи или редакторы могли измененять такое поведение, поэтому мы жестко впишем его в тему оформления, используя файл шаблона Проекта 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>';

    Это отобразит заголовок контекстного документа и слово "Issues" (англ. "Запросы"). Например, My First Project Issues - таким может быть заголовок списка запросов.
    Если вам не нравится загромождать, просто закомментируйте строку.
    Если Вы хотите напечатать там просто "Запросы", используйте вместо вышеприведённой строки строку
    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>';

Комментарий пользователя jfall от 16 февраля 2008 года - 09:37

Спасибо!

Эта статья очень здорово помогла.
Я использовал эти техники, чтобы автоматически вставлять небольшую галерею изображений с каждым документом конкретного типа. Документы с изображениями "знали", где они должны отображаться (использование NodeReference), небольшая пользовательская темизация, чтобы встроить вид, - вуаля! Я описал свой подход здесь: http://drupal.org/node/221919, поскольку он несколько другой, и использует несколько отличные техники.

Источник: context-sensitive embedded views

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can use the <go> tags just like the <a> for nicer urls.
  • Доступны HTML теги: <a> <img> <noindex> <br> <em> <i> <strong> <b> <strike> <s> <u> <sup> <sub> <h1> <h2> <h3> <h4> <h5> <h6> <cite> <blockquote> <abbr> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <div> <span> <hr>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <blockcode>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Введите, пожалуйста, код, который Вы видите на картинке. Показ изображений в браузере должен быть включен.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.
Добавьте страницу в закладки. Перейти к верху страницы
RSS-материал