Вы здесь

Drupal - Урок четвертый - Разбираемся с модулем Views. Теория и практика.

Одним из самых полезных модулей Drupal для создания сайта, является модуль Views, кроме того, он так же является одним из самых сложных, и наверное самым большим (архив Drupal 6-12 весит около мегабайта, архив Views 6.x-2.6 весит полтора мегабайта).


Views - теорияViews - практикаСуть модуля проста, - он выводит данные в нужном нам виде, вывод можно настраивать по многим параметрам, и всячески преображать. Для начала модуль нужно скачать, и установить (это мы обсуждали в прошлых уроках). Активировать нужно 2 модуля (они идут в 1 архиве Views) Views и Views UI, первый выводит списки из базы так как вы задали, второй — это визуальная оболочка, с помощью которой создаются Views. После активации в меню «Administer → Site building» (Управление →  Конструкция сайта) появится вкладка Views. Зайдем.



Здесь мы видим виды которые уже созданы по умолчанию, их может быть и больше в зависимости от установленных модулей. Эти виды неактивны, их можно включить с помощью ссылки «Enable», и использовать в своих целях. Но, !!МЫ!! как истинные «джедаи» попробуем сделать свой (пусть он и будет маленький, неказистый и неработающий). Кликаем по кнопке «Add».
Появляется первое меню создания вида.
                   


Тут 2 обязательных поля: заголовок (название вида., вводить английские буквы в нижнем регистре), и тип вида (View type — это то откуда мы будем брать информацию для вывода). Напишем в заголовке first (ведь это наш первенец, не так ли?), а тип вида поставим «Материал» (Node),  будем выводить материалы. Нажимаем «Next», и попадаем на страницу где мы будем задавать параметры вывода, первоначально она выглядит ужасно, но это только в первый раз.



тут можно создать несколько display (видов вывода, наиболее используемые это блок, и страница). Один display уже есть — default, если вы хотите создать несколько схожих дисплеев, то можно задать основные настройки в default, создаваемые display наследуют эти настройки. Если вы хотите что бы настройки у дисплея отличались от настроек Default, их нужно переназначить, для этого служит кнопка Override.


Давайте добавим блок.
 



Рассмотрим блок Fields, он является одним из основных, так как в нем мы выбираем какие поля (Fields) будет отображать в нашем виде.



На блоке вы видите 2 кнопки, первая служит для добавления поля, вторая для выставления полей в порядке нужном вам.
При нажатии на кнопку добавления поля, внизу отобразятся поля которые можно добавить, и выпадающий список сортировки. Если мы хотим добавить в вывод заголовки материалом, нам нужно выбрать Node: title, и нажать Add.



Появится меню Configure field, в котором мы можем задать Имя поля, с которым он будет выводиться, и проставить галочки:
 Exclude from display: загружать поле, но не отображать.
 Rewrite the output of this field: заменить вывод этого поля на свойтекст.
 Output this field as a link: Выводимый текст можно сделать ссылкой.
 Trim this field to a maximum length: можно указать максимальный размер текста, остальное обрежется.
Link this field to its node: запись будет ссылкой, в зависимости от поля, адрес ссылки меняется.   



Остановимся поподробнее на блоке «Basic settings», здесь собраны основные свойства нашего вида. При нажатии какого либо свойства внизу появляется панель редактирования.



Обсудим основные свойства:
Name: имя дисплея, можно не менять, но когда дисплеев много, помогает не запутаться.
Title: Заголовок дисплея (в нашем случае заголовок блока, по умолчанию).
Style: Стиль вывода. Очень важное свойство, определяет как будет выводиться ваш вид. Всего 4 варианта (если не добавлять модули):
Grid — даные выводятся «решеткой», можно задать количество столбцов, выравнивание (по горизонтали/вертикали) и нужно ли группировать по какому либо полю.


