пятница, 25 марта 2011 г.

Написание плагинов «стиля» и «рядка» для Views 2.

Доброго дня.
Как-то у меня стояла  задача  сделать фото-карусель под Drupal, решил попробовать сделать именно плагином, до сих пор делаю, потерял проект. Нашёл хорошую статью по Views, перевёл её, как смог. Ссылку выложу, когда буду переводить остальные части. Плагин пытаюсь писать уже под Drupal7, Views3, решил переделать хороший модуль semantycviews..., так как по данной статье у меня не работает, хотя сравниваю, отличий почти нет. Сделаю, отпишусь.

API версии Views 2 значительно изменился от версии Views 1. Модуль был реорганизован, он стал более объектно ориентированным, основные концепции остались такими же. Вы используете модуль  Views UI как  динамический построитель запросов, для получения списка записей, основанных на полях, аргументах, фильтрах и параметрах сортировки, которые стилизируются и выводятся в различных вариантах. Вы используете плагины стиля для отображения записей любых типов в любом формате, от HTML таблицы до экзотических форматов, основанных на XML и JSON.  В этом примере я пройдусь по шагам и попытаюсь создать новый плагин для преобразования информации записей в формат JSON data format и плагин строки, использованный плагином стиля.


Завершённый плагин стиля состоит из компонентов:
  1. Реализация hook_views_api, Views загрузит ваши файлы;
  2. Реализация hook_views_plugins для объявления плагина стиля;
  3. Реализация views_plugin_style класса;
  4. Функция предварительной обработки стиля темы.;
  5. Тема .tpl.php.
Напоминание: Если вы добавляете код в в код, существующего модуля. Убедитесь, что кэш  cache_views очищен.
1)Объявление поддержки Views.
Views
2 требует использовать hook_views_api(), для того, чтобы  указать, что Ваш модуль предоставляет и какую версию API использует. Обычно, hook_views_api() должен быть определён в файле module_name.module file.

/**
* Implementation of hook_views_api().
* @return Array with Views API version.
*/
function views_json_views_api() {
  return array('api' = > 2.0);
}
2)Объявление плагинов.
Views
2 ищет плагины предоставленные модулем в файлах с названиями module_name.views.inc. Они могут находится в директории модуля, или в определённых в коде поддиректориях. Мой модуль будет называться views_json, тогда  в каталоге views_json находится файл views_json.views.inc. Где в версии  Views 1.x объявлялись плагины стиля в реализации hook_views_style_plugins,  в версии Views 2 все плагины определяются в реализации hook_views_plugins, указывая тип плагина, как название ключа массива, в котором находится описание плагина.

/**
* Implementation of hook_views_plugins
*
*
*/
function views_json_views_plugins() {
  return array(
    'style' => array( //declare the views_json style plugin
      'views_json' => array(
        'title' => t('JSON data document'),
        'theme' => 'views_view_json',
        'help' => t('Displays nodes in the JSON data format.'),
        'handler' => 'views_plugin_style_json',
        'uses row plugin' => TRUE,
        'uses fields' => TRUE,
        'uses options' => TRUE,
        'type' => 'normal',      
      ),
    ),
    'row' => array( //declare the unformatted row plugin
      'unformatted' => array(
        'title' => t('Unformatted'),
        'help' => t('(Displays the unformatted data for each row from the views query with each row on a new line. Set as | for views_json.'),
        'handler' => 'views_plugin_row_unformatted',
        'theme' => 'views_view_row_unformatted',
        'uses fields' => TRUE,
        'uses options' => TRUE,
        'type' => 'normal',
      )
     ) 
  );
}

В этом случае, определён плагин стиля с названием views_json и плагин строки с названием unformatted. Плагин стиля строки нам необходим так, как необходимо получить неотформатированный текст для каждой строки, которые возвращает запрос views. Плагин строки добавляет много форматированного html поумолчанию, в чём нет необходимости.
3)Реализация views_plugin_style и views_plugin_row. 
 Хорошо что в Views 2 реализованы плагины по умолчанию поставляемые как родительские классы views_plugin, всегда есть возможность посмотреть как они реализованы – это хорошее руководство, что б создавать свои плагины. Я создал класс views_plugin_style_jsonviews_plugin_style_json.inc) полученное от views_plugin_style:

/*
* Implementation of views_plugin_style
*
*/

class views_plugin_style_json extends views_plugin_style {
 
  /*
   * Set default options
   */
  function option_definition() {
    $options = parent::option_definition();
    $options['format'] = array('default' => 'Exhibit');

    return $options;
  }
 
  /**
   * Provide a form for setting options.
   *
   * @param array $form
   * @param array $form_state
   */ 
  function options_form(&$form, &$form_state) {
    $form['format'] = array(
      '#type' => 'radios',
      '#title' => t('JSON data format'),
      '#options' => array('Exhibit' => t('MIT Simile/Exhibit'), 'Canonical' => t('Canonical'), 'JSONP' => t('JSONP')),
      '#default_value' => $this->options['format'],
    );
  }

}

Если вы интересуетесь

/*
* Implementation of views_plugin_style
*
*/

class views_plugin_style_json extends views_plugin_style {
 
  /*
   * Set default options
   */
  function option_definition() {
    $options = parent::option_definition();
    $options['format'] = array('default' => 'Exhibit');

    return $options;
  }
 
