xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

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

Процесс написания своего 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
Похожие записи

Комментарии RSS

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

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

нет

Спасибо!

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

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

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

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

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

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

Добрый день

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

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

Спасибо

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

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

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',
    ),
  );
}

Добрый день

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

Спасибо

по ссылке есть примеры

Изначально пробовал имя_модуля_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() было скопировано из оригинала, без правок.

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

Спасибо

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

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

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

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

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

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

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

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

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

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

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

есть конечно хук https://api.drupal.org/api/views/views.api.php/function/hook_views_plugi...
но лучше свой хэндлер написать)

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

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании