Вы здесь

Drupal - Урок восьмой - Еще немного про модуль Views. Работаем с Exposed filters и Arguments.

Не так давно разрабатывал сайт для одной гос конторы. Не скажу что в нем было что то особо трудное, но использование 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, то окажется что не я один создал материал подобного вида. Если у вас не появилась эта ошибка, значит вам повезло, если же появилась, то скачиваем этот файлик. Внутри папка «export», которой нужно заменить папку с аналогичным названием в модуле Views bonus (Кстати, в DEV версии модуля такой ошибки уже нет, так что скоро поправят и в этой). Пробуем еще раз зайти по адресу ваш_сайт/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>

Если быть точным, то я добавил



Сначала идет проверка «if ($page)», то есть, если страница отображается полностью, то печатаем ссылку, далее идет сама ссылка «<a href="<?php print "http://localhost/drupal6/doc/".$nid ?>">скачать в Doc</a>», здесь $nid — эта идентификационный номер, у вас это будет выглядеть как «<a href="<?php print "ВАШ_САЙТ/doc/".$nid ?>">скачать в Doc</a>».

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

Комментарии

Здравствуйте!
А как узнать ID документа? Что это вообще?

Огромное спасибо за уроки!!! Как хорошо, что есть люди, у которых есть время вот так поделиться опытом с новичками! =)))))

Если вы не включали на сайте модуль Pathauto (jон меняет адрес статьи), то id можно узнать по адресу материала, зайдите в материал, ссылка должна быть вида ВАШ_САЙТ/node/5, 5 - это и есть id материала. Если модуль Pathauto включен, то нужно зайти на страницу ВАШ_САЙТ/admin/build/path, где есть все синонимы созданные модулем, и найти нужный адрес с id.

Id - это уникальный номер записи в базе данных, по нему всегда можно отличить одну запись, от другой. В Drupal так же отличаются и названия id, например id материалов называется nid (node id), а  id пользователей uid (user id).

Незачто) я начал учить друпал 3 месяца назад, и столкнулся с нехваткой материалов для новичков, поэтому пытаюсь описать, то в чем смог разобраться сам -)

 

RemaGe, где Вы были год назад? :)
Тогда как раз мне нужно было, сейчас многое уже знаю, только мало с аргументами работаю.

Год назад я был офисным планктоном, и перекладывал бумажки-) 

RemaGe, жаль, но теперь будут интересные посты про Друпал?
Буду следить за Вами.

Посты будут. Интересные ли - не уверен, но буду стараться) 

присоединяюсь!RemaGe, где Вы были год назад? :)
блин стока времени сэкономили б!

Супер все так лаконично описано, вопросов почти не остается. =) Только начинаю разбиратся с друпалом и ваш блог очень даже кстати.! =)

Здравствуйте,
У меня есть вопрос, но он малость не в тему. Вопрос связан с модулем Apache Solr. При входе в Управление возникает ошибка: Fatal error: require_once() [function.require]: Failed opening required 'SolrPhpClient/Apache/Solr/Service.php' (include_path='.;D:\WebServers\xampp\php\pear\') in D:\WebServers\xampp\htdocs\drupal\modules\apachesolr\Drupal_Apache_Solr_Service.php on line 2
На этой строке написано:
require_once 'SolrPhpClient/Apache/Solr/Service.php';
Помогите пожайлуста.

Честно говоря я и не знал что его нужно скачивать, может вы подскажите куда его пихать?

Разорхивируйте в папку с модулем то есть путь должен быть такой sites/all/modules/apachesolr/SolrPhpClient 

И снова здравствуйте!
В уроке №9 нельзя писать комментарии, почему то... Поэтому пишу сюда.
У меня 2 вопроса.
Первый: у меня есть тема, которую я хочу поменять. А именно там нет такого как "Левая колонка" и "Правая колонка", есть "сайдбар". Он находится справа(на месте правой колонки). Мне хочется его перенести на место левой колонки. Код, который отвечает за этот регион в page.tlp.php такой

<?php if ($sidebar) : ?>

<?php print $sidebar; ?>

<?php endif; ?>

Все мои попытки "потаскать" этот код по телу page.tlp.php закончились тем, что сайдбар перемещался вертикально по правой стороне сайта.
Собственно вопрос, как переместить этот сайдбар налево??? ))))
Второй:
Мне совершенно не нужны поля слева и справа страницы, можно ли как-нибудь "растянуть" содержимое страницы???
Спасибо!

Сайдбар - это и есть колонка, основные характеристики вбиты в файле style.css. Поля убрать можно, это задается там же. Ищите нужные вам элементы по их id.

скажите, можно создать вид для главной страницы?

 Да, более того, при установке Views он создается автоматом (не активирован) и называется frontpage, но не обязательно использовать его, вы можете сделать любой страничный вид главной страницей, какую страницу считать главной, можно задать тут Administer › Site configuration, параметр Default front page: 