на рисунке выводятся заголовки страниц, Style: GreedGrouping field: NoneNumber of columns: 4, Alignment:Horizontal.
HTML list: обычный HTML список, из свойств Grouping field (аналогичен тому что в Greed), и List type (Unordered- обычный, Ordered — нумерованный)
 


те же самые заголовки, но Style: HTML listList type:  Ordered.
Unformatted — данные выводятся без форматирования, есть возможность их сгрупировать.
 

Style: Unformatted


Table: поля (field) выводятся в столбцах таблицы, можно задать сортировку по любому полю.


выведены 2 поля: заголовок материала, и дата публикации, сортируется по дате публикации. Style: Table,   Default sort order: Descending (нисходящая).

Use AJAX: использовать ли AJAX для вывода вида. Если, например, используется постраничный вывод, то переход между страницами будет происходить без перезагрузки страницы.
Use pager: Выводить ли данные постранично,  страницы можно показывать 2 способоми: Full (1 2 3 4 следующая › последняя ») и Mini (1 of 4 ››), свойство Pager element вам понадобится при использовании нескольких pager в одном виде.
Items per page: Сколько записей выводить на 1 странице.
Distinct: если включить, то будут отображаться только уникальные записи.
Access: задает доступ к виду, Role — только пользователям с определенной ролью, Permission (Право доступа) — только пользователям с определенным правом доступа (User management → Permission).
Caching: будет ли кешироваться блок.
Header, Footer: здесь можно вставить текст который будет до нашего блока, и после, возможна вставка HTML.
Empty text: этот текст выведется в том случае, если вид не вернет записей.
Theme: можно задать стилю какой темы будет соответствовать наш блок.

Блок Sort criteria: по любому полю можно задать сортировку по возрастанию или убыванию.

Блок Filters служит для задания фильтров вывода. Например можно вывести только те записи, у которых id меньше 5, или Node: Type равен «Blog entry».

Модуль Views очень обширен, мы рассмотрели основы, остальное я надеюсь вы разберете сами. Теперь давайте от теории перейдем к практике, выполните несколько заданий (ниже я приведу решение, но желательно что бы вы справились сами):

1.Создайте страницу в которой будут выводиться последние 5 комментариев (автор, текст  обрезаный до 20 символов, и дата публикации).
2.Создайте RSS-поток который будет выводить данные из предыдущего дисплея(возможно тут возникнут некоторые проблемы, но я в вас верю).
3.С помощью модуля calendar, создайте блок с календарем, что бы по клику на даты выводились записи из блога за эту дату.


Первая задача.

1.Создаем вид с View type: Comment, назовем его last_comments.
 




2.В только что созданном виде создаем дисплей типа page
 


3.Добавим 3 поля: Автор комментария (Comment: Author), текст (Comment: Body), и дату создания (Comment: Post date).
 


4.настроим поле Автор. Удалим Label, и зделаем имя ссылкой на домашнюю страницу.
 

5.Настроим Body, удалим Label, и поставим обрезку до 20 символов.
 


 

6.У даты удалим Label.
7.Сохраним дату (1), и сохраним весь вид(2)

 


8.Зададим количество комментариев Items to display: 5.

9.Поставим Style: Table, сортировку по дате на понижение.



10. Последнее что нужно сделать, это задать путь (я вбил «comm»), и сохранить,


если все сделано правильно, то по ссылке ваш_сайт/comm будет доступна наша страница.

 


Вторая задача.
1.дисплей у нас уже настроен, нужно только прикрутить к нему RSS. Заходим в на вид last_comments. И создаем новый дисплей Feed.


2.Изменяем Row style:на   Comment.
 


3.Вбиваем путь (Path) по которому будет располагаться наш RSS. Я поставил «rsscomm»
 


4.Присоединяем RSS-поток к дисплею Page.
 


5. Сохраняемся.
 


6.Заходим на страницу нашего вида, если все было сделано правильно, внизу появится значек RSS.
 


