Как мне получить доступ к аргументам страницы? - PullRequest
0 голосов
/ 30 ноября 2011

Я создаю пользовательский модуль в Drupal 7. У меня есть URL, который похож на «review / edit / 2»;Я хочу, чтобы этот номер был в конце URL.

Как я могу получить к нему доступ, используя hook_menu()?Небольшой фрагмент будет хорошо.

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Это очень простой пример, который передаст все после review/edit/ функции обратного вызова вашей страницы:

function mymodule_menu() {
  $items['review/edit/%'] = array(
    'title' => 'Title',
    'page callback' => 'mymodule_page_callback',
    'page arguments' => array(2),
    'access arguments' => array('access administration pages')
  );

  return $items;
}

function mymodule_page_callback($arg) {
  // For the URL review/edit/2, $arg is equal to 2
}
0 голосов
/ 30 ноября 2011

Вопрос фактически два вопроса:

  • Как получить доступ к аргументам страницы, которые передаются через 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 не определяет новые шаблоны.

...