Динамические пути страниц


Опубликовано пн, 10/03/2011 - 01:44 пользователем iflight

Теги 

Drupal 7, hook, Drupal API
Tweet
Динамические пути страниц

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

Что за динамические пути? Это пути вида site.ru/page/1, site.ru/page/2 и так далее, в которых часть пути является каким-то динамическим параметром. Пример таких путей - это ноды или страницы пользователей. Для того, чтобы создать страницы с подобными путями нужно реализовать hook_menu следующим образом:

function dinamicurl_menu() {
    $items['mytestpage/%'] = array(
        'title' => 'My test page',
        'page callback' => 'url_page_callback',
        'access callback' => TRUE,
        'page arguments' => array(1),
        'type' => MENU_CALLBACK,
    );
        return $items;
}

/**
* Page callback.
**/

function url_page_callback($var = NULL) {
    if (is_numeric($var)) {
            return t('Number in url - @var',array('@var' => $var));
    } else {
            return t('Letters in url - @var',array('@var' => $var));
    }
}

Если установить модуль с таким кодом, то, перейдя по ссылке site.ru/mytestpage/1 откроется страница с надписью "Number in url - 1", а при переходе по ссылке site.ru/mytestpage/qwert - страница с надписью "Letters in url - qwerty".

Для того, чтобы передать динамический параметр в функцию обратного вызова, необходимо указать его в page arguments, так как "%" стоит на втором месте в адресе, то в данном случае надо указать array(1).

Так же, передаваемые в функцию обратного вызова данные можно предварительно изменить воспользовавшись функцией загрузки, например так:

function dinamicurl_menu() {
    $items['mytestpage/%my_test_func'] = array(
        'title' => 'My test page',
                'page callback' => 'url_page_callback',
        'access callback' => TRUE,
                'page arguments' => array(1),
        'type' => MENU_CALLBACK,
    );
        return $items;
}

/**
* Page callback.
**/

function url_page_callback($var = NULL) {
   
        return t('Length of "@value" is @len',$var);
}
function my_test_func_load($var) {
   
        return array('@len' => strlen($var),'@value' => $var);

}

Если Drupal видит после символа "%" строку, то он добавляет к этой строке "_load" и ищет функцию с таким названием, чтобы в ней обработать переменную. В примере функция загрузки возвращает массив, который в свою очередь уже передаётся в callback функцию. Например, так передаются объекты с нодой ($node) при переходе на страницу node/1.

Если необходимо передать в функцию загрузки дополнительные параметры, то их необходимо указать в атрибуте 'load arguments', массива с настройками элемента меню.

Так как Drupal не знает заранее настоящего пути к создаваемой странице, то и не может отобразить в меню ссылку на данную страницу. Однако, с помощью функции to_arg() можно указать Друпалу, чем заменить динамический элемент, например так:

function dinamicurl_menu() {
    $items['mytestpage/%my_test_func'] = array(
        'title' => 'My test page',
        'page callback' => 'url_page_callback',
        'access callback' => TRUE,
        'page arguments' => array(1),
        'type' => MENU_NORMAL_ITEM,
    );
        return $items;
}

/**
* Page callback.
**/

function url_page_callback($var = NULL) {
   
        return t('Length of "@value" is @len',$var);
}
function my_test_func_to_arg($var) {
        return '1';
}

Теперь Друпал создаст элемент меню с адресом "/mytestpage/1".

Вот в принципе и все о динамических адресах, осталось разобраться с правами доступа и настройкой меню, но это в следующий раз, до встреч и удачи! :)

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