При клике на который появится сам RSS-поток, в Opere он выглядит так:
 



Самый трудный пример, и самый последний (ну наконец то)
1.Первоначально нам нужно скачать дополнительный модуль и установить его, который в свою очередь требует модули Date Api и Date timezone, скачиваем и устанавливаем их.
 


2.Создаем новый вид, цепляем его к Node.
 


3.Создаем дисплей Block.
 


4.Свойство Style: выставляем равным  Calendar (Этот стиль появился у нас после установки модуля Calendar).
 


5.Добавляем аргумент Date: Date (node).
 


6.На с транице редактирования аргумента устнавливаем галочки Provide default argument, Current dateMonthNode: Post date.
 


7.Добавляем поля Node: Post date, и Node: Title, у первого выставляем Date format в Custom, Label удаляем. У второго ставим галочку Exclude from display.
8.В блоке Filters добавляем параметр Node: Type, и высталяем параметр Is one of — Blog Entry
 


9.Все сохраняем, выводим блок, должно получиться так
 


Не очень красиво, но работает,  внешний вид — это тема для другого урока. Но пока ничего не выводит. Почему? Потому что нужно создать вид Page на котором будут выводиться выбранные материалы. Собираем волю в кулак, осталось совсем чуть чуть.

1.В этом же виде создаем  дисплей Page.
2.В Page settings ставим Path: callendar/% (% - это то место куда наш блок будет подставлять дату, что бы Page знал данные за какую дату отображать)
 

3.Переопределяем (кнопочка  Override) у Page аргумент  Date: Date (node) Node: Post date, меняем Month на Day (что бы на страничке выводился только один день).
 


4.В блоке Fields переопределяем Node: Title, убираем галочку Exclude from display, и ставим Link this field to its node, что бы заголовки отображались, и были ссылкой на материал.
5.Сохраняем. Пробуем. Теперь при клике по соответствующей дате будут выведены записи блога созданные в тот день. Вы можете изменить параметр Style у дисплея Page, пробуйте и у вас получится. А как темизировать виды, я рас кажу вам как нибудь потом)            


На этом урок по созданию сайта на Drupal закончен. Но не законченны уроки -)
Спасибо за внимание -)

 

Перепечатка и использование возможны только с пиьменного разрешения автора.

Комментарии

какие св-ва надо поменять в Page - Node: Post date когда рассматривался пример с календарём ?

Label удаляем,  Date format выставляем в Custom. Это у блока, который выводит календарь.

Здравствуйте!
Я после установки и включения модулей calendar, date api и date timezone не могу попасть на вкладку "Управление", выводится сообщение
Fatal error: Maximum execution time of 30 seconds exceeded in Z:\home\worldcosm\www\includes\common.inc on line 511

Линии 511,512,513 этого файла выглядят так
while (!feof($fp) && $chunk = fread($fp, 1024)) {
$response .= $chunk;
}
Помогите!

Эта ошибка возникает тогда, когда за установленные по умолчанию 30 секунд, PHP файл не успевает закончить работу. У меня такое обычно появлялось когда в цикле вставлял неправильные параметры, и он зацикливался. С Drupal такого пока не бывало. 

бычно при запуске большого числа модулей (Особенно если на сайте включен Views, который отжирает мегабайт 14 памяти) не хватает памяти.  Найдите файл php.ini, с найстройками вашего модуля пхп, в нем должна быть строчка memory_limit = 16M (по умолчанию 16), и поставьте число побольше, 64 должно хватить (у меня стоит 128M, на всякий случай). Потом перезагрузите апач, и попробуйте перезагрузить страницу. Возможно, это поможет.  

Если по какому то пункту возникли вопросы, спрашивайте)

 

После перезагрузки компа все стало нормально. =)
На всякий случай нашел php.ini,там memory_limit = 128 M.
Спасибо!

