如何访问页面参数?

时间:2011-11-30 12:47:02

标签: php drupal drupal-7

我正在Drupal 7中构建一个自定义模块。我有一个类似“review / edit / 2”的URL;我想在URL的末尾加上这个号码。

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

2 个答案:

答案 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)

问题实际上是两个问题:

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