  /**
   * Provide a form for setting options.
   *
   * @param array $form
   * @param array $form_state
   */ 
  function options_form(&$form, &$form_state) {
    $form['format'] = array(
      '#type' => 'radios',
      '#title' => t('JSON data format'),
      '#options' => array('Exhibit' => t('MIT Simile/Exhibit'), 'Canonical' => t('Canonical'), 'JSONP' => t('JSONP')),
      '#default_value' => $this->options['format'],
    );
  }

}
Реализацию класса views_plugin_style смотрите here. Большинство шаблонного кода по настройке плагина стиля уже реализовано в родительском классе, необходимо реализовать только свою логику (+1 for OO). Данная реализация выводить только форму настройки, в которой пользователи могут выбрать формат вывода. My implementation does only one custom thing - provide a form for users to select the JSON format they want to render. Форма реализована в options_form.
Настройки по создаю формы похожи Form API. Настройки могут быть различными.

Table style options form

Форма настройки плагина стиля.
В следующем вареанте используется ьоклее продвинутая форма настройки плагина JSON, что позволяет пользователям выберать какие поля перобразовывать и с различными названиями полей.
Используется тотже плагин, расширяется views_plugin_row внутри views_plugin_row_unformatted.inc:

/*
* Implementation of views_row_plugin
*
*/
class views_plugin_row_unformatted extends views_plugin_row {
   
   /strong>
     * Set default options.
     */
  function option_definition() {
    $options = parent::option_defnition();
    $options['separator'] = array('default' => '|');
  }

  /**
   * Provide a form for setting options.
   */
  function options_form(&$form, &$form_state) {
    $fields = $this->display->handler->get_option('fields');
    $options = array();
    foreach ($fields as $field => $info) {
      $handler = views_get_handler($info['table'], $info['field'], 'field');
      if ($handler) {
        $options[$field] = $handler->ui_name();
      }
    }
 
    $form['separator'] = array(
      '#title' => t('Separator'),
      '#type' => 'textfield',
      '#size' => 10,
      '#default_value' => isset($this->options['separator']) ? $this->options['separator'] : ',',
      '#description' => t('The separator is placed between fields.'),
    );
  }
 
}

Сдесь также пользователю возможно выбрать разрграничитель полей.
4) (необязательно) релизация template_preprocess_
Внутри template_preprocess_  устанарвливаются переменные, которые доступны в шаблоне .tpl.php.Возможно отредактировать переменные перед тем как они пойдут дальше в шаблон. Больше прочитать об template_preprocess функция можно сдесь http://drupal.org/node/223430. Расширяем класс views_plugin_style - метод определён сдесь  this method :

function render() {
     if (empty($this->row_plugin)) {
       vpr('views_plugin_style_default: Missing row plugin');
       return;
     }
     $rows = array();
     foreach ($this->view->result as $row) {

       $rows[] = $this->row_plugin->render($row);
     }
     return theme($this->theme_functions(), $this->view, $this->options, $rows);
   }

theme_functions() возвращает полный список возможных шаблонов, которые могут использоваться этим стилем. render() – то что вызывается для отображения плагина стиля. Дополнительно к переменным мы определяем ваши функции предварительной обработки. Важно, что все переменные передаются в шаблон автоматически, как $rows.  Сделаем шаблон стиля. Если вам не нужны никакие другие переменные, кроме $rows и $options, вы ничего не собираетесь модифицировать, можете опустить функцию предварительной обработки, что будет достаточно для нашего простого примера.
Наш plugin template_preprocess – функция предварительной обработки шаблона  (внутри views_json.module):

/**
* Theme preprocess function for views-view-row-unformatted.tpl.php
*/
function template_preprocess_views_view_row_unformatted(&$vars) {
  $view = $vars['view'];
  //print('preprocess');
  // Loop through the fields for this view.
  foreach ($view->field as $id => $field) {
    if (!empty($field->handler) && is_object($field->handler)) {
      $object = new stdClass();
      $object->content = $field->handler->theme($vars['row']);
      if (isset($field->handler->field_alias) && isset($vars['row']->{$field->handler->field_alias})) {
        $object->raw = $vars['row']->{$field->handler->field_alias};
      }
      else {
        $object->raw = NULL; // make sure it exists to reduce NOTICE
      }
      if (!empty($vars['options']['separator']) && $object->content) {
        $object->separator = filter_xss_admin($vars['options']['separator']);
      }
      $object->handler = $field->handler;
      $object->class = views_css_safe($id);
      $object->label = check_plain($field->handler->label());
      $vars['fields'][$id] = $object;
    }
  }
}

Смотрится сложным. Помните, что версия Views 2 очень OO. Плагины строк автоматически поставляют массив переменных  - $fieldsв шаблон темы, где содержатся значения строк, которые должны быть преобразованы. В них также есть методы render() и theme_functions() наследованные от views_plugin_row class. Перед тем как шаблоны тем преобразуют строки, мы можем модифицировать поля -  $vars['fields'] массив.
5) Создайте файл шаблона .tpl.php для каждой темы.
Модуль должен содержать шаблоны тем с расширениями .tpl.php для каждой темы, которые объявлены в hook_views_plugins. В этом случае файлі называются views-view-json.tpl.php шаблон плагина стиля и views-view-row-unformatted.tpl.php – шаблон плагина строки.  Темы хранятся в директории /sites/all/modules/views/theme/.


Комментариев нет:

Отправить комментарий