ertttert
До сих пор мы использовали в элементах меню обычные имена путей Drupal, такие как menufun
и menufun/farewell
. Однако в Drupal часто применяются пути вида user/4/track
или node/15/edit
, где части пути формируются динамически. Рассмотрим этот процесс подробнее.
Символ % играет в элементах меню Drupal роль обобщенного символа и означает, что точное значение определяется во время выполнения на основе символа в той позиции URL, где находится обобщенный символ. Вот элемент меню, в котором применяется обобщенный символ:
function menufun_menu() { $items['menufun/%'] =array( 'title' => 'Hi','page callback' => 'menufun_hello','access callback' => TRUE,) ;return $items; }
Этот элемент меню срабатывает для путей Drupal menufun/hi
, menufun/foo/bar
, menufun/123
и menufun/file.html
. Однако он не будет работать для пути menufun
— для такого пути необходимо написать отдельный элемент меню, потому что он содержит только одну часть, а выражение menufun/%
соответствует лишь строкам из двух частей. Символ %
часто применяется для обозначения числа (как в user/%/edit
для user/2375/edit
), однако он соответствует любому тексту в данной позиции.
Обобщенный символ в конце пути меню не мешает передаче дополнительных путей URL в обратный вызов пути, поскольку обобщенный символ соответствует тексту только до ближайшей наклонной черты. Вернемся к примеру пути menufun/%
: в адресе http://example.com/?q=menufun/foo/Fred
строка foo
соответствует обобщенному символу, а последняя часть пути (Fred
) передается в качестве параметра в обратный вызов страницы.
Чтобы использовать соответствующую часть пути, нужно указать номер этой части в ключе page arguments
:
function menufun_menu() { $items['menufun/%/bar/baz'] =array( 'title' => 'Hi','page callback' => 'menufun_hello','page arguments' =>array( 1) ,// Фрагмент, соответствующий обобщенному символу 'access callback' => TRUE,) ;return $items; }/** * Обратный вызов страницы. */ function menufun_hello( $name = NULL) {return t( 'Hello. $name is @name',array( '@name' => $name) ) ; }
Параметры, переданные функции обратного вызова страницы menufun_hello()
, будут такими, как показано на рис. 4.11. Первый параметр $name
передается с помощью обратного вызова страницы. Элемент array(1)
для обратного вызова страницы означает: “передать часть 1 пути, какой бы она ни была”. Нумерация начинается с 0, так что частью 0 будет menufun
, частью 1 — то, что соответствует обобщенному символу, частью 2 — bar
и т.д. Второй параметр $b
передается в соответствии с правилом передачи в Drupal части пути за пределами пути Drupal в качестве параметра (см. раздел “Аргументы обратного вызова страницы” ранее в главе).
На практике части пути Drupal обычно используются для просмотра или изменения какого-либо объекта — вроде ноды или пользователя. Например, путь node/%/edit
применяется для редактирования ноды, а путь user/%
— для просмотра информации о пользователе по его идентификатору. Рассмотрим элемент меню для последнего случая, который можно найти в реализации hook_menu()
в модуле modules/user/user.module.
URL, соответствующий данному пути, будет иметь вид, подобный http://example.com/?q=user/2375
. Такой URL предназначен для того, чтобы, щелкнув на нем, увидеть страницу My account (Моя учетная запись) на сайте Drupal.
$items['user/%user_uid_optional'] =array( 'title' => 'My account','title callback' => 'user_page_title','title arguments' =>array( 1) ,'page callback' => 'user_view_page','page arguments' =>array( 1) ,'access callback' => 'user_view_access','access arguments' =>array( 1) ,'weight' => -10,'menu_name' => 'user-menu', );
Когда среда Drupal создает меню на основе пути user/%user_uid_optional
, она заменяет фрагмент %user_uid_optional
согласно описанному ниже процессу.
%
с последующими символами до ближайшей наклонной черты. В данном случае это user_uid_optional
._load
для получения имени функции. В данном случае именем функции будет user_uid_optional_load
.http://example.com/?q=user/2375
, путем Drupal является user/2375
, и обобщенный символ соответствует второму сегменту — 2375. Поэтому производится вызов user_uid_optional_load('2375')
.array(1)
вместо передачи части 1 пути Drupal (2375) передается результат вызова user_uid_optional_load('2375')
— т.е. объект пользователя. Этот процесс можно рассматривать как замену части пути Drupal соответствующим объектом.user_view_access()
для доступа и user_view()
для генерации контента страницы, и в обоих вызовах будет передан объект пользователя 2375.Если функции загрузки необходимо передать дополнительные аргументы, их можно определить в ключе load arguments
. Ниже приведен пример из модуля node
— элемент меню для просмотра ревизии ноды. И идентификатор ноды, и идентификатор ревизии необходимо передать функции загрузки — в данном случае node_load()
.
$items['node/%node/revisions/%/view'] =В элементе меню для ключаarray( 'title' => 'Revisions','load arguments' =>array( 3) ,'page callback' => 'node_show','page arguments' =>array( 1, TRUE) ,'access callback' => '_node_revision_access','access arguments' =>array( 1) ,) ;
load arguments
указано значение array(3)
. Это означает, что в дополнение к значению обобщенного символа для идентификатора ноды, который передается функции загрузки автоматически, как было описано выше, передается еще один параметр, поскольку массив array(3)
содержит один элемент — целое число 3. Как было показано в разделе “Использование значения обобщенного символа”, это означает, что используется часть пути в позиции 3. Позиция и аргументы пути для примера URL http://example.com/?q=node/56/revisions/4/view
приведены в табл. 4.2.
Таблица 4.2. Позиция и аргументы для пути Drupal node/%node/revisions/%/view при просмотре страницы http://example.com/?q=node/56/revisions/4/view
Позиция | Аргумент | Значение из URL |
0 | node | node |
1 | %node | 56 |
2 | revisions | revisions |
3 | % | 4 |
4 | view | view |
load arguments
вместо вызова node_load('56')
выполняется вызов node_load('56', '4')
. При выполнении обратного вызова функция загрузки заменит значение '56
' загруженным объектом ноды, поэтому будет выполнен обратный вызов страницы node_show($node, NULL, TRUE)
.
%map
передает текущий путь Drupal в виде массива. В предыдущем примере значением %map
, которое передается в качестве аргумента загрузки, будет array('node', '56', 'revisions', '4', 'view')
. Значения отображения можно изменять с помощью функции загрузки, если в ней параметр объявлен как ссылочный. Поэтому в предыдущем примере значение элемента
будет равно 1, т.к. обобщенный символ находится в позиции 1 (см. табл. 4.2).
user/%
— ведь Drupal не знает, чем заменить символ %
. Однако это не совсем так. Можно определить вспомогательную функцию, которая выполняет замену обобщенного символа, и Drupal будет использовать эту замену при построении ссылки. В элементе меню My account (Моя учетная запись) путь для ссылки My account формируется с помощью следующих шагов.
user/%user_uid_optional
.user_uid_optional_to_arg()
. Если такая функция не определена, Drupal не может выяснить, как построить путь, и не выводит ссылку.user_uid_optional_to_arg()
возвращает идентификатор текущего пользователя, поэтому если это пользователь 4, то Drupal связывает ссылку My account с адресом http://example.com/?q=user/4.
to_arg()
не ограничивается лишь выполнением заданного пути: она вызывается при построении ссылки на любой странице, а не только на конкретной странице, которая соответствует пути Drupal для элемента меню. Ведь ссылка My account выводится на всех страницах, а не только при просмотре страницы http://example.com/?q=user/3
.
to_arg()
, которую ищет Drupal при построении ссылки для элемента меню, основывается на строке, следующей за обобщенным символом в пути Drupal. Это может быть любая строка, например:
Этот фрагмент помещает в блок навигации ссылку Hi с URL-адресом/** * Реализация hook_menu(). */ function menufun_menu() { $items['menufun/%a_zoo_animal'] =array( 'title' => 'Hi','page callback' => 'menufun_hello','page arguments' =>array( 1) ,'access callback' => TRUE,'type' => MENU_NORMAL_ITEM,'weight' => -10 );return $items; }function menufun_hello( $animal) {return t( "Hello $animal") ; }function a_zoo_animal_to_arg( $arg) {// $arg содержит '%', т.к. это обобщенный символ. // Заменим его животным из зоопарка. return 'tiger'; }
http://example.com/?q=menufun/tiger
. Обычно обобщенный символ не заменяется статической строкой, как в этом простом примере. Взамен функция to_arg()
используется для создания чего-то динамического, вроде идентификатора текущего пользователя или текущей ноды.
Всего комментариев: 1 | ||
| ||