Работаем с Exposed filters и Arguments в Drupal через views

Не так давно разрабатывал сайт для одной гос конторы. Не скажу что в нем было что то особо трудное, но использование Views зашкаливало. Views поистине монструозен. Поэтому сегодня мы вернемся к нему, но урок будет более практический, чем теоретический. Мы рассмотрим использование такой полезной штуки как Exposed Filter, и слегка пощупаем Arguments, они с небольшой помощью модуля Views bonus сделают возможным скачку материалов в формате DOC (вообще их несколько на выбор).

Приступим -) У нас свежайщая подборка, Drupal 6.13, CCK 6.x-2.5, Date 6.x-2.3, Views 6.x-2.6, Views Bonus Pack 6.x-1.0-beta4. Если какого то модуля у вас нет, идем на Drupal.org и скачиваем его. Установку модулей мы уже проходили, нам нужны следующие:

CCK
Content
Option Widgets

Date/Time
Date
Date API
Date Timezone

Views
Bonus: Views Export
Views
Views UI

Включаем их.
Теперь создайте словарь таксономии, сделайте его обязательным для типа данных page, и закиньте туда пару терминов.Так же создайте несколько материалов типа page. Идем в «Administer › Site building › Views» и создаем новый Views c «View type: Node». Добавляем в новый вид 3 поля (должен же вид что то показывать), Node: Title, Node: Post date, Node: Teaser. У поля Node: Title устанавливаем галочку «Link this field to its node».

Теперь давайте добавим парочку Exposed Filter. Разница у Exposed с обычными только в том, что пользователь может менять Exposed, тем самым сортируя материалы. Сначала давайте добавим фильтр Date: Date (node).

В настройках укажем что сортировка будет происходить по Node: Post date

В следующей вкладке поставим что нужно найти все даты между 2 указанными значениями (Operator: is between), Date default: now- 5 year, To date default: now+ 5 year (2 этих значения указывают, что сначала отобразятся материалы у которых дата публикации лежит в десятилетнем промежутке, центр которого — сегодня). Теперь нажимаем кнопку Expose,

появится несколько новых полей доступных для изменения.

Из них, нас интересует «Label», заменим на «Дата публикации». Так же интересна галочка Unlock operator, если кликнем по ней, и сохраним, кроме даты, пользователь сможет изменить и поле Operator, но нам это не нужно (во всяком случае пока). Сохраняем фильтр.
Так же добавим фильтр Node: Title, в настройках поставим Contains (будет выводить все материалы, в заголовках которых есть введенный текст), уберем галочку Case sensitive, чтоб не было разницы в РеГиСтРЕ букв, и нажмем Expose. Label поставим «Поиск в заголовке».

И последний фильтр - Taxonomy: Term. В настройках укажем созданный нами словарь (я поэтично, и с большой фантазией, назвал его «qwe»). Selection type: Dropdown, то есть будет выпадающий список, если выбрать Autocomplete, то термины нужно будет вводить самому, и они будут авто дополняться. Show hierarchy in dropdown — если словарик имеет иерархию, то это отобразится в выпадающем меню.

Тут я изменил только Label, но при желании можете поиграть с настройками. Сохраняем фильтр, и вид в целом.

Теперь давайте добавим дисплей Page.

Зададим какой-нибудь Path, еще раз сохраним весь вид, и перейдем по вбитому пути.

У меня получилось так:

по моему неплохо)

С первой задачей разобрались, займемся второй. Зайдем в созданный нами вид, и добавим дисплей типа Feed. Style поменяем на DOC file.

Изменим Path на «doc/%» (% - это то место куда будет подставляться аргумент)

теперь нужно дать Друпалу нужный аргумент, для наших елей подойдет Node: Nid, то есть, идентификационный номер материала.

Нажмем Override (мы ведь не хотим добавить аргумент во все дисплеи?), и сохраним.
Уже должно работать, зайдем по адресу ваш_сайт/doc/id_существующего_материала, должна начать закачка doc файла) а внутри у нас...

Fatal error: Call to undefined method views_bonus_plugin_style_export_doc::sanitize_columns() in /var/www/drupal6/sites/all/modules/views/theme/theme.inc on line 290

Неожиданно не правда ли? Честно говоря не припоминаю что создавал такую ноду... Если порыскать по Drupal org, то окажется что не я один создал материал подобного вида. Пробуем еще раз зайти по адресу ваш_сайт/doc/id_существующего_материала (главное Nid поставьте правильный, я по ошибке вбил Nid несуществующего материала, и пол часа искал почему ничего не отображается). В итоге получим желаемое:

Мммм... ничего не забыли?) Что бы не вставлять ссылку каждый раз вручную, давайте чуть чуть подправим тему (Это не совсем правильный подход, и чуть позже будет урок по темизации Drupal, но на первый раз сойдет). Зайдите в папку с вашей темой (у меня стандартная тема Garland, она находится в папке ваш_сайт/Themes/Garland), тут нас интересует файлик node.tpl.php (он отвечает за отображение материалов). Внутренности его выглядят так:

Код
 <?php // $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $ ?> <div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>"><?php print $picture ?> <?php if ($page == 0): ?> <h2><a title="<?php print $title ?>" href="<?php print $node_url ?>"><?php print $title ?></a></h2> <?php endif; ?> <?php if ($submitted): ?> <span class="submitted"><?php print $submitted; ?></span> <?php endif; ?> <div class="content clear-block"><?php print $content ?></div> <div class="clear-block"> <div class="meta"><?php if ($taxonomy): ?> <div class="terms"><?php print $terms ?></div> <?php endif;?></div> <?php if ($links): ?> <div class="links"><?php print $links; ?></div> <?php endif; ?></div> </div> Как видите это обычный HTML файл, со вставками PHP, Добавим нашу ссылку <?php // $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $ ?> <div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?>"><?php print $picture ?> <?php if ($page == 0): ?> <h2><a title="<?php print $title ?>" href="<?php print $node_url ?>"><?php print $title ?></a></h2> <?php endif; ?> <?php if ($submitted): ?> <span class="submitted"><?php print $submitted; ?></span> <?php endif; ?> <div class="content clear-block"><?php print $content ?></div> <div class="clear-block"> <div class="meta"><?php if ($taxonomy): ?> <div class="terms"><?php print $terms ?></div> <?php endif;?></div> <?php if ($page): ?> <a href="<?php print "http://localhost/drupal6/doc/".$nid ?>">скачать в Doc</a> <?php endif; ?> <?php if ($links): ?> <div class="links"><?php print $links; ?></div> <?php endif; ?></div> </div> Если быть точным, то я добавил <?php if ($page): ?> <a href="<?php print "http://localhost/drupal6/doc/".$nid ?>">скачать в Doc</a> <?php endif; ?> Сначала идет проверка «if ($page)», то есть, если страница отображается полностью, то печатаем ссылку, далее идет сама ссылка «<a href="<?php print "http://localhost/drupal6/doc/".$nid ?>">скачать в Doc</a>», здесь $nid — эта идентификационный номер, у вас это будет выглядеть как «<a href="<?php print "ВАШ_САЙТ/doc/".$nid ?>">скачать в Doc</a>». 

На этом урок закончен. Старался расписать все понятнее, если что не серчайте)

2223