我正在Drupal 7中构建一个自定义模块。我有一个类似“review / edit / 2”的URL;我想在URL的末尾加上这个号码。
如何使用hook_menu()
访问它?一小段片段会很好。
答案 0 :(得分:1)
这是一个非常简单的示例,它会将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
}
答案 1 :(得分:0)
问题实际上是两个问题:
第一个问题的答案是,用于定义菜单回调的页面参数的每个数字(这对于访问参数,标题参数和主题参数也有效)将从等效部分替换路径。
例如,模块可以使用以下代码实现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"
,因为只替换了参数数组中使用的数字。 (它不包括可以转换为数字的字符串。)
第二个问题的答案是使用通配符来定义菜单回调,它有两种类型:通用%,或与自动加载器功能相关联的通配符(例如%节点,%user )。
使用通配符,我可以定义与路径相关的菜单回调,例如“test / event /%”,它将匹配多个URL,例如example.com/test/event/string example.com/test/ event / 234q3,或example.com/test/event/369014,其中%字符替换为由所有字符组成的任何字符串,直到第一个斜杠。
使用通配符(例如%node ),将从通配符匹配的值传递给函数(在本例中为node_load()),并传递从该值返回的值到页面回调。
当您的菜单回调回复以“review / edit”开头的路径时,我得到的最后一个数字是需要编辑的评论节点的节点ID;在这种情况下,我将使用以下代码实现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()
找不到ID等于“ fersgdsf“(节点ID是数字,而不是字符串)。我不需要首先验证参数是否为整数,因为node_load()
在找不到具有传递ID的节点时将返回FALSE
,当我传递一个字符串isn时会发生这种情况。 t等于数字。
Drupal 6及更高版本定义了其他通配符,例如%user ,_%taxonomy_vocabulary_; Drupal 6的列表在Wildcard usage and core's wildcards的底部报告,它也解释了如何使用通配符。该文档页面适用于Drupal 6,但它仍适用于Drupal 7;据我所知,Drupal 7没有定义新的通配符。