Вы здесьБлоги / RemaGe's blog / Drupal - Урок четвертый - Разбираемся с модулем Views. Теория и практика.
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: Greed, Grouping field: None, Number of columns: 4, Alignment:Horizontal.
HTML list: обычный HTML список, из свойств Grouping field (аналогичен тому что в Greed), и List type (Unordered- обычный, Ordered — нумерованный)

те же самые заголовки, но Style: HTML list, List 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.С помощью модуля
Первая задача.
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.Первоначально нам нужно

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

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

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

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

6.На с транице редактирования аргумента устнавливаем галочки Provide default argument, Current date, Month, Node: 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 закончен. Но не законченны уроки -)
Спасибо за внимание -)
Перепечатка и использование возможны только с пиьменного разрешения автора.
Если вам понравилась эта статья, можете сделать мне приятно, подписавшись на RSS, FriendFeed или Twitter.
- RemaGe's blog
- 15989 просмотра



какие св-ва надо поменять в 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, которое является ссылкой на ноду, и в котором можно задать произвольный текст. Далее блок вставляем в регион, и отдыхаем)
ммммм... =) А нельзя ли "разжевать" чуть более "мелко", если честно я не совсем понимаю что куда =( Был бы очень признателен.
Залазим в Views, создаем вид типа block, добавляем туда 2 поля:teaser и link, в линке пишем "Читать далее", или то что вам нужно, добавляем необходимые сортитровки, сохраняем, выводим блок, ничего сложного, все описано в 2 уроках по Views.
а что, можно сделать так:
при табличном выводе нескольких полей,
чтобы юзер сам мог сортировать по какому хочет полю, надавив на заголовок поля (типа как в экселе).
Простыми способами это не сделаешь, либо прикручивать свои костыли, либо искать модуль,сам не сталкивался, но думаю реализация должна быть.
по поводу Экспозет фильтров не можешь помочь?
там есть свойство "запомнить", т.е. чтобы у юзера браузер запоминал его выбор...
удобно, но не нашёл кнопку сброса. есть она там? или что делать?
вот эта строка
"Помнить настройки
Запоминать последние настройки пользователя для этого фильтра."
Я не знаю метода сброса, честно говоря, не использовал это свойство, в моих проектах.
Здравствуйте!
Спасибо большое за ваши статьи, ответы на все вопросы :)
У меня такой вопрос:
1.можно ли в блоке Календарь сделать навигацию не только по месяцам, но и по годам тоже?
2.Не знаю, может что то не так настраиваю, но у меня при выборе(клике) даты в предыдущем месяце, на странице выводятся материалы за эту дату, а в блоке месяц снова становится текущим, то есть чтобы просмотреть материалы за другую дату в предыдущем месяце, снова необходимо переходить на пред месяц в блоке.Как это можно исправить?
Модуль Archive не подходит, так как нужен вывод через календарь несколько различных типов контента.
Заранее спасибо)
Можно сделать или по месяцам, или по годам.
Здравствуйте!
У меня к вам несколько вопросов.
Мне надо сделать чтобы при нажатие на ссылки у меня происходило отображение товаров(фото товара,название товара, цвет товара). Для реализаци мне подсказали надо использовать view. Данные о товарах храняться вбд MySQL. По вашей статье я решил мне надо создать блок(фото товара, название,цвет). Но что дальше и вообще я правильно решил?
Если вы хотите сделать магазин, то лучше использовать для этого специальзированный модуль, наподобие Ubercart или osCommerce. Можно попробовать и Views, но потом у вас возникнут проблемы.
Мне не нужен магазин... нужно только реализовать показ фото товара,инфо и количество его на складе и все...
С помощью CCK создаете тип материала продукты, с нужными полями, потом выводите через Views. Это все обсуждалось в уроках. Прочитайте про CCK, Views, темизацию, и можно про Image cache.
Офигеть вот это статья.
Даже мне все понятно.
Евгений у вас очень хорошо получается писать мануалы.
Спасибо, стараюсь)
Огромное спасибо автору за уроки.
Имел много вопросов и выдаваемых ошибок.
Прочитал урок пофиксил всё.
У меня при настройке Комментариев, почему-то вместо самого коммента выводится только "...". С чем это может быть связано?..
Добавил видео к уроку, посмотрите, возможно поможет
Может подскажите, создаю представления и после сохранение выдает "страница не найдена". в списке представлений все созданные мной views есть, но если нажать на "Изменить или Экспорт или Клонировать или Удалить то опять же "страница не найдена"
задание 1 пункт 10. "Последнее что нужно сделать, это задать путь (я вбил «comm»), и сохранить"
Пишет ошибку: Display "Страница" uses a path but the path is undefined.
блока Page Settings нет вообще
если блока Page Settings нет, то скорее всего у вас выбран не тот дисплей (после сохранения он сбрасывается на default)