我在Drupal 7中构建了一个自定义模块。我有一个类似“review/edit/2”的URL;我想在URL末尾输入这个数字。如何访问页面参数?
如何使用hook_menu()
访问它?一小段代码会很好。
我在Drupal 7中构建了一个自定义模块。我有一个类似“review/edit/2”的URL;我想在URL末尾输入这个数字。如何访问页面参数?
如何使用hook_menu()
访问它?一小段代码会很好。
这是一个非常简单的例子,将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
}
的问题实际上是两个问题:
第一个问题的答案是,用于定义菜单回调的页面参数的每个数字(对于访问参数,标题参数和主题参数也是有效的)被替换为路径的等价部分。
例如,模块使用下面的代码可以实现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,参数传递给页回调是和"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_load()),并从该值返回的值被传递到页回调。
当您的菜单回调回复以“review/edit”开头的路径时,我得到最后一个数字是需要编辑的评论节点的节点ID;
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
,用户得到一个在这种情况下,我会使用下面的代码实现hook_menu()
“页面未找到”错误。这对过滤掉错误的参数非常有用。例如,如果我打电话给我先前用example.com/review/edit/fersgdsf定义的菜单回调函数,我会得到一个“找不到页面”的错误,因为node_load()
找不到ID等于“fersgdsf”(节点ID是数字,而不是字符串)。我不需要首先验证参数是一个整数,因为node_load()
将返回FALSE
,当它没有找到具有传递的ID的节点时,发生在传递不等于数字的字符串时。
Drupal 6及更高版本定义了其他通配符,例如%用户,_%taxonomy_vocabulary_; Drupal 6的列表被报告在Wildcard usage and core's wildcards的底部,这也解释了如何使用通配符。该文档页面适用于Drupal 6,但它对Drupal 7仍然有效;据我所知,Drupal 7没有定义新的通配符。
谢谢,只是好奇如何使用$ items中的页面参数事物? – Maverick
对不起,我不知道我设法离开了这一点,我已经更新了上面的答案。希望更多的感谢 – Clive
非常感谢,它顺利运作 – Maverick