Здравствуйте, Женя! Вот эту статью я очень внимательно прочитала, спасибо большое. Посмотрела, как много легкоизложенного материала у Вас на сайте. Вы делаете очень большое дело! Новичкам так не хватает такой информации. Когда заходишь на форум, могут и проигнорировать :) или :(. А здесь очень много ответов на вопросы. Но, к сожалению, даже почитав про фильтры, я так и не смогла разобраться со своей проблемой. Подозреваю, что я упускаю что-то очень важное... Одним словом, я решила рискнуть и поделиться. Если у вас будет минуточка, поделитесь, пожалуйста. что Вы думаете об этом.

Представьте себе расписание учебы врачей:
М.И. учится с 1-го по 10 сентября,
Д.В. с 10 по 20 октября,
С.Н. - с 20 по 30 ноября.

Нужно сделать фильтр, который покажет врача, совершенно свободного в искомый период времени.

Я создала тип материала: "Врачи". Там есть поле "Учеба" (два окошка - для ввода даты начала занятий и даты окончания).

Далее мне нужно сделать фильтр.

Во views выбираю фильтр по типу материала... это понятно...

Затем "Дата (нода)" - добавить, кликаю нужное в "Date form type" и "Granularity".
В "Date field(s)" выбираю оба поля: "Учеба from date" и "to date".

..."Method"
С ним, если честно не очень понятно, но методом проб и ошибок я поняла, что для моего случая подходит "AND"".

Потом выбираю оператора "is not between". Ведь мне нужно найти все, что не относится к указанному периоду времени.

"Absolute value" и "Relative value" оставляю пустыми, и жму обновить.

Что происходит дальше.

Возьмем для примера М.И.
Ура! Ее не находят, если в поиске указать даты:

в поле "from" - с 1,2,3 и т.д. до 9 сент.(я перебрала все) в поле "to" постоянно стоит 10 сент.

И, увы, все ломается, если указать, промежуток, например, с 3-го сент. по 7 сент. :((

Вы не знаете, почему? Что я не так делаю?

Буду очень-очень благодарна за помощь.

Все ломается если указать to отличным от 10? А каким образом все ломается?

Вы знаете, Женя, работает, когда указаны пограничные даты или меняется только дата "from".
Не работает, когда указываю даты из промежутка: например, с 3-го по 5 сентября.
Не понимаю, почему...

Просто не работает, то есть ничего не отображает, или выдает какую то ошибку (неплохо бы скриншот)?

Начал разбираться с Drupal 6.
Знания php, html, css = 0. :(
Но, вроде, основные вещи понятны (хотя и не с первого/десятого раза).
Сейчас методом чтения манов и прочего полезного, делаю сайт на подобии lenta.ru или gazeta.uz
Разобрался как с помощью pathauto сделать путь к статье (http://www.softplace.uz/drupal/2009/09/9/bat-rambler).
Но, не понимаю, как сделать так, чтоб если ввести просто http://www.softplace.uz/drupal/2009/09/9 и увидеть все новости за 9 число.
Например в lenta.ru это работает.

Будьте добры, укажите верный путь.
Очень надеюсь обойтись модулями (готовыми).
Я понял что надо ковырять views и аргументы.
Уже 3 дня мучаюсь и не получается.
Очень надеюсь на Вашу помощь.

В прошлом уроке по views было примерно то что вам нужно http://remage.su/content/drupal-urok-chetvertyi-razbiraemsya-s-modulem-v... , в 3 примере там описывается работа модуля calendar, и как раз фильтрация по датам, посмотрите, почитайте, думаю найдете пищу для размышлений -)

Здравствуйте! Спасибо за понятный язык уроков. Въезшаешь сразу.
Может и не в тему, но буду благодарен за ответ.
У вас в уроке выводятся материалы (ноды?):

Кислород
драма, Россия
Режиссер: Иван Вырыпаев
и так далее.

Как можно настроить, чтобы при создании материала драма, и Иван Вырыпаев были элементами таксономии и выбирались из словаря (как это делается в обычном типе материалов заметка), но выводились в тексте материала, а не после материала, перечислением через запятую.

Excuse me и delete если не туда и не то пишу.

Вам в 9 урок, это можно сделать с помощью темизирования.

Здравствуйте!
Довольно давно заметил ваш блог о друпале. Это замечательно что кто то просто так, от души помогает другим людям. Спасибо Вам!

У меня собственно вопрос, не совсем по содержанию, но относящийся ко views.
Есть созданный CCK-ем тип контента, поля title, body, contact(контактная информация о человеке). Так вот, в поле contact храниться текст обрамленный некоторым html оформлением. Но при выводе этого поля вьюсом, он заменяет все "<" ">" скобы спецсимволами. Т.е. вьюс применяет внутренний фильтр. Вопрос: Как отлючить этот фильтр?

Best regards.
Заранее благодарю.

Незачто)
Вы используете wysiwyg редактор наподобии fckeditor для редактирования contact? Если да, то проблемма в нем.

Если нет, то все фильтры применяемые Друпал к тексту, можно изменить в Форматах ввода (ниже полей материала, на странице добавления), по умолчанию там стоит FilteredHTML, можете поставить FullHTML, или как вариант попробовать создать свой формат ввода, в админке на странице "форматы ввода".

Здравствуйте, можете подсказать как сделать чтоб каждый материал который я создаю и вывожу через Views ссылался на разные ресурсы

Страницы