Answers:
该信息对Drupal 6和7有效。在Drupal 8中,hook_menu()
已被新的路由系统替换。下面我们hook_menu()
通过三个简单的步骤来实现。
按照如何创建空模块中的说明创建空模块。在此处显示的代码中,假定该模块名为helloworld。
将以下代码添加到模块文件中。
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'title' => 'Hello world!',
'page callback' => 'helloworld_page',
'access callback' => TRUE,
);
return $items;
}
/**
* Page callback for /hello.
*/
function helloworld_page() {
return 'Hello world!';
}
启用该模块,然后访问http://example.com/hello。(将example.com替换为服务器的域名。)
您应该看到消息“ Hello world!”。而已!您已经完成了工作hook_menu()
。以下是有关的各种更高级的主题hook_menu()
。特别是,您可能想阅读有关权限的信息,因为任何人都可以查看上面的页面。
如果要将更多数据传递给页面回调,则可以使用页面参数来实现。页面参数应该是传递给页面回调的参数数组。如果使用整数作为参数,它将代表URL的一部分,从0开始,每个斜杠(/)递增一次。在以下示例中,这意味着0将变成“ hello”。
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(0),
);
return $items;
}
function helloworld_page($argument1) {
return $argument1;
}
字符串将按原样发送,因此array(0, 'world')
可用于hello world
再次退出。
function helloworld_page($argument1, $argument2) {
return $argument1 . ' ' . $argument2;
}
“通配符”可用于接受URL中的任意数据。
function helloworld_menu() {
$items['hello/%'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
);
return $items;
}
function helloworld_page($argument1) {
return $argument1;
}
访问hello / world $argument1
等于world
。
通常,URL参数将是标识实体的数字。为避免复制将ID转换成其对应对象的代码,Drupal支持自动加载“命名”通配符。当使用命名通配符时,Drupal将检查与通配符同名,后缀为的函数_load
。如果找到了这样的函数,则将使用URL中的值的值对其进行调用,并且加载程序函数返回的所有内容都将代替原始值传递给页面回调。由于Drupal已经具有加载节点的功能node_load()
,因此我们可以使节点自动加载并传递给页面回调。
function helloworld_menu() {
$items['hello/%node'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
);
return $items;
}
function helloworld_page($node) {
return t('Hello node (ID = !nid)', array('!nid' => $node->nid));
}
有时,有必要基于多个参数自动加载更多参数。由于默认情况下仅将命名参数传递给加载器,因此需要明确告诉Drupal应将哪些额外的加载参数传递给加载器。例如,要加载节点的特定修订版,必须将其传递给node_load()
节点ID和修订版ID。可以通过以下代码完成。
function helloworld_menu() {
$items['hello/%node/revision/%'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
'load arguments' => array(3),
);
return $items;
}
function helloworld_page($node) {
return t('Hello node (ID = !nid, revision ID = !rid)', array('!nid' => $node->nid, '!rid' => $node->vid));
}
'access callback' => TRUE,
使上面的简单示例完全可见是必需的,但它并不是理想的,因为它永远都无法控制。任何尝试访问/ hello的人都将被授予访问权限。提供某种控制措施的最简单方法是提供访问回调,就像上面的页面回调一样。以下代码仍允许访问任何人,但显示了如何将逻辑移至访问时调用的函数,从而允许更复杂的逻辑。
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'access callback' => 'helloworld_access',
);
return $items;
}
/**
* Access callback for /hello.
*/
function helloworld_access() {
return TRUE;
}
这不一定是最好的方法,因为使用自定义函数通常会不必要地重复代码。大多数情况下,更好的方法是使用user_access()
。访问回调一起可以设置访问参数。可能需要具有以下代码的具有访问用户配置文件许可权的用户才能查看该页面。
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'access callback' => 'user_access',
'access arguments' => array('access user profiles'),
);
return $items;
}
由于访问回调默认情况下是user_access,因此可以忽略,如上面的代码所示。
官方hook_menu()
文档提供了有关钩子最复杂用例的更多信息。
title
所有从hook_menu()