别名并不意味着您可以控制菜单路由器项目的其余部分node/1234
。blogs
例如,如果您的非别名节点路径是 "node/1234" ,那么您“拥有”其余的参数。即您可以像这样567
从node/1234/567
PHP 访问:
<?php print arg(2); ?>
如果你想“拥有” /blogs
URL 部分,你必须使用hook_menu来定义它。由于您已经接触过 php,我认为最好的方法是制作模块。但是,您可以为此使用视图或面板模块。
<?php
function MYMODULE_menu() {
$items = array();
$items['blogs'] = array(
'title' => 'Main Blogs page',
'page callback' => 'MYMODULE_page',
'access arguments' => array('access content'),
'type' => MENU_SUGGESTED_ITEM,
);
$items['blogs/%'] = array(
'page callback' => 'MYMODULE_blog_view',
'page arguments' => array(1),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function MYMODULE_blog_view($blog_id){
// $node = node_load($blog_id);
// return print_r($node, TRUE);
}
?>
现在,在 MYMODULE_blog_view 函数中,您也可以从 arg(1) 获取参数。您也可以通过组合两个菜单路由器项在单页回调中实现,但我建议使用单独的路由器项。
更新(8 月 8 日):我之所以使用 node_load($blog_id) 和其他评论垃圾的原因是假设您需要节点中的部分(例如:您想要显示带有节点 ID 参数的视图,或者需要特定的类似内容节点的数据)。但是永远不要让用户查看从 node_load() 加载的节点,因为它就像上帝一样给予用户要求的任何东西。
对于节点,让我解释一下噱头。把它放在回调函数中。
$node = node_load($blog_id);
if ($node && $node->type == 'blog'){
$_GET['q'] = 'node/' . $node->nid;
return menu_execute_active_handler('node/' . $node->nid, FALSE);
}
drupal_not_found(); // important!
这将从博客 ID(来自 URL)加载节点 ID,检查它是否为“博客”类型并将菜单处理程序设置为相关的节点 ID 路径。现在,当您访问 blog/123 时,如果它是博客节点,您将看到 node/123 的内容。但这不是重定向。它不能作为完全别名的 URL,但有时会很有帮助。
或者,您可以检查用户是否可以从node_access ()访问节点。