2011-11-30 83 views
0

我在Drupal 7中构建了一个自定义模块。我有一个类似“review/edit/2”的URL;我想在URL末尾输入这个数字。如何访问页面参数?

如何使用hook_menu()访问它?一小段代码会很好。

回答

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 
} 
+0

谢谢,只是好奇如何使用$ items中的页面参数事物? – Maverick

+1

对不起,我不知道我设法离开了这一点,我已经更新了上面的答案。希望更多的感谢 – Clive

+0

非常感谢,它顺利运作 – Maverick

0

的问题实际上是两个问题:

  • 如何访问页面的参数是通过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,参数传递给页回调是​​和"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没有定义新的通配符。