Урок - Views API - работа с представлениями в Drupal 6

Главная » Курсы » Курс Drupal 6, Разработка модулей. » Урок - Views API - работа с представлениями в Drupal 6

Обучающий онлайн курс
Drupal 6, Разработка модулей.

Лицензия: Копирование запрещено.

Введение в модуль Views

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

А еще модуль Views обладает определенным API для программной работы с представлениями. Разработчики могут вызывать представления внутри модулей, модифицировать отображение представлений и даже программно создавать новые представления.

Пошаговый пример по работе с модулем Views

Рассмотри пример работы с модулем Views, а затем перейдем к теоретической части.

Условимся, что наш модуль называется ramech и он установлен. Итак...

  • В основном файле модуля ramech.module добавьте реализацию хука hook_views_api():
    /**
     * hook_views_api - регистрирует модуль во Views API
     */
    function ramech_views_api() {
      return array(
        'api' => 2,
        'path' => drupal_get_path('module', 'ramech') .'/views',
      );
    }
    Здесь
    • api - версия API модуля Views.
    • path - путь к файлам, которые будут взаимодейстовать с API модуля Views.
  • Добавляем таблицу в базу данных:
    Мы не используем Scheme API для добавления таблицы, т.к. в пределах темы урока это не существенно. Однако при создании модулей рекумендуем использовать Scheme API для создания таблиц в базе данных.
    CREATE TABLE IF NOT EXISTS `ramech_views` (
      `rvnid` int(11) NOT NULL,
      `numeric_field` int(11) default NULL,
      `text_field` varchar(32) default NULL,
      `boolean_field` int(1) default NULL,
      `timestamp_field` int(11) default NULL,
      PRIMARY KEY  (`rvnid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • Создайте в папке модуля папку views - в ней будем хранить все файлы связанные со views. Как указано выше, в параметре path хука hook_views_api().
  • Создайте в папке views файл ramech.views.inc.
  • Добавьте в файл ramech.views.inc следующий код ( много букаф =^.^= ):
    /**
     * Implementation of hook_views_data().
     */
    function ramech_views_data(){
      return array(
        'ramech_views' => array(
    	  'table' => array(
    	    'group' => t('Ramech Views Table'),
    		'join' => array(
              'node' => array(
                'left_field' => 'nid',
                'field' => 'rvnid',
    		  ),
            ),
    	  ),
          'rvnid' => array(
            'title' => t('rvnid'),
            'help' => t('References a node.'),
            'relationship' => array(
              'base' => 'node',
              'field' => 'nid',
              'handler' => 'views_handler_relationship',
              'label' => t('Example node'),
            ),
    	  ),
          'text_field' => array(
            'title' => t('Text field'),
            'help' => t('Help for text field.'),
            'field' => array(
              'handler' => 'views_handler_field',
              'click sortable' => TRUE,
            ),
            'sort' => array(
              'handler' => 'views_handler_sort',
            ),
            'filter' => array(
              'handler' => 'views_handler_filter_string',
            ),
            'argument' => array(
              'handler' => 'views_handler_argument_string',
            ),
          ),
    	  'numeric_field' => array(
            'title' => t('Numeric field'),
            'help' => t('Help for numeric field.'),
            'field' => array(
              'handler' => 'views_handler_field_numeric',
              'click sortable' => TRUE,
             ),
            'filter' => array(
              'handler' => 'views_handler_filter_numeric',
            ),
            'sort' => array(
              'handler' => 'views_handler_sort',
            ),
          ),
          'boolean_field' => array(
            'title' => t('Boolean field'),
            'help' => t('Help for on/off field.'),
            'field' => array(
              'handler' => 'views_handler_field_boolean',
              'click sortable' => TRUE,
            ),
            'filter' => array(
              'handler' => 'views_handler_filter_boolean_operator',
              'label' => t('Published'),
              'type' => 'yes-no',
            ),
            'sort' => array(
              'handler' => 'views_handler_sort',
            ),
          ),
    	  'timestamp_field' => array(
            'title' => t('Timestamp field'),
            'help' => t('Help for timestamp field.'),
            'field' => array(
              'handler' => 'views_handler_field_date',
              'click sortable' => TRUE,
            ),
            'sort' => array(
              'handler' => 'views_handler_sort_date',
            ),
            'filter' => array(
              'handler' => 'views_handler_filter_date',
            ),
          ),
    	),
      );
    }

    hook_views_data() должен вернуть массив описывающей взаимодействие нашего модуля с модулем Views: поля, индексы, по которым можно подключится, обработчки для создании представлений.

    Теперь разберем подробнее структуру:

    return array(
        'ramech_views' => array(
    	  'table' => array(
    	    'group' => t('Ramech Views Table'),
    		'join' => array(
              'node' => array(
                'left_field' => 'nid',
                'field' => 'rvnid',
    		  ),
            ),
    	  ),
    	  ...
    • ramech_views - имя нашей таблицы.
    • в ключе table - указываются параметры относятся к таблице ramech_views.
      • в ключе tablegroup - указывается название группы. Отображается при добавлении фильтров, аргументов и других параметров представления.
      • в ключе tablejoin - указываются параметры присоедиения (JOIN) к базовым таблицам, таким как {users}, {node}, ...
      • ключ node - в данном случае указывает, что наша таблица может присоединятся к таблице {node}.
        • в ключе tablejoin → node → left_field указывается первичный ключ базовой таблицы, в нашем случае это nid.
        • в ключе tablejoin → node → field указывается ключ из таблицы ramech_views по которому идет привзяка, в нашем случае rvnid.

    Далее в структуре идет описание отдельных полей. Рассмотрим text_field:

    return array(
        'ramech_views' => array(
    	  ...
          'text_field' => array(
            'title' => t('Text field'),
            'help' => t('Help for text field.'),
            'field' => array(
              'handler' => 'views_handler_field',
              'click sortable' => TRUE,
            ),
            'sort' => array(
              'handler' => 'views_handler_sort',
            ),
            'filter' => array(
              'handler' => 'views_handler_filter_string',
            ),
            'argument' => array(
              'handler' => 'views_handler_argument_string',
            ),
          ),
    	  ...
    	);
    • ramech_views - имя нашей таблицы
    • text_field - имя поля для которого описываем структуру.
    • в ключе title - указываем название поля. Отображается при редактировании представления.
    • в ключе help - указываем краткое пояснение для поля. Отображается при редактировании представления.
    • в ключе field указываются параметры для обработки, при добавлении "поля"/"field" в представлении.
    • в ключе sort указываются параметры для обработки, при добавлении "сортировки"/"sort" в представлении.
    • в ключе filter указываются параметры для обработки, при добавлении "фильтра"/"filter" в представлении.
    • в ключе argument указываются параметры для обработки, при добавлении "аргумента"/"argument" в представлении.
    • в ключи handler добавляются обработчики, которые отвечают за обработку указанного действия. В данном примере мы используем стандартные обработчкики модуля Views.
    • ключ click sortable разрешает(TRUE)/запрещает(FALSE) сортировать по данному полю.
Если вы создали файл ramech.views.inc после того как включили модуль - очистите кэш, что бы Drupal принял изменения.

Хуки модуля Views

  • hook_views_api - регистрирует модуль во Views API.
  • hook_views_data - данный хук передает модулю Views информацию о таблицах, из которых Views может извлечь данные. Он определяет отношения между этими и другими таблицами в Друпале, чтобы модуль Views мог составить подходящие запросы.
  • hook_views_default_views - позволяет разработчикам модулей создавать собственные представления при установке модулей.
  • hook_views_handlers - этот хук делает две простые вещи: во-первых, позволяет разработчикам контролировать, как будет отображаться при создании представления интерфейс каждого поля. Во-вторых, он управляет отображением поля в самом представлении. Но у него есть и более сложные функции.
  • hook_views_plugins - модуль Views можно расширять новыми плагинами. Плагины могут вводить во Views новые способы вывода представлений (отображения, стили, строки), контроля за доступом к представлениям и валидации аргументов.
  • hook_views_post_render - пост-обработка данных в сгенерированном представлении.
  • hook_views_pre_execute - хук вызывается прямо перед запуском процесса. Запрос уже полностью сформирован, но еще не обработан функцией db_rewrite_sql.
  • hook_views_pre_render - этот хук вызывается перед процессом генерации представления. Запрос уже был выполнен, фаза pre_render() для хендлеров уже прошла, так что все данные должны быть доступны.
  • hook_views_pre_view - данный хук вызывается в самом начале обработки представления, прежде всего остального.

Приводите код в порядок

В целом нет никакой необходимости хранить весь код взаимодействия с модулем Views в одном файле. Это даже плохо - так как загрузка всего кода при каждой загрузке представления приведет к проблемам производительности. Но во Views API код может быть разделен на несколько файлов без особых трудностей; тогда для генерации представления будут загружаться только необходимые файлы.

Некоторые размышления привели к общим принципам структурирования кода в модулях так, чтобы с ними было легче работать. Ниже набросана небольшая схема для демонстрации обычного шаблона реализации кода Views.

  • В основной файл модуля (ramech.module) включить:
    • хук hook_views_api()
    • Изменяющие хуки: hook_views_pre_view(), hook_views_pre_execute(), hook_views_pre_render(), hook_views_post_render().
  • В файле *.views.inc (views/ramech.views.inc) включить хуки, которые передают данные и плагины представлениям
    • hook_views_data()
    • hook_views_handlers()
    • hook_views_plugins()
  • Файл *.views_default.inc (views/ramech.views_default.inc) содержит только один хук с определениями представлений
    • hook_views_default_views()

Другие важные функции, которые должен знать каждый разработчик

Наконец, Views API состоит не только из хуков, но и из небольших функций, облегчающих жизнь разработчику. Если вы планируете усиленно ковыряться во Views, стоит потратить время на тщательное исследование документации с целью лучшего понимания всего, что может предложить модуль Views. Вот некоторые из самых полезных функций, о которых должен знать каждый разработчик:

  • views_embed_view() - используйте эту функцию, чтобы отобразить представление на web-странице. Очень просто.
  • views_get_view - функция возвращает весь гигантский объект представления целиком. Используйте ее, когда хотите изменить основные параметры, связанные с представлением, без необходимости лезть в изменяющие хуки. Есть определенные вещи, которые нельзя модифицировать через изменяющие хуки, поэтому иногда эта функция представляется более кратким путем к цели.