2012-01-10 2 views
1

У меня есть меню крюкhook_menu вопросы

$items['node/%/delete'] = array(
     'title' => 'Delete', 
     'load arguments' => array(3), 
     'description' => 'Confirm the action.', 
     'page callback' => 'drupal_get_form', 
     'page arguments' => array('_mymodule_delete', 1), 
     'type' => MENU_CALLBACK, 
     'weight' => -4, 
    ); 
return $items; 

Что мне нужно сделать, чтобы убедиться, что следующая функция получает на работу (и переменные получают свои значения):

function _mymodule_delete ($form, $form_state, $node) {
...
}

В других словах, как мне получить значения в трех приведенных аргументах ($form, $form_state и $node)

ответ

1

EDIT

Я еще раз попытать ...

Единственный аргумент (ы) вам необходимо пройти drupal_get_form, кроме названия самой формы, являются аргументы, специфичные для этой формы функции; $form и $form_state автоматически добавляются. Так что если вы хотите, чтобы вызвать форму с подписью _mymodule_delete($form, $form_state, $node) вы бы использовать этот код:

$form = drupal_get_form('_mymodule_delete', $the_node); 

При применении этого к маршрутизатору меню, все, что вы хотите сделать, это пройти загруженную $node через как Аналогичным образом аргумент равен drupal_get_form. Ваша деталь маршрутизатора будет выглядеть следующим образом:

$items['node/%node/delete'] = array(
    'title' => 'Title', 
    'page callback' => 'drupal_get_form', 
    'page arguments' => array('_mymodule_delete', 1), 
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK, 
    'weight' => -4, 
);  

Вашего оригинальный пример отсутствует атрибут access arguments/access callback, который сделает вашу страницу недоступной (403 статуса), поэтому я добавил в «стандартных» аргументах доступа access content. Вероятно, вы захотите изменить это для своих нужд.

Строка node/%node/delete (путь маршрутизатора) и массив аргументов страницы являются битами, которые вы, вероятно, интересуетесь здесь. Если вы хотите передать аргумент из URL-адреса в функцию обратного вызова, вы просто включаете его как «индекс» в качестве одного из аргументов страницы. Этот индекс исходит от нулевого массива пути маршрутизатора при разделении разделителем (/).

В этом примере три части пути являются:

0 => 'node', 
1 => '%node', 
2 => 'delete' 

Как изменяемый элемент пути находится в позиции индекса 1, это число мы переходим к page arguments массива.

Просто, чтобы сделать его немного более сложным, переменная передается через путь также может быть передан в функцию нагрузки перед тем она передается функции page callback. По какой-то причине соглашение об именах в Drupal заключается в том, что функция с именем переменной с добавленным к ней _load будет именем вызываемой функции.

Так что в этом случае вызывается node_load. Если ваш маршрут маршрутизатора был, например, books/%book, тогда вызывалась функция с именем book_load для подготовки переменной, которая должна быть передана функции page callback.

Функция загрузки является необязательной, если ваш путь был node/%/delete, тогда аргумент, переданный вашему обратному вызову формы, будет точной строкой (в данном случае идентификатором узла) из URL-адреса.

Я уверен, что вы его видели, но hook_menu() documentation изо всех сил пытается объяснить все это, я могу понять, почему это было бы сложно понять.

Надеюсь, что это поможет.

+0

Хорошо, боюсь, я дал плохой пример :) Я не нацелен на вариант удаления. Это был просто пример. Фактически, это настраиваемая функция в моем настраиваемом модуле. Это не имеет никакого отношения к удалению :) – Michiel

+0

Ах! Я отредактировал ответ выше с совершенно новым, надеюсь, что он делает трюк :) – Clive

+0

Святое дерьмо, это какой-то массивный ответ! Но это помогло мне намного больше, как документация Drupal. Бесконечно благодарен! Опять ... :) Еще два вопроса. Что мне нужно сделать, чтобы внести изменения в загруженный узел в функции '_mymodule_delete'? И какова реальная функция аргументов «обратного вызова»? Вы дали «доступ» и «контент», но каковы возможности и функции этих элементов? – Michiel

Смежные вопросы