Drupal 7 views


Наверняка, многие, работающие с друпалом, знакомы с модулем Views. Как гласит Drupaler.ru, модуль Views — это Настройка и контроль за отображением любого типа контента в любом месте сайта, т.е. он позволяет создавать страницы, блоки, подменять содержимое нод, страниц пользователей и многое другое, формируя контент из любых доступных полей на сайте. Но что делать, когда необходимо вывести информацию, предоставляемую сторонним модулем, и к которой доступа из Views у нас нет?

Чтобы было понятно, далее всё на живом примере:

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

Задача: Отобразить в блоке количество новых сообщений и количество всех сообщений в папке «Входящие» текущего пользователя.

Решение: Написать модуль, который добавил бы в конструктор Views необходимые значения.

К сожалению на просторах интернета очень мало информации по этому поводу, а мануал по Views API довольно сложен и непонятен.

Итак, приступим.


  1. Создаем новый модуль.
    Как положено, создаем директорию, называем её именем нашего будущего модуля. Я назвал его privatemsg_extraviews.
    В директории создаем файлы privatemsg_extraviews.info, privatemsg_extraviews.module, privatemsg_extraviews.views.inc. Далее нам понадобится создать еще 2 файла, но об этом позже.
  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.

    Этого достаточно, чтобы друпал опознал наш модуль.

  3. 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.

  4. 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» — поэтому его тоже нужно скачать и установить. С этим думаю проблем у вас не должно возникнуть. А также для наглядности картины, вам нужно создать контент на сайте .Включаем модули в панели «Модули»

    Drupal 7 views

    Ставим галочки напротив «views» и «ctools» — сохраняем. Теперь в пункте «Структура» у вас должен появиться дополнительный пункт – «представления» (views).

    Drupal 7 views

    Переходим в него, и перед нами открывается панель представлений, те которые имеются в модуле уже по умолчанию.

    Drupal 7 views

    Нам они не интересны, поэтому кликаем по пункту «Добавить новое представление» и приступаем к созданию. Перед нами открылась страница, где нам нужно ввести первоначальные параметры «представления» или как говорят в сообществе drupal «вьюха». Замечу, что интерфейс модуля «views» для Drupal 6 и Drupal 7 кардинально отличаются.

    Drupal 7 views

    Первое, что нам необходимо это дать название представлению (желательно на английском), но если хотите на русском, то не забудьте отредактировать машинное имя представления, так как по умолчанию Drupal заносит туда заголовок представления.

    В пункте «показать» нужно выбрать, что мы хотим отобразить — в данном случае – это содержимое.

    В пункте «типа» — выбираем для какого типа нам нужно отобразить содержимое, у меня это «basic page».

    Ставим галочку создать страницу и прописываем в пункте «Заголовок страницы» будущее название нашей страницы, а в пункте «Путь» -url адрес нашей будущей страницы. Для решения нашей задачи – этого будет достаточно. Нажимаем сохранить и появится подтверждение, что представление сохранено.

    Drupal 7 views

    Теперь результат нашей работы можно посмотреть по тому адресу, который мы указывали при создании вьюхи, а именно

    Название_сайта/-newviews

    Drupal 7 views

    Это самый лёгкий вариант создания представлений по средством модуля «views». Далее в уроках я рассмотрю примеры как строить сложные представления, методы фильтрации, связи , аргументы и так далее. По этому модулю можно создавать отдельный сайт с его полным и подробным описанием.

    drupalfly.ru

    Модуль Views — это самый популярный модуль среди тех, что находятся на Drupal.org. В интернете недостаточно информации по освоению данного модуля. Давайте вместе попробуем изучить азы работы с этим модулем, и заглянуть в каждую ссылку, которая есть в настройках модуля Views.


    Установка

    Установка модуля Views ничем не отличается от установки других модулей. Для этого нужно:

    1. Скачать модуль ctools, он находится здесь. Данный модуль содержит необходимые инструменты для работы модуля Views.
    2. Скачать модуль Views, который находится здесь.
    3. Скопировать папки с модулями (они находятся в архивах с модулями) в папку, где должны находится модули Drupal, а именно “/sites/all/modules/”.
    4. Пройти на страницу управления модулей и включить следующие модули: Chaos tools, Views, Views UI. Ссылка находится на главной административной странице (Administration). Для примера, эта ссылка будет “example.com/admin/modules”.

    Если у Вас есть проблемы с установкой, советую проверить все по пунктам, или же просмотрите видео Установка модулей в Drupal 7.

     

    Первое знакомство с модулем

    Структура модуля Views построена достаточно понятно. Как только Вы установили и включили модуль, у Вас уже должна быть доступна страница со списком всех Вьюшек. Вьюшка — это неделимая единица модуля. Можно сопоставить ее с клеткой в организме человека, то есть клетку мы больше уже поделить никак не сможем. Аналогичная ситуация и с вьюшкой. Также, в переводах можно найти слово “Представление”. Если Вы нашли такое слово, то не пугайтесь, представление — это тоже самое что и вьюшка.
    Список вьюшек находится на странице “Administration / Structure / Views”. Для примера, ссылка на список будет следующая: “example.com/admin/structure/views”.
    На странице вы увидите уже готовые шаблоны вьюшек, которые были в комплекте вместе с модулем Views. Данные примеры находятся в выключенном состоянии. Если вьюшка выключена, то она находится в списке, ее можно редактировать, но просмотреть ее работу на сайте невозможно. 
    У меня страница со списком вьюшек выглядит так:

    Drupal 7 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”. Нажмите на эту ссылку.
    Перед Вами появится форма:

    Drupal 7 views

    Разберем каждое поле формы.

    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
    Эта опция создает дисплей типа “блок”. Здесь вы можете задать Заголовок блоку, настроить стиль вывода вьюшки, выбор в выводе. Еще здесь присутствуют настройки пейджера.

    Мы будем создавать страницу. Перед сохранением, форма создания новой вьюшки выглядит так:

    Drupal 7 views

    Здесь было проделано несколько операций:

    drupalguide.ru

    Next, edit the .info file and add the following the line.

    files[] = views/view_form_field_handler_title_edit.inc

    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.

    Вот что необходимо сделать (для универсальности пример настроек показан на англоязычном интерфейсе):

    1. Добавить в контекстные фильтры дисплея фильтр по NID материала (рис. 1).
      Drupal 7 views
      рис. 1. Добавляем контекстный фильтр по NID материала к дисплею Views
    2. Настроить добавляемый фильтр соотв. образом (рис. 2 и рис. 3):
      1. В разделе «WHEN THE FILTER VALUE IS NOT IN THE URL» выбираем пункт «Display all results for the specified field» — это позволит ман не нарушать привычную логику работы дисплея при достпе к нему по его алиасу.
        Drupal 7 views
        рис. 2. Параметры в разделе WHEN THE FILTER VALUE IS NOT IN THE URL настроек контекстного фильтра
      2. в разделе «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»
        Drupal 7 views
        рис. 3. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED
    3. Применяем указанные настройки.
    4. Сохраняем представление.

    Если Вам необходимо таким образом настроить дисплей 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»

    Drupal 7 views
    рис. 4. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED при отборе терминов таксономии

    oushen.pro

    Обратите внимание на некоторые детали:

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

    Drupal 7 views

    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 очевидно:

    Drupal 7 views

    11. Views Ticker

    Замечательный модуль, часто бывает очень кстати. Views Ticker предполагает выводить поля вьюсы в виде бегущей строки или «рулетки», плавно прокручивая заданное количество элементов. Есть несколько эффектов — затемнение, прокрутка вверх или вниз, собственно бегущая строка и BBC-style (примеры всех 5 возможных вариантов тут: viewsticker.inettity.com)

    12. Views Fluid Grid

    В отличие от классической сетки, Fluid Grid выводит строки вьюсы вот так:

    Drupal 7 views

    Картину дополняет оформление элементов, хотя ясное дело — тюнинг дело сугубо индивидуальное, а так же возможность задать фиксированную ширину и высоту. То, что делает этот модуль можно сделать и руками, нехитрыми внедрениями в css.

    13. Views Tooltip

    Views Tooltip добавляет формат для вывода поля — в виде tooltip’а:

    Drupal 7 views

    14. Views Horizontal Slider

    Модуль Views Horizontal Slider умеет выводить вьюсу вот так:

    Drupal 7 views

    Живой пример: drupal-demo.artwaves.de

    Использование этого решения с текстом мне не особо нравится, а вот как вариант навигации в слайдере — очень даже годится. Более того, если проявить фантазию — можно добиться отличного результата.

    15. Draggable Views

    Название Draggable Views говорит само за себя: модуль позволяет создавать вьюсы, в которых элементы сортируются методом drag’n’drop. Често скажу — не тестировала, но модуль определенно вызывает интерес. Обязательно попробую его в деле.

    Автора автора

    myoversite.ru

    Друпал за счет большого количества модулей, обладает огромным функционалом. Одним из модулей расширяющий возможности друпал, а в свою очередь и самым популярным, является Views. На просторах рунета, и всего русскоязычного общества знакомого с друпал, этот модуль носит множество имён, такие как «вьюха», «вьюз», «вьюшка», но мы в дальнейшем будем его просто называть «Представление».

    Страничное представление в Drupal 7

    Представление (views) – модуль друпал, помогающий верстальщику организовывать и выводить по собственному желанию, содержимое сайта. Этот модуль обладает широким встроенным функционалом, начиная от сортировки содержимого, заканчивая выводом содержимого и этот функционал можно при необходимости расширять при помощи других модулей.

    Для того, чтобы мы могли впервые создать представление нам понадобится:

    1. Сайт на друпал;
    2. Установленные и включённые модули под названием Views и Views UI, которые можно скачать перейдя по этой ссылке.

    Подготавливаем Drupal сайт к работе

    В качестве примера я создал сайт с книгами. Сайт содержит:

    1. Словарь таксономии «Жанр»
      Словарь таксономии жанр
    2. Второй словарь «Язык оригинала»
      Словарь таксономии язык оригинала
    3. Новый тип материалла «Автор», который будет содержать поля:
      1. Ф.И.О- напишем тут Инициалы автора
      2. Об авторе – Интересную информацию об авторе
      3. Фото – тип поля «Изображение»
      4. Дата рождения – тип поля Date (Unix timestamp). Поле, которое подключается при помощи модуля Date, и как ясно из название необходимо для обозначения дат.

      Тип материала Автор

    4. Ещё один тип материала «Книга». С полями:
      1. Название книги – переименованное поле title
      2. Аннотация – переименованное поле body
      3. Обложка- тип поля «Изображение»
      4. Жанр – тип поля «ссылка на термин»
      5. Страна — тип поля «ссылка на термин»
      6. Написал — поле типа «ссылка на материал», появляется после установки и включения модуля Reference, который даёт возможность ссылаться на другие типы материалов, в нашем случае мы будет ссылаться на автора.

      Тип материала книга

    5. Ну и конечно создадим несколько Книг и Авторов, для того чтобы было что «отображать».

    Подробнее о установке модулей

    vaden-pro.ru


    You May Also Like

    About the Author: admind

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.