【问题标题】:Drupal php page that accepts clean URL arguments接受干净 URL 参数的 Drupal php 页面
【发布时间】:2012-08-03 14:21:51
【问题描述】:

我正在使用 Drupal 6,并且有自己的节点正在拉入我的自定义 php 页面。 URL 是domain.com/blogs。我想使用干净的 URL 作为参数。例如,domain.com/blogs/1 将从数据库中提取关于第一篇博文的信息。

我试过了:

domain.com/blogs/1 并在 php 代码中使用 arg(0) 但我什至无法运行代码,因为 Drupal 出现了 Page Not Found 错误。

有什么方法可以让 Drupal 知道domain.com/blogs 之后的任何参数都是允许的,并为/blogs 加载节点同时发送参数?

【问题讨论】:

    标签: url drupal drupal-6 clean-urls


    【解决方案1】:

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

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

    <?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() 访问节点。

    【讨论】:

    • 感谢您的帖子,我如何加载我在节点博客的正文部分中拥有的自定义 php 页面/这将是我可以呈现页面外观的区域基于 arg(1)
    • 我输入了 return node_view(node_load($nodeId));你推荐?
    • 请不要。这带来了一个很大的安全问题,即用户可以访问任何节点。有关一些解决方法,请参阅更新的答案。谢谢。
    • 更新答案中的大部分代码来自comment.module的评论永久链接页面回调。
    【解决方案2】:

    您可以在此处阅读有关定义和发送视图参数的一些链接 drupal.org/1

    drupal.org/2

    【讨论】:

    • 我宁愿不使用视图,尝试不使用
    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多