hook_menu问题

时间:2012-01-10 16:03:12

标签: php function drupal

我有一个钩子菜单

$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 个答案:

答案 0 :(得分:1)

修改

我还有另一个去......

除了表单本身的名称之外,您需要传递给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传递给一个回调函数时,你只需将它的'index'作为一个页面参数包含在内。当分隔符(/)拆分时,此索引来自路由器路径的从零开始的数组。

在此示例中,路径的三个部分是:

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

由于路径的变量元素位于索引位置1,这就是我们传递给page arguments数组的数字。

为了使它更复杂一点,通过路径传入的变量也可以在传递给page callback函数之前传递给 。出于某种原因,Drupal中的命名约定是附加了_load的变量名称的函数将是被调用函数的名称。

所以在这种情况下,调用node_load。例如,如果您的路由器路径是books/%book,那么将调用一个名为book_load的函数来准备要传递给page callback函数的变量。

load函数是可选的,如果你的路径是node/%/delete,那么传递给你的表单回调的参数将是来自URL的确切字符串(在本例中是一个节点ID)。

我确定你已经看过了,但是hook_menu() documentation尽力解释这一切,我能理解为什么它很难理解。

希望有所帮助。