0

我正在使用 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发送参数?

4

2 回答 2

1

别名并不意味着您可以控制菜单路由器项目的其余部分node/1234blogs

例如,如果您的非别名节点路径是 "node/1234" ,那么您“拥有”其余的参数。即您可以像这样567node/1234/567PHP 访问:

<?php print arg(2); ?>

如果你想“拥有” /blogsURL 部分,你必须使用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 ()访问节点。

于 2012-08-06T18:26:12.650 回答
0

这里有一些链接,您可以阅读有关定义和发送视图参数 drupal.org/1

drupal.org/2

于 2012-08-06T15:46:40.217 回答