Drupal → Написание своего Style plugin для Views 3

11.09.2012

Настройки стиля представления

Процесс написания своего style плагина для Views 3:

1. Реализуем хук hook_views_api(), в котором возвращаем версию Views API:

/**
 * Implements hook_views_api().
 */
function views_style_example_views_api() {
  return array('api' => 3);
}

2. В файле modulename.views.inc реализуем хук hook_views_plugins(), в котором возвращаем информацию о плагине:

/**
 * Implementation of hook_views_plugins().
 */
function views_style_example_views_plugins() {
  return array(
    'module' => 'views_style_example',
    'style' => array(
      // Системное название стиля.
      'example_style' => array(
        // Человекопонятное название стиля.
        'title' => t('Example style'),
        // Имя класса. Классы именуются по шаблону [modulename]_plugin_style_[stylename].
        'handler' => 'views_style_example_plugin_style_example_style',
        // Путь к папке с файлом класса. Необязательно, если файл лежит в корне модуля.
        'path' => drupal_get_path('module', 'views_style_example'),
        // Имя хука темизации для вывода контента.
        // Необязательно, если переопределён метод views_plugin_style::render().
        'theme' => 'views_style_example',
        // Список js файлов, которые необходимо подключить при выводе представления.
        // Пути указываются относительно корня Drupal. Необязательно.
        'js' => array(),
        // Тип плагина.
        'type' => 'normal',
        // TRUE если для этого стиля можно выбирать row plugin (Content, Fields и т.д.).
        'uses row plugin' => FALSE,
        // TRUE если можно использовать поля.
        'uses fields' => TRUE,
        // TRUE если у стиля есть настройки.
        'uses options' => TRUE,
        // TRUE если строки можно группировать.
        'uses grouping' => FALSE,
        // TRUE если нужно рендерить представление, даже при отсутствии данных.
        'even empty' => FALSE,
      ),
    ),
  );
}

3. В файле с именем, указанным в параметре handler и расширением .inc, реализуем логику хэндлера:

class views_style_example_plugin_style_example_style extends views_plugin_style {
  /**
   * Дефолтные настройки.
   */
  function option_definition() {
    $options = parent::option_definition();
    $options['example_option'] = array('default' => '');
    return $options;
  }
  
  /**
   * Форма настроек.
   */
  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $form['example_option'] = array(
      '#title' => t('Example option'),
      '#type' => 'textfield',
      '#default_value' => $this->options['example_option'],
    );
  }
}

4. Добавляем в файл .info информацию о новом хэндлере:

files[] = views_style_example_plugin_style_example_style.inc

5. Создаём файл шаблона с именем, указанным в параметр theme и расширением .tpl.php (нижние подчёркивания заменяются на тире), и выводим в нём данные задуманным способом:

<?php dsm($options['example_option'], 'example_option'); ?>
<?php dsm($rows, 'raw rows'); ?>
<?php dsm($view->style_plugin->render_fields($rows), 'rendered rows'); ?>

Исходники.
Пример плагина для вывода маркеров на карте Google.

Написанное актуально для
Views 3
Похожие записи

Комментарии

Гость
12.09.2012, 01:08

Очень полезная статья! Спасибо!

Скажите, как у вас отображены на главной страницы материалы, этим способом ?

Скажите как у вас на главной странице выведены node без views ?

стандартным способом - promote to frontpage

Хотелось вывести новости в левой части моего сайта в чистом виде, а не так как выводит в стандарте views, тут без снипета не обойтись верно ? было бы удобно иметь шаблон, в нем создать свою html разметку для этого вывода и вывести переменной этот шаблон, но я не видел решения этого способа, может подскажите что то ?

делаете запрос к базе, результат выводите любым способом

Здравствуйте! А можно ли в файле темизации как то вывести раскрытые фильтры представления ?

style-плагины не имеют никакого отношения к раскрытым фильтрам

Гость
05.10.2013, 05:42

Добрый день

Есть представление с сеткой.

Хотелось бы узнать, можно ли переопределить функцию template_preprocess_views_view_grid или правильнее будет создать свой style plugin ?

Спасибо

Гость
05.10.2013, 14:46

Схожих примеров не нашел, но что-то похожее уже приходилось делать.

Это должно быть что-то вроде этого или совсем не то ?

function mymodule_theme() {
  return array(
    'mymodule_template_preprocess_views_view_grid' => array(
      'arguments' => array('view' => NULL, 'grid' => NULL, 'row' => NULL),
      'template' => 'mymodule-template-preprocess-views-view-grid',
      'base hook' => 'template_preprocess_views_view_grid',
    ),
  );
}
Гость
06.10.2013, 14:32

Добрый день

Можете продемонстрировать пример, возможно у вас есть какие-то материалы на эту тему ?
Если это не очень трудно, можно было бы опубликовать решение.
А лучше всего отдельный материал, разом все стили views зацепит и для блога профит будет =)

Спасибо

Гость
07.10.2013, 05:47

Изначально пробовал имя_модуля_preprocess_views_view_grid

Вместо представления получал 'Array' внутри первого td

Получается что до определенного момента функция отрабатывает.

Также видел эту тему http://xandeadx.ru/blog/drupal/414

А что касается вашего предложения зарегистрировать функцию,
пробовал так

$theme_registry['views_view_grid']['preprocess functions'][] = 'имя_модуля_template_preprocess_views_view_grid';

Все равно 'Array' внутри первого td

Содержимое template_preprocess_views_view_grid() было скопировано из оригинала, без правок.

Возможно вы знаете в чем может быть проблема ?

Спасибо

Гость
08.10.2013, 15:05

Проблема была из-за отладочных функций.

Тем не менее спасибо за напоминание функции регистрации =)

Гость
09.10.2013, 13:59

Рано обрадовался )
Там снова 'Array'

Почему-то вместо отдельных $item , внутрь td попадает весь массив со всеми результатами.
Скопировано все с оригинальной функции.

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

Гость
28.10.2013, 00:41

Если вставить

      foreach ($result as $key => $value) {
        if ($key == $column_number) {
          $column_classes[] = $result[$key]->field_commerce_price[0]['rendered']['#price_direction'];
        }
      }

в файл theme.inc внутри модуля views, тогда все работает как и задумывалось.
Классы присваиваются каждому товару.

А переопределить через отдельную функцию не получается.

Гость
08.06.2014, 01:20

Как программно добавить options в настройки views style?

Гость
08.06.2014, 01:25

Уточню программно в уже существующий style , то есть что то типа alter есть?

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