Вы здесьБлоги / RemaGe's blog / Drupal - Урок восьмой - Еще немного про модуль Views. Работаем с Exposed filters и Arguments.

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


By RemaGe - Posted on 08 Август 2009

Не так давно разрабатывал сайт для одной гос конторы. Не скажу что в нем было что то особо трудное, но использование 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>

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

  <?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>».

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





Если вам понравилась эта статья, можете сделать мне приятно, подписавшись на RSS, FriendFeed или Twitter.


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

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

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

RemaGe аватар

Если вы не включали на сайте модуль 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, жаль, но теперь будут интересные посты про Друпал?
Буду следить за Вами.

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';
Помогите пожайлуста.

RemaGe аватар

а вы сам модуль solr-php-client с http://code.google.com/p/solr-php-client/ скачивали?

Неизвестный аватар

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

RemaGe аватар

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

Неизвестный аватар

Большое спасибо.

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

<?php
if ($sidebar) :
?>

<?php
print $sidebar;
?>

<?php
endif;
?>

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

RemaGe аватар

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

Неизвестный аватар

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

RemaGe аватар

 Да, более того, при установке 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 сент. :((

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

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

RemaGe аватар

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

Неизвестный аватар

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

RemaGe аватар

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

Неизвестный аватар

Начал разбираться с 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 дня мучаюсь и не получается.
Очень надеюсь на Вашу помощь.

RemaGe аватар

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

Неизвестный аватар

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

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

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

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

RemaGe аватар

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

Неизвестный аватар

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

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

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

RemaGe аватар

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

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

Неизвестный аватар

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

RemaGe аватар

На какие ресурсы?

Неизвестный аватар

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

RemaGe аватар

Если ссылки на свои же ноды, то можете добавить поле CCK Node Reference, если на другие страницы, поле CCK со ссылкой, останется темизировать вывод, и правильно подставить ссылку.

Неизвестный аватар

Автор, а у вас никто статьи не тырит с сайта? А то у меня заколебали уже - копируют и копируют. И главное, что ссылку никто не удосужится поставить.

RemaGe аватар

Пока пронесло) Во всяком случае по Друпалу не воруют, пару переводов брали, но ссылку поставили

Неизвестный аватар

я добавил поле Node reference но когда начинаю настройки выставлять выскакивает ошибка

The default value PHP code returned an incorrect value.
Expected format:

return array(
0 => array('nid' => value for nid),
// You'll usually want to stop here. Provide more values
// if you want your 'default value' to be multi-valued:
1 => array('nid' => value for nid),
2 => ...
);

Returned value:

можете объяснить в чём проблема?

RemaGe аватар

Честно, даже не представляю) Я работал с Node reference, но у меня все прошло гладко.

Неизвестный аватар

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

Нет Стиля Doc file, как можно исправить? Спасибо)))

RemaGe аватар

Views Bonus Pack - Установили?

Неизвестный аватар

теперь да. спасибо

Неизвестный аватар

может не по теме, но такая ошибка:
warning: Invalid argument supplied for foreach() in
/www/includes/theme.inc on line 463.

Не знаю как исправить

RemaGe аватар

тему меняли?

Неизвестный аватар

Тему менял и не раз, какую бы не поставил всегда такая ошибка по несколько раз написана.
А тема, которую я создал по уроку отображается не так как тут, а вот так: my_theme
���� ����!!!!

RemaGe аватар

В этом и проблема, темы надо писать в кодировке UTF-8, иначе появлюятся ���� ���� и описанные вами ошибки

Неизвестный аватар

Спасибо большое, об этом я не подумал