我正在使用Drupal 6并拥有自己的节点,它正在拉入我的自定义php页面。网址为domain.com/blogs
。我想使用干净的URL作为参数。例如,domain.com/blogs/1
将从数据库中提取有关第一篇博文的信息。
我试过了:
domain.com/blogs/1
并在php代码中使用arg(0)
但是我甚至都没有运行代码,因为Drupal出现了Page Not Found
错误。
有没有办法让Drupal知道允许domain.com/blogs
之后的任何参数并加载/blogs
的节点并发送args?
答案 0 :(得分:1)
将node/1234
别名化为blogs
并不意味着您可以控制菜单路由器项目的其余部分。
例如,如果您的unaliased节点路径是“node / 1234”,则“拥有”其余参数。
即您可以从PHP 567
访问node/1234/567
,如下所示:
<?php print arg(2); ?>
如果您想“拥有”/blogs
网址部分,则必须使用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)和其他评论垃圾的原因是假设您需要来自节点的部分(例如:您希望make显示带有节点ID参数的View,或类似需要来自节点的特定数据的东西)。 但是 从不 允许用户查看从node_load()加载的节点,因为它就像上帝一样,无论用户要求什么。
对于节点,让我解释一下gimmic。把它放在回调函数中。
$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,检查它是否在'blog'类型中,并将菜单处理程序设置为相关的节点ID路径。 现在,当您访问blog / 123时,如果它是博客节点,您将看到node / 123的内容。但这不是重定向。它不能作为完全别名的URL工作,但有时也很有帮助。
或者,您可以检查用户是否可以访问node_access()中的节点。
答案 1 :(得分:0)
这里有一些关于定义和发送视图参数的链接 drupal.org/1