Вопрос фактически два вопроса:
- Как получить доступ к аргументам страницы, которые передаются через URL?
- Как создать меню, которое используется для нескольких URL?
Ответ на первый вопрос заключается в том, что каждое число, которое используется для определения аргументов страницы обратного вызова меню (это также верно для аргументов доступа, аргументов заголовка и аргументов темы), заменяется эквивалентной частью пути.
Например, модуль может реализовать hook_menu()
, используя следующий код (пример используется в документации для hook_menu () ):
function mymodule_menu() {
$items['abc/def'] = array(
'page callback' => 'mymodule_abc_view',
'page arguments' => array(1, 'foo'),
);
return $items;
}
Когда пользователи обращаются к example.com/abc/def, аргументы, переданные обратному вызову страницы, являются "abc"
и "foo"
. Если бы я хотел передать 1 обратному вызову страницы, мне пришлось бы определить обратный вызов меню следующим образом:
function mymodule_menu() {
$items['abc/def'] = array(
'page callback' => 'mymodule_abc_view',
'page arguments' => array('1', 'foo'),
);
return $items;
}
В этом случае аргументами, передаваемыми обратному вызову страницы, являются "1"
и "foo"
, поскольку заменяются только числа, используемые в массиве аргументов. (Не содержит строк, которые можно привести к числам.)
Ответ на второй вопрос заключается в использовании подстановочных знаков для определения обратного вызова меню, которые бывают двух типов: универсальный % или подстановочный знак, связанный с функцией автозагрузчика (например, % узел , % пользователь ).
Используя подстановочные знаки, я могу определить обратный вызов меню, связанный с путем, таким как «test / event /%», который будет соответствовать более чем одному URL, например example.com/test/event/string example.com/test/ event / 234q3 или example.com/test/event/369014, где символ % заменяется любой строкой, состоящей из всех символов, до первой косой черты.
Используя подстановочный знак, такой как % node , значение, сопоставленное с подстановочным знаком, передается функции (в данном случае node_load () ), и значение, возвращаемое из этого значение передается обратному вызову страницы.
Когда ваш обратный вызов меню отвечает на путь, начинающийся с «просмотра / редактирования», я получаю, что последнее число - это идентификатор узла обзора, который необходимо редактировать; в таком случае я бы реализовал hook_menu()
, используя следующий код:
function mymodule_menu() {
$items['review/edit/%node'] = array(
'page callback' => 'mymodule_review_edit',
'page arguments' => array(2),
);
return $items;
}
function mymodule_review_edit($node) {
// $node contains the node object for the node ID passed in the URL.
}
Существует разница между использованием универсального подстановочного знака и использованием более конкретного подстановочного знака: когда функция автозагрузчика возвращает FALSE
, пользователь получает ошибку «страница не найдена». Это полезно для фильтрации неправильных аргументов. Например, если бы я вызывал функцию обратного вызова меню, которую я ранее определил с помощью example.com/review/edit/fersgdsf, я получил бы ошибку «страница не найдена», поскольку node_load()
не нашел бы узел с идентификатором, равным «fersgdsf» (идентификаторы узлов - это числа, а не строки). Мне не нужно было бы сначала проверять, что аргумент является целым числом, потому что node_load()
вернет FALSE
, когда не найдет узел с переданным идентификатором, что происходит, когда я передаю строку, которая не равна число.
Drupal 6 и выше определяет другие шаблоны, такие как % user , _% taxonomy_vocabulary_; список для Drupal 6 представлен в нижней части Использование подстановочных знаков и подстановочных знаков ядра , которые также объясняют, как использовать подстановочные знаки. Эта страница документации предназначена для Drupal 6, но она по-прежнему действительна для Drupal 7; Насколько я знаю, Drupal 7 не определяет новые шаблоны.