作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
向我们的菜单钩子中添加一个新的菜单项:
$items['placeholder/%menu_wildcard_arg_optional'] = array(
'title' => '占位符示例',
'description' => '一个通配符用作占位符的菜单项.',
'page callback' => 'menu_wildcard_callback_page',
'page arguments' => array(1),
'file' => 'menu_wildcard.pages.inc',
'access callback' => TRUE,
);
并在module文件中添加一个新的函数:
function menu_wildcard_arg_optional_load($id){
$mapped_value = "";
$mappings = array(
'a' => "美国",
'b' => "英国",
'c' => "中国",
);
if (isset($mappings[$id])) {
$mapped_value = $mappings[$id];
}
if(empty($mapped_value)){
$mapped_value = t('当前ID @id 没有对应的值',array('@id' => $id));
}
return $mapped_value;
}
清空缓存,让我们访问路径placeholder/a/b/c/d,得到图3-20所示的结果。
图 3-20.页面参数被_load()函数替换了
参数a被替换成了“美国”,神奇吧!路经placeholder/%menu_wildcard_arg_optional是怎么一回事呢?我们在这里详细的解释一下:
1.使用/字符将路径切分成各个部分。
2.在第2部分中,匹配从%到下一个可能的/字符之间的字符串。在这里,该字符串就是menu_wildcard_arg_optional。
3. 向该字符串上追加_load,来生成一个函数的名字。在这里,该函数的名字就是menu_wildcard_arg_optional_load。
4. 调用该函数,并将Drupal路径中通配符的值作为参数传递给它。所以,如果Drupal路径为placeholder/a/b/c/d,那么通配符匹配的第2部分就是a,那么调用的就是menu_wildcard_arg_optional_load ('a')。
5. 使用这个调用所返回的结果来替换通配符。这里的页面参数为array(1),在页面回调被调用时,我们没有传递Drupal路径中的部分1(a),而是传递了menu_wildcard_arg_optional_load ('a')返回的结果,也就是“美国”。我们可以把它看作,Drupal路径中的一部分被它对应的_load()函数替换了。
6. 注意,标题回调和访问控制回调也可以使用这种替换方式。
在Drupal中,这种占位符形式的参数替换是非常常见的,比如最核心的node/%node,user/%user,就采用了这种方式。为了更好的理解这种替换,以node/%node/edit为例,我们可以把它看作是node/%/edit,外加了一个隐藏指令:为通配符匹配的内容运行node_load()。