Программная генерация страниц в Drupal 7

Опубликовано Опубликовано в рубрике API, Drupal, Drupal API 7, PHP

Не всегда генерацию страниц можно ограничить списком алиасов или каталогом. Иногда требуется нечто большее, чем встроенная автоматизация в CMS. Тогда на помощь приходит Drupal API. Речь пойдёт о том, как же с его помощью сгенерировать страницу с нужными параметрами программно.
Для этого мы научимся писать собственные модули для Drupal с преферансом и куртизанками!

Начнем с написания структуры модуля. В папке sites/all/modules создадим папку с именем, которое будет нести наш модуль в системе. Пусть это будет «mymod». Теперь внутри нее создадим два базовых файла, без которых не будет работать ни один модуль в Drupal: mymod.info и mymod.module. Первый — это техническое описание, второй — непосредственно код модуля.

Содержимое файла info будет примерно таким:

name = "mymod"
description = модуль свободной генерации страничек
core = 7.x
version = 7.x-0.1
files[] = mymod.module
package = mymod

В общем-то, тут все понятно, а потому перейдём к файлу module. Он содержит обычный PHP код.

Для генерации страницы мы будем использовать функцию Drupal API hook_menu(). Он не только создаст новую страничку, но и сгенерирует для нее сслыку в навигационном меню!

Как же это всё работает. Создадим «hello,world»-страничку:

function mymod_menu() {
    $items['staticpage'] = array(
        'title' => 'Test static page',
        'access callback' => TRUE,
        'page callback' => 'mymod_callback',
        'type' => MENU_CALLBACK,
    );
}

Разберемся в написанном. Как нетрудно увидеть, все параметры страницы хранятся в массиве items. По ключу staticpage создается страница с адресом site.ru/staticpage. У нее будет title «Test static page», к ней можно будет установить права доступа, её содержимое будет генерироваться с помощью функции mymod_callback, а в меню не будет создаваться ссылка на нашу страничку. Также, элемент с ключом type может принимать значения:
MENU_NORMAL_ITEM — обычный элемент меню;
MENU_SUGGESTED_ITEM — пункт меню, с подтверждения администратора;
MENU_LOCAL_ACTION — локальное действие;
MENU_LOCAL_TASK — локальная задача;
MENU_DEFAULT_LOCAL_TASK — локальная задача по умолчанию;

Теперь опишем функцию генерации контента

function mymod_callback() {
    return t('Hello, World!');
}

Здесь мы использовали встроенную функцию t(), которая отвечает за автоматический вывод текста на английском языке.

В итоге, по адресу site.ru/staticpage будет создана страница с содержимым «Hello, World!».

ЗАМЕЧАНИЕ: при каждом обновлении модуля не забывайте чистить кэш Drupal здесь admin/config/development/performance.

Но хук меню позволяет создавать не только статические адреса, но и адреса по маске. Например, мы хотим создать динамические страницы с адресами типа staticpage/1, /2 и т.д. Для этого в адресе используем вызов маски:

function mymod_menu() {
    $items['staticpage/%'] = array(
        'title' => 'Test static page',
        'access callback' => TRUE,
        'page callback' => 'mymod_callback',
        'type' => MENU_CALLBACK,
    );
}

Теперь по любому введенному после слеша выражению будет генерироваться страница. Каким образом? Решать Вам! Вы вправе прописать отдельные правила генерации для каждой маски!

Полное описание возможностей hook_menu() можно найти здесь.

Безошибочного Вам кода!

Программная генерация страниц в Drupal 7: 8 комментариев

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

  2. Дам ссылку на другую хорошую статью. http://www.drupal.ru/node/74258. Примерно с пункта 2.3 следует читать.

    Вкратце: мы добавляем некую форму для пользователя и описываем логику вывода пользовательской информации. В дополнение к этому стоит использовать хук hook_perm(), который задаст ограничения доступа.

  3. мммм наверное это не совсем то, что нужно.
    это, конечно, уже не по теме статьи, но я верю во всемогущество умных мужчин 🙂
    у меня страницы типа $items[‘staticpage/%’].
    я пыталась вывести форму стандартных комментариев, но как выяснилось, они привязываются не к урлу, а к ноде, что делает их не гибкими в плане динамичности.
    если бы вы подскажете что почитать, чтоб написать модуль типа комментариев или как расширить уже существующий модуль, буду очень признательна.
    хотя, мой запрос наверное уже на целую новую статью 🙁
    спасибо, за внимание.

    1. А какая разница, что добавляется — чекбоксы или инпуты? Это всегда суть форма, данные которой вносятся в БД. Потом можно выводить их средствами Drupal (что уже лучше) или «в лоб» — ручным sql-запросом при выставленных условиях вывода.

      1. Пардон, не заметил конца комментария)

        Да, комментарии статичны в плане своей привязки.

        Однако к урлу можно привязать вывод формы. Форма делается достаточно просто вместе с генерацией. Добавьте в шаблон условие вывода нужной формы по определенному урлу, затем с помощью чего-либо отправляйте данные в базу по какому-либо идентификатору. Допустим, если адрес staticpage/, то создайте таблицу с id и храните в ней привязанные к id комментарии.

        Вывод можно сделать тоже по-другому: в файле template.php опишите обращение к таблице БД, в которую «складывается» введенная пользователями информация. Положите её в массив и передайте в шаблон страницы. Я где-то описывал этот процесс. Во, вот тут. Массив с помощью foreach обрабатывается в шаблоне и выводит комменты.

        Навскидку как-то так.

Добавить комментарий для Александр Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *