Наверняка, многие, работающие с друпалом, знакомы с модулем Views. Как гласит Drupaler.ru, модуль Views — это Настройка и контроль за отображением любого типа контента в любом месте сайта, т.е. он позволяет создавать страницы, блоки, подменять содержимое нод, страниц пользователей и многое другое, формируя контент из любых доступных полей на сайте. Но что делать, когда необходимо вывести информацию, предоставляемую сторонним модулем, и к которой доступа из Views у нас нет?
Чтобы было понятно, далее всё на живом примере:
На сайте я использую модуль PrivateMSG. Он позволяет пользователям отправлять друг другу личные сообщения. С помощью Views я собрал блок, в котором отображается информация о текущем пользователе.
Задача:Отобразить в блоке количество новых сообщений и количество всех сообщений в папке «Входящие» текущего пользователя.
Решение:Написать модуль, который добавил бы в конструктор Views необходимые значения.
К сожалению на просторах интернета очень мало информации по этому поводу, а мануал по Views API довольно сложен и непонятен.
Итак, приступим.
Создаем новый модуль. Как положено, создаем директорию, называем её именем нашего будущего модуля. Я назвал его privatemsg_extraviews. В директории создаем файлы privatemsg_extraviews.info, privatemsg_extraviews.module, privatemsg_extraviews.views.inc. Далее нам понадобится создать еще 2 файла, но об этом позже.
privatemsg_extraviews.info Этот файл содержит информацию о нашем модуле. Нужен, чтобы друпал опознал модуль.
name = privatemsg_extraviews description = Добавляет поддержку views в Private Messages core = 6.x package = Mail version = "6.x-1.1"
* This source code was highlighted with Source Code Highlighter.
Этого достаточно, чтобы друпал опознал наш модуль.
privatemsg_extraviews.module Основной файл модуля. В нем пишется вся структура модуля, все хуки, и вообще всё-всё. Нам нужно лишь указать, что модуль работает с Views.
<?php
/** * Implementation of hook_views_api(). */ function privatemsg_extraviews_views_api() { return array( 'api' => 2, // Указываем версию API 'path' => drupal_get_path('module', 'privatemsg_extraviews'), // Указываем откуда брать файл для Views ); }
* This source code was highlighted with Source Code Highlighter.
privatemsg_extraviews.views.inc Самое интересное. В этом файле мы и пишем всю систему работы с Views. Модуль его сам найдет, т.к. мы указали директорию в хуке выше. Основной хук, который нам потребуется, это hook_views_data(). В нем мы определяем, какую таблицу БД мы добавляем, и какую информацию возвращаем.
<?php function privatemsg_extraviews_views_data() { // Определяем новую группу во Views
начения будут доступны только при выборке пользователей 'users' => array( // Указываем ключи 'left_field' => 'uid', 'field' => 'uid', ), ); // count - столбец таблицы, по которому будет выборка $data['privatemsg']['count'] = array( 'title' => t('Количество входящих сообщений'), 'help' => t('Количе. sp; // Доступна сортировка по этому полю 'click sortable' => TRUE, ), ); // Аналогично $data['privatemsg']['count_new'] = array( 'title' => t('Количество новых сообщений'), 'help' => t('Количество новых сообщений в папке "Входящие"'), 'field' => array( 'handler' => 'privatemsg_extraviews_handler_field_count_new', 'click sortable' => TRUE, ), ); return $data; }
* This source code was highlighted with Source Code Highlighter.
Далее нам потребуется hook_views_handlers() для инициализации обработчиков полей.
function privatemsg_extraviews_views_handlers() { return array( // Обработчики 'handlers' => array( 'privatemsg_extraviews_handler_field_count' => array( // Указываем, что возвращаем числовое значение 'parent' => 'views_handler_field_numeric', // И путь к файлу обработчика 'path' => drupal_get_path(<. numeric', 'path' => drupal_get_path('module', 'privatemsg_extraviews'), ), ), ); }
* This source code was highlighted with Source Code Highlighter.
Как я уже и говорил выше, нам понадобится создать еще 2 файла — это как раз обработчики полей. Создадим в директории модуля файлы privatemsg_extraviews_handler_field_count.inc и privatemsg_extraviews_handler_field_count_new.inc.
privatemsg_extraviews_handler_field_count.inc Обработчик для поля «Количество сообщений».
<?php
>->query->ensure_table('pm_index'); // Запрашиваем количество сообщений $sql = "SELECT COUNT(DISTINCT thread_id) FROM {pm_index} p WHERE p.deleted = 0 AND p.uid = users.uid"; // Указываем название для возвращаемого поля $this->query->add_field('', "($sql)", 'count'); $this->field_alias = 'count'; } // Возвращаем полученное значение function render($values) { $txt = $values->count; &nb. ="gray">Source Code Highlighter.
privatemsg_extraviews_handler_field_count_new.inc Обработчик для поля «Количество новых сообщений». (аналогично)
<?php
class privatemsg_extraviews_handler_field_count_new extends views_handler_field_numeric { function query() { $table = $this->query->ensure_table('pm_index'); $sql = "SELECT COUNT(DISTINCT thread_id) FROM {pm_index} p WHERE p.deleted = 0 AND p.is_new = 1 AND p.uid = users.uid"; $this->query->add_field('', "($sql)", 'count_new'); $this->field_alias = 'count_new'; }
function render($values) { $txt = $values->count_new; if ($txt) { return $txt; } else { return parent::render($values); } } }
* This source code was highlighted with Source Code Highlighter.
После всего проделанного Views сформирует запрос типа
SELECT users.uid AS uid, (SELECT COUNT(DISTINCT thread_id) FROM pm_index p WHERE p.deleted = 0 AND p.uid = users.uid) AS
users.uid = 1
* This source code was highlighted with Source Code Highlighter.
и вернет необходимые значения.
Надеюсь, инструкция окажется полезной для кого-то. Если будет интерес, могу написать более подробно о Views, там еще много интересного: как создать свои настройки для полей, как создавать поля, доступные в фильтрах и сортировках, свои аргументы и связи, и многое другое.
UPD: Перенес в блог «Drupal». Спасибо за карму.
habr.com
Одним из важнейших модулей в Drupal можно смело назвать модуль «views». Модуль «views» — помогает выводить нам весь контент сайта именно в той форме, в какой нам необходимо. По сути это визуальный редактор построения «SQL» запросов. Благодаря которому в несколько кликов мыши мы можем вывести контента сайта совершенно по другому. Но, что бы это лучше понять продемонстрирую это всё на конкретном примере в drupla 7:
Задача: нам нужно вывести тизер конкретного типа содержимого
Решение: Надеюсь, что вы уже скачали и установили модуль «views», как установить модуль можно почитать вот здесь. Для работы «views» необходим так же модуль «ctools» — поэтому его тоже нужно скачать и установить. С этим думаю проблем у вас не должно возникнуть. А также для наглядности картины, вам нужно создать контент на сайте .Включаем модули в панели «Модули»
Ставим галочки напротив «views» и «ctools» — сохраняем. Теперь в пункте «Структура» у вас должен появиться дополнительный пункт – «представления» (views).
Переходим в него, и перед нами открывается панель представлений, те которые имеются в модуле уже по умолчанию.
Нам они не интересны, поэтому кликаем по пункту «Добавить новое представление» и приступаем к созданию. Перед нами открылась страница, где нам нужно ввести первоначальные параметры «представления» или как говорят в сообществе drupal «вьюха». Замечу, что интерфейс модуля «views» для Drupal 6 и Drupal 7 кардинально отличаются.
Первое, что нам необходимо это дать название представлению (желательно на английском), но если хотите на русском, то не забудьте отредактировать машинное имя представления, так как по умолчанию Drupal заносит туда заголовок представления.
В пункте «показать» нужно выбрать, что мы хотим отобразить — в данном случае – это содержимое.
В пункте «типа» — выбираем для какого типа нам нужно отобразить содержимое, у меня это «basic page».
Ставим галочку создать страницу и прописываем в пункте «Заголовок страницы» будущее название нашей страницы, а в пункте «Путь» -url адрес нашей будущей страницы. Для решения нашей задачи – этого будет достаточно. Нажимаем сохранить и появится подтверждение, что представление сохранено.
Теперь результат нашей работы можно посмотреть по тому адресу, который мы указывали при создании вьюхи, а именно
Название_сайта/-newviews
Это самый лёгкий вариант создания представлений по средством модуля «views». Далее в уроках я рассмотрю примеры как строить сложные представления, методы фильтрации, связи , аргументы и так далее. По этому модулю можно создавать отдельный сайт с его полным и подробным описанием.
drupalfly.ru
Модуль Views — это самый популярный модуль среди тех, что находятся на Drupal.org. В интернете недостаточно информации по освоению данного модуля. Давайте вместе попробуем изучить азы работы с этим модулем, и заглянуть в каждую ссылку, которая есть в настройках модуля Views.
Установка
Установка модуля Views ничем не отличается от установки других модулей. Для этого нужно:
Скачать модуль ctools, он находится здесь. Данный модуль содержит необходимые инструменты для работы модуля Views.
Скачать модуль Views, который находится здесь.
Скопировать папки с модулями (они находятся в архивах с модулями) в папку, где должны находится модули Drupal, а именно “/sites/all/modules/”.
Пройти на страницу управления модулей и включить следующие модули: Chaos tools, Views, Views UI. Ссылка находится на главной административной странице (Administration). Для примера, эта ссылка будет “example.com/admin/modules”.
Если у Вас есть проблемы с установкой, советую проверить все по пунктам, или же просмотрите видео Установка модулей в Drupal 7.
Первое знакомство с модулем
Структура модуля Views построена достаточно понятно. Как только Вы установили и включили модуль, у Вас уже должна быть доступна страница со списком всех Вьюшек. Вьюшка — это неделимая единица модуля. Можно сопоставить ее с клеткой в организме человека, то есть клетку мы больше уже поделить никак не сможем. Аналогичная ситуация и с вьюшкой. Также, в переводах можно найти слово “Представление”. Если Вы нашли такое слово, то не пугайтесь, представление — это тоже самое что и вьюшка. Список вьюшек находится на странице “Administration / Structure / Views”. Для примера, ссылка на список будет следующая: “example.com/admin/structure/views”. На странице вы увидите уже готовые шаблоны вьюшек, которые были в комплекте вместе с модулем Views. Данные примеры находятся в выключенном состоянии. Если вьюшка выключена, то она находится в списке, ее можно редактировать, но просмотреть ее работу на сайте невозможно. У меня страница со списком вьюшек выглядит так:
Тонкая настройка
Сразу же после установки я рекомендую включить пару опций, которые откроют нам некоторые возможности модуля. Данные опции необязательны, они всего лишь дают нам дополнительные возможности. Страница настроек модуля находится во вкладке Settings, которая размещается на странице списка вьюшек (сверху справа), найти ее можно и по ссылке “/admin/structure/views/settings”. На странице настроек модуля Views нужно проставить 2 галочки, это “Always show the master display” и “Show the SQL query”. Опция “Always show the master display” будет показывать нам стандартный дисплей по умолчанию (про дисплеи еще будем говорить). Опция “Show the SQL query” показывает нам запрос к Базе Данных.
Создание вьюшки
Вернитесь назад на список всех вьюшек. Перед началом таблицы со списком будет ссылка “Add new view”. Нажмите на эту ссылку. Перед Вами появится форма:
Разберем каждое поле формы.
View name Здесь записывается имя самой вьюшки. Когда Вы начнете вводить текст в это поле, то справа увидите заполнение машинного имени вьюшки. Машинное имя необходимо для каждой вьюшки. Оно служит для того, чтобы в базе данных вьюшка была уникальной.
Description По выбору Вы можете добавить описание к своей вьюшке. Если нажмете на галочку, то откроется дополнительное поле.
Show Эта опция имеет множество вариантов. Одним словом, с помощью модуля Views можно выводить почти все. Например, если Вы хотите выводить материалы, то нужно выбрать из выпадающего списка пункт Content. Далее предоставляется выбор типа материала (оf type), можно выбрать термины таксономии, которые используются в материалах (tagged with) и можно выбрать тип сортировки.
Create a page По умолчанию эта галочка отмечена, поэтому будет создана страница с вьюшкой (списком того, что выводится). Следовательно, странице нужно добавить заголовок, URL на страницу. Дальше стоит обратить внимание на типы отображения списков (Display format), о которых будем говорить позже. Справа от поля Display format можно выбрать то, что Вы хотите выводить. По умолчанию выводятся тизеры. Тизер — это краткое содержимое материала. Отображение содержимого тизера можно редактировать на странице настройки типа контента.
Если Вы не знакомы с работой над типами контента в Друпал, рекомендую просмотреть следующее видео Типы материалов и поля в Drupal 7.
Но для вывода вьюшки лучше выбрать из выпадающего списка опцию “fields”, то есть выводить только поля. Данная опция даст динамичность в настройке вывода полей и мы будем создавать вьюшку этой опцией. Далее, в поле “Items to display” вы можете задать количество выводимых едениц на странице. К примеру 10 материалов на страницу. Галочка “Use a pager” отвечает за включение пейджера на странице вьюшки. Галочка “Create a menu link” разрешает нам сразу же добавить нашу страницу вьюшки в выбраное Вами меню. Отметка “Include an RSS feed” создает еще дополнительный РСС фид для Вашего списка (так званая лента новостей, которая может читаться специальными сервисами или программами). Вы можете задать ссылку на вывод этого рсс фида, и также стиль вывода.
Create a block Эта опция создает дисплей типа “блок”. Здесь вы можете задать Заголовок блоку, настроить стиль вывода вьюшки, выбор в выводе. Еще здесь присутствуют настройки пейджера.
Мы будем создавать страницу. Перед сохранением, форма создания новой вьюшки выглядит так:
Здесь было проделано несколько операций:
Прописано название вьюшки как “Acticle”;
Из типов контента выбран пункт “Acticle” (данный тип контента по умолчанию есть в Друпал после установки);
В поле “Display format” выбран формат “Unformatted list” и выводятся поля (fields).
drupalguide.ru
Next, edit the .info file and add the following the line.
This line tells Drupal where to find and auto-load our field handler whenever Views needs it.
Now add this code inside “view_form_field_handler_title_edit.inc”:
<?php /** * @file * * A Views' field handler for editing a node title. * */ class view_form_field_handler_title_edit extends views_handler_field { function construct() { parent::construct(); $this->additional_fields['nid'] = 'nid'; $this->additional_fields['title'] = 'title'; } function query() { $this->ensure_my_table(); $this->add_additional_fields(); } } ?>
This is the basic class definition for your field handler. It extends “views_handler_field” and adds constructor and query methods to make sure the node id and title values are loaded into the view.
Now, add the following “render” method to the class…this is when a little magic happens.
<?php /** * @file * * A Views' field handler for editing a node title. * */ class view_form_field_handler_title_edit extends views_handler_field { ... function render($values) { // Render a Views form item placeholder. // This causes Views to wrap the View in a form. // Render a Views form item placeholder. return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->'; } ... } ?>
The render method returns the html (or other markup) to display for the field. To output a Views’ managed form field, you render an HTML comment in the form in this format: <!—form-item-FIELD_ID—ROW_INDEX—> This syntax mirrors the form array structure you’ll use to provide replacement form fields views. When Views’ sees that your field handler renders a comment like above, it will initialize and wrap a form around the view then call your handlers “views_form” method:
<?php class view_form_field_handler_title_edit extends views_handler_field { ... /** * Add to and alter the form created by Views. */ function views_form(&$form, &$form_state) { // Create a container for our replacements $form[$this->options['id']] = array( '#type' => 'container', '#tree' => TRUE, ); // Iterate over the result and add our replacement fields to the form. foreach($this->view->result as $row_index => $row) { // Add a text field to the form. This array convention // corresponds to the placeholder HTML comment syntax. $form[$this->options['id']][$row_index] = array( '#type' => 'textfield', '#default_value' => $row->{$this->aliases['title']}, '#element_validate' => array('view_form_field_handler_title_edit_validate'), '#required' => TRUE, ); } } ... } ?>
The “views_form” method allows you to alter the form created by Views. Add your field replacements by creating a container element with an index that matches the field id ($this->options[‘id’]). Then iterate over the view result and add a form field element to the container for every row in the view, using the row index as the element key in the container. Views matches this form array structure to the corresponding HTML comment to insert the field in the rendered View. In other words: <!—form-item-FIELD_ID—ROW_INDEX—> is replaced by:
<?php $form[FIELD_ID][ROW_INDEX]; ?>
The above “views_form” method adds a textfield to every row pre-filled with the node title. I’ve specified a “element_validate” handler to the field because Views doesn’t wire up a form-wide validate handler.
Create your element validation callback OUTSIDE the class but in the same .inc file so that it is available in the global context but is only loaded with the field handler:
<?php class view_form_field_handler_title_edit extends views_handler_field { ... } /** * Validation callback for the title element. * * @param $element * @param $form_state */ function view_form_field_handler_title_edit_validate($element, &$form_state) { // Only allow titles where the first character is capitalized. if (!ctype_upper(substr($element['#value'], 0, 1))) { form_error($element, t('All titles must be capitalized.')); } } ?>
This simple validator just makes sure that the node titles are always capitalized.
Finally, add a “views_form_submit” method to the field handler:
<?php class view_form_field_handler_title_edit extends views_handler_field { ... /** * Form submit method. */ function views_form_submit($form, &$form_state) { // Determine which nodes we need to update. $updates = array(); // Iterate over the view result. foreach($this->view->result as $row_index => $row) { // Grab the correspondingly submitted form value. $value = $form_state['values'][$this->options['id']][$row_index]; // If the submitted value is different from the original value add it to the // array of nodes to update. if ($row->{$this->aliases['title']} != $value) { $updates[$row->{$this->aliases['nid']}] = $value; } } // Grab the nodes we need to update and update them. $nodes = node_load_multiple(array_keys($updates)); foreach($nodes as $nid => $node) { $node->title = $updates[$nid]; node_save($node); } drupal_set_message(t('Update @num node titles.', array('@num' => sizeof($updates)))); } ... } ?>
The “views_form_submit” method works much like any Form API submit callback. In the case above, you iterate over the view result to identify submitted changes, then iterate over the changes to update the corresponding nodes.
A note about the use of “$this->aliases”: this is one way that Views ensures that different field handlers don’t collide. Think about it, the Views UI allows you to add any number of fields called “title”, any other form field handler, or even another instance of this handler. To allow this, Views indexes the result objects with unique field aliases, so you should use the syntax “$row->{$this->aliases[‘title’]}” when grabbing results to make sure you get the right “title”.
So that’s it. You’ve now created a View form. There are plenty of places to you could take this. You could easily substitute multiple form elements by adding additional fields to your container. You could use the Form API “#ajax” element to handle form submissions without a page refresh. You could include a submit button on every row and only allow one row to be updated at a time.
The example code is available in my Drupal.org sandbox. http://drupalcode.org/sandbox/krlucas/1872176.git/tree
This post was written by former Isoveran Kelly Lucas.
www.isovera.com
Дополнительные настройки дисплея Views для предотвращения перехвата несуществующих адресов и «отдачи» 404-й ошибки при доступе к ним
Но решить эту проблему можно и без помощи выше указанного модуля, благодаря дополнительным настройкам самого дисплея Views. Для этого необходимо немного настроить контекстные фильтры дисплея Views.
Вот что необходимо сделать (для универсальности пример настроек показан на англоязычном интерфейсе):
Добавить в контекстные фильтры дисплея фильтр по NID материала (рис. 1). рис. 1. Добавляем контекстный фильтр по NID материала к дисплею Views
Настроить добавляемый фильтр соотв. образом (рис. 2 и рис. 3):
В разделе «WHEN THE FILTER VALUE IS NOT IN THE URL» выбираем пункт «Display all results for the specified field» — это позволит ман не нарушать привычную логику работы дисплея при достпе к нему по его алиасу. рис. 2. Параметры в разделе WHEN THE FILTER VALUE IS NOT IN THE URL настроек контекстного фильтра
в разделе «WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED» выбираем чекбокс «Specify validation criteria«, и устанавливаем такие значения следующих параметров: Validator => Content; Filter value format => Node ID; Action to take if filter value does not validate => Show «Page not found» рис. 3. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED
Применяем указанные настройки.
Сохраняем представление.
Если Вам необходимо таким образом настроить дисплей Views, который отбирает не ноды а, например, термины таксономии, то добавлять фильтр надо по ID термина таксономии (Taxonomy term: Term ID), а значения из п. 2.2 должны быть такими (рис. 4):
Validator => Taxonomy term; Filter value format => Term ID; Action to take if filter value does not validate => Show «Page not found»
рис. 4. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED при отборе терминов таксономии
oushen.pro
Обратите внимание на некоторые детали:
Все методы класса EntityFieldQuery обычно связаны. То есть они возвращают измененный объект EntityFieldQuery. Вам можете быть знаком такой подход, например по аналогии с библиотекой jQuery.
Подобно построению запросов Drupal 7, методы EntityFieldQuery имеют операторы по умолчанию, которые они предполагают, и являются довольно гибкими с точки зрения того, какие значения они будут принимать. Так, например, propertyCondition() содержит оператор ‘=’, либо ‘IN’ в качестве оператора по умолчанию, в зависимости от того, передаете ли вы ему строку, число или массив в качестве значения сравнения. Конечно, если вы хотите использовать другой оператор сравнения, например: «<>» или «NOT IN» вы можете передать это явно.
Обратите внимание, что на данном этапе мы всё еще не запрашиваем поля. EntityFieldQuery начинает творить настоящую магию, в момент когда вы начинаете запрашивать значения поля, так как он сам заботится о поиске соответствующей таблицы поля и выполняет объединение данных в объект за вас.
EntityFieldQuery действительно мощный инструмент, но разумеется он не делает всю работу за нас. В данном проекте я использовал Organic Groups, и мне хотелось, чтобы мои запросы видели группы, не заставляя меня добавлять их каждый раз вручную. Кроме того, почти во всех случаях я запрашивал ноды, которые были опубликованы. К счастью, EntityFieldQuery — это обычный PHP класс, поэтому его очень легко расширить. Таким образом я создал наследование EnergyEntityFieldQuery.
class EnergyEntityFieldQuery extends EntityFieldQuery { /** * применяем некоторые значения по умолчанию ко всем экземплярам этого объекта */ public function __construct() { $this // выбираем ноды ->entityCondition(‘entity_type’, ‘node’) // Со статусом опубликованно ->propertyCondition(‘status’, 1) // по умолчанию меняем хронологический порядок ->propertyOrderBy(‘created’, ‘DESC’); /* make assumption that we want group content; see method below */ $this->setPrimaryAudienceCondition(); } /** * Вспомогательная функция для запросов по терминам словаря * Ищет по имени термина для удобства; tid тоже распознаётся. * * @param $topics * Строка, число или массив; при необходимости преобразуем в массив */ public function setTopicCondition($topics) { $topics = !is_array($topics) ? array($topics) : $topics; if (count($topics)) { // сли термин не является числовым, выполните поиск для каждого термина и замените его на tid foreach ($topics as $idx => $topic) { // попытаемся найти tid для нечисловых терминов if (!is_numeric($topic)) { // ищем $vocab = taxonomy_vocabulary_machine_name_load(‘topics’); $candidate_terms = taxonomy_get_term_by_name($topic); foreach ($candidate_terms as $candidate) { if ($candidate->vid == $vocab->vid) { $topics[$idx] = $candidate->tid; } } } } // field_topic_term - это наше поле со ссылкой на термин таксономии // как только мы преобразуем все наши термины в tid, мы устанавливаем их как числовое условие для нашего поиска $this->fieldCondition(‘field_topic_term’, ‘tid’, $topics); } return $this; } /** * Добавляем условие для поиска по полю первичной аудитории. * EnergyEntityFieldQuery предполагает, что мы хотим, чтобы контент соответствовал текущей группе. * Класс предоставит метод отмены * * @param $gid * An array or integer for the gid(s) to search the primary audience field * based on. If empty, will try to pull current group from the page context. */ public function setPrimaryAudienceCondition($gid = NULL) { if (empty($gid)) { $current_group = og_context_determine_context(); $gid = $current_group->gid; } if (!empty($gid)) { $this->fieldCondition(‘group_audience’, ‘gid’, $gid); } return $this; } /** * Unset group content conditions * * Use this method if you do not want to filter by group content. */ public function clearAudienceConditions() { foreach ($this->fieldConditions as $idx => $fieldCondition) { $field_name = $fieldCondition[‘field’][‘field_name’]; if (($field_name === ‘group_audience’) || ($field_name === ‘group_audience_other’)) { unset($this->fieldConditions[$idx]); } } return $this; } /** * If we’re currently on a node, and if the entity_type is node, exclude the local node from the query. * This prevents the node the user is viewing from showing up in queries. */ public function excludeNode($nid) { if (!$nid) { $object = menu_get_object(); $nid = $object->nid; } if (!empty($nid) && $this->entityConditions[‘entity_type’][‘value’] === ‘node’) { $this->propertyCondition(‘nid’, $nid, ‘<>’); } return $this; } }
Обратите внимание, что также можно переопределить защищенные методы самого EntityFieldQuery. Это может быть полезно, например, если у вас есть более сложные требования к параметрам, чем предоставляет EntityFieldQuery. Таким образом я обнаружил, что смог решить около 90% случаев использования вывода списков нод при помощи EnergyEntityFieldQuer.
Для одного из клиентов я создал простой пользовательский интерфейс, который позволяет передавать параметры классу, что позволяет конечному пользователю менять вывод запросов, например менять количество или категорию выводимых нод.
Давайте рассмотрим простой пример отображения выборки нод. Помните, что это не пример кода. Это реальный код, который я использую на продакшене.
Простая часть. Помните, что использование EnergyEntityFieldQuery позволяет нам ограничивать наши запросы содержимым определённой группы OG и задавать тип нод по умолчанию.
$query = new EnergyEntityFieldQuery();
Предположим, что нам нужны только ноды, которые являются скидками.
$query->entityCondition(‘bundle’, ‘rebate’);
EntityFeildQuery имеет встроенные функцию пагинации, которую очень просто добавить:
$query->pager(10);
Вытягиваем условия из строки запроса для создания фильтров на основе таксономии:
function energy_rebate_savings_search($filters = array()) { // Сопоставляем машинное имя словаря с именами полей для ссылок термина на этот словарь. $term_field_map = array( ‘rebate_provider’ => ‘field_rebate_provider’, ‘rebate_savings_for’ => ‘field_rebate_savings_for_short’, ‘rebate_eligibility’ => ‘field_rebate_eligibility_short’, ); // Получаем не ‘q’ параметры $params = drupal_get_query_parameters(); $param_filters = array(); foreach (array_keys($term_field_map) as $vocab) { if (isset($params[$vocab])) { $param_filters[$vocab] = $params[$vocab]; } } $filters = array_merge($param_filters, $filters); // устанавливаем условия для терминов если таковые имеются foreach ($filters as $filter => $value) { if ($value != 0) { $query->fieldCondition($term_field_map[$filter], ‘tid’, $value); } } // Выполняем запрос. $result = $query->execute(); // обработка и темизация не входит в часть этого примера }
Таким образом данная функция возвращает нам массив id нод (nids), которые соответствуют условиям, нашего запроса. Получив их, мы сможем обрабатывать этот список любым способом. Мой любимый метод заключается в использовании значительно расширенной концепции режимов просмотра Drupal 7, о которой я расскажу в следующей заметке. Что бы не оставлять вас с пустыми руками, дам вам подсказку, я использую модуль Bean, это модуль для замены блоков Views. Beans можно использовать для выполнения более гибкого подхода представления информации в блоках посредством API.
vivasart.com
Drupal без Views представить просто не возможно. Этот модуль пояляется на чистом дурпале одним из первых. И в процессе разработки сайта обрастает дополнительными модулями, которые так или иначе влияют на работу вьюсов, добавляют различные возможности для формирвоания, фильтрации, вывода содержимого.
P.S. Это краткий обзор модулей, которые можно использовать в союзе с Views 3, а не инструкции по установке, настройке и особенностями каждого из нижеперечисленных модулей. Поэтому, если вам нужна более подробная информация — не ленитесь изучить страницу проекта на drupal.org, почитать readme.txt к модулю и потестить его.
1. Views Hacks
Модуль Views Hacks представляет собой набор хуков, которые дают нам дополнительную функциональность: автоприменение фильтров, автообновление вьюсы через заданный веременной интервал, перевернутые таблицы и некоторые другие полезные плюшки.
2. Views Bulk Operations
Он же VBO. Позволяет совершать массовые действия с контентом. Штука куда более удобная, чем стандартная панелька управления контентом сайта.
3. Views UI: Edit Basic Settings
Вряд ли возможности модуля Views UI: edit basic settings вам понадобится для собственных сайтов. Но для клиентов, для которых редактирование своего сайта без привлечения разработчика (то бишь вас) — целая проблема, очень может помочь. Этот небольшой модуль позволит редактировать количество отображаемых материалов, пустой текст, содержимое подвала и шапки представления. Права для использования этих возможностей задаются администратором, поэтому вы можете дать доступ только к тем пунктам, изменение которых точно ничего не испортит на сайте. Кстати, модуль дружен с Wysiwyg. Так что клиента пользоваться своим сайтов вполне можно обучить.
4. Semantic Views
Semantic Views более актуален для Views 2, поскольку в 3 ветке модуля есть возможности управления стилями полей и строк вьюсы. Но все же модуль может пригодится: он позволяет управлять стилями через пользовательский интерфейс и избавляет от необходимости переопределять шаблоны вывода представлений.
5. Better Exposed Filter
Модуль better exposed filter дает возможность сделать формы фильтров во вьюсах более удобными для пользователя. Чекбоксы и радио-кнопки, возможность разом выбрать все или отменить выбор вовсе, поддержка автоприменения фильтра без лишних кнопок. Для фильтра типа «больше или меньше чем Х» или «от Х до Y» можно использовать jQuery Slider.
6. Views Global Filter
Views Global Filter — штука безусловно замечательная. Позволяет создавать глобальные фильры и применять их во все надлежащие вьюсы, находящиеся на одной или на разных страницах. Таким образом мы можем предложить пользователю выбор Города или страны, каких-либо характеристик и показывать ему уже на других страницах контент в соответствии с его выбором.
7. Views Autocomplite Filters
Если во вьюсе используются раскрытые фильтры, модуль Views Autocomplite Filters может вам очень пригодится. Для текстовых полей формы с фильтрами, которые предполагают ввод пользовательского текста, добавляется автопоиск содержимого по первым буквам и в выпадающем списке предлагаются имеющиеся варианты.
8. Views Infinity Scroll
Небольшой модуль Views Infinity Scroll дает альтернативный вариант стандартного пейджера вьюсы: при скроллинге страницы автоматически подгружает следующую порцию содержимого вьюсы. Модуль хорош, и я его использую. Правда есть неудобство — если я хочу перейти прямиком к подвалу сайта, находясь на «бесконечной» странице — приходится ждать, когда все X страниц подгрузятся. Поэтому поводу ищется альтернатива — чтобы подгружался контент не автоматом, а по нажатию кнопки типа «еще статей».
9. Views Load More
Похожий на предыдущий, Views Load More предлагает альтернативу стандартному пейджеру, а именно — загрузка следующей страницы по клику на ссылочку «Load More». По идее, содержимое следующей страницы должно подгружаться к уже открытому контенту. Однако тест модуля на живом сайте показал некоторую глюкавость решения. Так что замена Infinity Scroll на Load More отклаыдвается до решения суда, пока не разберусь что к чему.
10. Views Accordeon
JQuery плагин Accordeon в представлении не нуждается, собственно и назначение модуля Views Accordeon очевидно:
11. Views Ticker
Замечательный модуль, часто бывает очень кстати. Views Ticker предполагает выводить поля вьюсы в виде бегущей строки или «рулетки», плавно прокручивая заданное количество элементов. Есть несколько эффектов — затемнение, прокрутка вверх или вниз, собственно бегущая строка и BBC-style (примеры всех 5 возможных вариантов тут: viewsticker.inettity.com)
12. Views Fluid Grid
В отличие от классической сетки, Fluid Grid выводит строки вьюсы вот так:
Картину дополняет оформление элементов, хотя ясное дело — тюнинг дело сугубо индивидуальное, а так же возможность задать фиксированную ширину и высоту. То, что делает этот модуль можно сделать и руками, нехитрыми внедрениями в css.
13. Views Tooltip
Views Tooltip добавляет формат для вывода поля — в виде tooltip’а:
14. Views Horizontal Slider
Модуль Views Horizontal Slider умеет выводить вьюсу вот так:
Живой пример: drupal-demo.artwaves.de
Использование этого решения с текстом мне не особо нравится, а вот как вариант навигации в слайдере — очень даже годится. Более того, если проявить фантазию — можно добиться отличного результата.
15. Draggable Views
Название Draggable Views говорит само за себя: модуль позволяет создавать вьюсы, в которых элементы сортируются методом drag’n’drop. Често скажу — не тестировала, но модуль определенно вызывает интерес. Обязательно попробую его в деле.
Автора автора
myoversite.ru
Друпал за счет большого количества модулей, обладает огромным функционалом. Одним из модулей расширяющий возможности друпал, а в свою очередь и самым популярным, является Views. На просторах рунета, и всего русскоязычного общества знакомого с друпал, этот модуль носит множество имён, такие как «вьюха», «вьюз», «вьюшка», но мы в дальнейшем будем его просто называть «Представление».
Представление (views) – модуль друпал, помогающий верстальщику организовывать и выводить по собственному желанию, содержимое сайта. Этот модуль обладает широким встроенным функционалом, начиная от сортировки содержимого, заканчивая выводом содержимого и этот функционал можно при необходимости расширять при помощи других модулей.
Для того, чтобы мы могли впервые создать представление нам понадобится:
Сайт на друпал;
Установленные и включённые модули под названием Views и Views UI, которые можно скачать перейдя по этой ссылке.
Подготавливаем Drupal сайт к работе
В качестве примера я создал сайт с книгами. Сайт содержит:
Словарь таксономии «Жанр»
Второй словарь «Язык оригинала»
Новый тип материалла «Автор», который будет содержать поля:
Ф.И.О- напишем тут Инициалы автора
Об авторе – Интересную информацию об авторе
Фото – тип поля «Изображение»
Дата рождения – тип поля Date (Unix timestamp). Поле, которое подключается при помощи модуля Date, и как ясно из название необходимо для обозначения дат.
Ещё один тип материала «Книга». С полями:
Название книги – переименованное поле title
Аннотация – переименованное поле body
Обложка- тип поля «Изображение»
Жанр – тип поля «ссылка на термин»
Страна — тип поля «ссылка на термин»
Написал — поле типа «ссылка на материал», появляется после установки и включения модуля Reference, который даёт возможность ссылаться на другие типы материалов, в нашем случае мы будет ссылаться на автора.
Ну и конечно создадим несколько Книг и Авторов, для того чтобы было что «отображать».