Здравствуйте!
У меня есть одна проблема, в задаче 1 на шаге 10 я не могу найти поле куда вы вбиваете comm. Не могли бы вы подсказать мне где находится это поле.

В первом столбце, там сначала идут Basic settings, следом за ними Page settings, в   Page settings можно изменить 2 вещи, Path (путь), и Menu (Меню). Я поставил Path равным comm.

У меня малость не так. У меня вобще нет Page setting, в первом столбце есть только Basic settings и View settings. Сейчас попробую ввести в View settings.

Мда. Это совсем нето. Тперь буду пытаться сделать 1-ую задачу в Drupal 5.x

Скорее всего у вас выбран не страничный дисплей, а default 

Большое спасибо за то что указали на мою ошибку. Вы действительно правы. У меня был выбран default, теперь всё вроде как нормально.

Огромнейшее спасибо автору за разъяснение по поводу вьюзов!
Стоило только немного разобраться, точнее подтолкнуть в нужном направлнении и все вроде становится на свои места!!!

еще раз огромное спасибо!

Евгений помогите пожайлуста решить такую задачу. Необходимо с помощью Views на главной странице разместить какой либо материал(любой текст) и последнею новость(есть список терминов)Подскажите в крации в каком направлении двигаться. Также создал с помошью ССК тип материала с двумя текстовыми полями(но как в них засунуть данные?)В Views получается засунуть в Пейдж либо материал дефаултовой страницы либо последнию новость. А вот совместить их не получается.

Что бы вывести в виде текст, используйте Futter(подвал) и header (заголовок), в разделе Basic settings на странице вашего вида. Что бы вывести последнюю новость, выставьте фильтр по термину таксономии, сортировку по дате, Items to display 1.
Если создали тип материалов, то он должен появиться в меню "создать материал", там же будет возможность вбить все поля.

В Views получается засунуть в Пейдж либо материал дефаултовой страницы либо последнию новость. А вот совместить их не получается.
Не совсем понял о чем вы.

И можно ли расказать про Mini Panel, поскольку сейчас наткнулся это по моему то что нужно

Ну например, скажем в Views есть представление frontpage, вот как добавить в вывод страницы чтоб выводилось не только текст главной страницы но и последний комментарий. Если добавлять в фильтр текст комментария то ничего не выводится. Если убрать из фильтра материал, то тогда комментарий выводится, и наоборот.

В этом уроке есть 3 примера, в первом создается страница на которой выводятся 5 последних комментариев, вам нужно сделать так же, только вид типа "block", и количество записей -1. А потом вывести полученный блок.

Как засунуть в свой тип материала с двумя текстовыми полями текст это конечно понятно, а как туда засунуть новость (термин таксономии)

Словари таксономии можно закрепить за каким то типом материалов, просто закрепите нужный тип за нужным словарем.

Как то не подумал блоки по отдельности засовывать в содержимое, все пытался в страницу засунуть. Ну так а как насчет Panel, не хотите мини урок сделать:)?

К стати был бы интересный урок, там не обойтись и без модулей CTools (Chaos Tools) их можно прикрутить и вставляй блоки в страницу без проблем, и не только блоки а почти любые данные, с большим количеством форматирования, да еще и с сортировкой по желанию... Предлагаю по быстрому забабацать урок... Вместе веселее!

А мой календарик круче получися...

Вот сколько не пытаюсь, так и не получается вывести в отдельный регион только тизеры в виде новостной ленты со ссылками типа >>>Читать далее. И прочее. Посоветуйте как решить задачу.

А в чем именно проблемма? Создаем блок, вставляем туда тизеры без ссылки, и поле link, которое является ссылкой на ноду, и в котором можно задать произвольный текст. Далее блок вставляем в регион, и отдыхаем)

ммммм... =) А нельзя ли "разжевать" чуть более "мелко", если честно я не совсем понимаю что куда =( Был бы очень признателен.

Страницы