Программное создание страницы в Drupal 7


Опубликовано пт, 09/23/2011 - 00:51 пользователем iflight

Теги 

Drupal 7, hook, Drupal API
Tweet
Программное создание страницы в Drupal 7

Наконец то продолжу рассказ про хуки. Что главное в любом сайте? Конечно же контент! А где контент находится? На страничках! Вот о создании страниц и поговорим.

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

Для программного создания страницы нам прежде всего понадобится создать пустой модуль, после чего весь код будет писаться в файле modulename.module.

hook_menu()

Именно с помощью этого хука можно создать страничку в Drupal 7. Кроме того он же отвечает за элементы меню. Хук не принимает никаких аргументов, а возвращает ассоциативный массив элементов меню, каждый элемент такого массива содержит массив с атрибутами конкретного элемента меню, они могут быть следующими:

  • title - заголовок элемента меню. Строка, которая будет отображаться в заголовке страницы и названии меню. Для неё не надо использовать функцию t(), но заголовок должен быть на английском языке. Обязательный элемент.
  • title callback - функция обратного вызова для генерации заголовка. По умолчанию используется функция t(). Удобна для создания динамических заголовков.
  • title arguments - аргументы для функции обратного вызова, генерации заголовка.
  • description - описание элемента меню.
  • page callback - название функции обратного вызова, для генерации страницы.
  • page arguments - массив аргументов, которые будут переданы функции обратного вызова.
  • delivery callback - функция доставки html в браузер. По умолчанию drupal_deliver_html_page().
  • access callback - функция обратного вызова для определения прав доступа к странице/ элементу меню. По умолчанию user_access()
  • access arguments - аргументы для функции определения прав доступа к элементу меню.
  • theme callback - функция возвращающая машинное имя темы, которая будет использованная на странице.
  • theme arguments - аргументы для "theme callback".
  • file - название файла, в котором находится функция page callback.
  • file path - путь к вышеназванному файлу. По умолчанию текущая директория модуля.
  • load arguments - аргументы для функции загрузки. Об этом подробней в ближайшее время:)
  • weight - вес элемента меню. Чем меньше, тем элемент выше.
  • menu_name - название меню, в котором будет размещен новый элемент.
  • context - определяет как будет отображаться ссылка в меню локальных задач, если является локальной задачей (local task). Может принимать одно из значений:
    • MENU_CONTEXT_PAGE - только на странице материала.
    • MENU_CONTEXT_INLINE - только как контекстная ссылка.

    Так же можно использовать конструкцию 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE

  • tab_parent - родительский элемент для локальной задачи. По умолчанию это элемент на уровень выше.
  • tab_root - ближайший элемент не являющийся локальной задачей. По умолчанию содержит значение заданное в tab_parent.
  • position - позиция блока для этого элемента на странице администраторского меню ('left' или 'right').
  • type - тип элемента меню. Может принимать следующие значения:
    • MENU_NORMAL_ITEM - обычный элемент меню.
    • MENU_CALLBACK - простая регистрация обратного вызова страницы, без создания элемента меню.
    • MENU_SUGGESTED_ITEM - пункт меню, который необходимо включить администратору.
    • MENU_LOCAL_ACTION - элемент меню является локальным действием.
    • MENU_LOCAL_TASK - элемент меню является локальной задачей
    • MENU_DEFAULT_LOCAL_TASK - локальная задача по умолчанию.

    Если значение не заданно, то используется MENU_NORMAL_ITEM.

  • options - массив опций для функции l(), с помощью которой генерируется html ссылки.

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

Реализация хука, создание страницы

С хуком немного разобрались, теперь можно его реализовать. Для этого в файле modulename.module, в простейшем случае, пишем следующий код:

/**
 * Implements hook_menu().
 */

function modulename_menu() {
    $items['mytestpage'] = array(
        'title' => 'My test page',
        'access callback' => TRUE,
        'page callback' => 'mymodule_page_callback',
        'type' => MENU_CALLBACK,
    );
}

Такая реализация хука значит следующее - по адресу site.ru/mytestpage (или site.ru/?q=mytestpage) будет отображаться страничка с заголовком 'My test page', доступная для всех. Элемента меню для неё заданно не будет, а содержимое новой страницы возвращает функция mymodule_page_callback(). Теперь необходимо написать саму функцию обратного вызова, например так:

/**
* Page callback.
**/

function mymodule_page_callback() {
    return t('Hello! I\'m your first page!');
}

Теперь если зайти по адресу site.ru/mytestpage (если включены "чистые ссылки", если нет, то заходим по адресу site.ru/?q=mytestpage) , то можно увидеть страничку с надписью "Hello! I'm your first page!". Элементарная страничка создана.

В функцию обратного вызова можно передавать параметры. Все следующие за указанным в хуке адресом параметры автоматически будут переданы в функцию обратного вызова. И если, например, изменить callback функцию так:

/**
* Page callback.
**/

function mymodule_page_callback($arg = 'Hello') {
    return t('@arg! I\'m your first page!',
            array('@arg' => $arg));
}

То зайдя на сайт по ссылке site.ru/mytestpage/yo, на странице появится "yo! I'm your first page!". Кроме того, массив аргументов можно передать в хуке, элементу page arguments и использовать таким же образом.

Это далеко не все возможности hook_menu() - с его помощью можно установить контроль доступа к странице, управлять ссылками меню, создавать страницы с динамическими адресами (например как node/1, node/2 и т.д.), но обо всем этом в следующий раз. А на сегодня всё, успехов и до скорых встреч!

Если вам понравился мой блог не забудте подписаться на RSS или мой микроблог в Twitter.