【问题标题】:Codeigniter - best routes configuration for CMS?Codeigniter - CMS 的最佳路由配置?
【发布时间】:2011-04-13 02:36:03
【问题描述】:

我想在 Codeigniter 中创建一个自定义 CMS,我需要一种机制来将常规页面路由到默认控制器 - 例如:

mydomain.com/about
mydomain.com/services/maintenance

这些将通过我的页面处理程序控制器进行路由。 Codeigniter 中的默认路由行为当然是路由到匹配的控制器和方法,因此对于上面的示例,它需要一个 About 控制器和一个 Services 控制器。这显然不是一个实用甚至不明智的方法。

我在 routes.php 中看到了以下解决方案:

$route['^(?!admin|products).*'] = "pagehandler/$0";

但我相信这会带来它自己的问题。例如,它只是在请求 uri 中查找“产品”,如果找到到 Products 控制器的路由 - 但是如果我们将服务/产品作为 CMS 页面怎么办?这不会被路由到产品控制器吗?

有没有完美的方法来解决这个问题?我不希望所有 CMS 内容都以控制器名称为前缀的路由,但我还需要能够一般地覆盖其他控制器的路由。

【问题讨论】:

  • 鉴于您在帖子中提供的信息,很难确切地说出最佳方法是什么。 “CMS 内容”到底是什么意思?您希望您的 URI 在不同的情况下如何显示?我知道您可能很清楚自己想要做什么,但我们需要更具体的示例来帮助您。
  • 老实说,我从未在 CI 应用程序中使用过任何路由。

标签: codeigniter content-management-system routing


【解决方案1】:

如果您使用 CodeIgniter 2.0(已经足够稳定可以使用几个月),那么您可以使用:

$route['404_override'] = 'pages';

这会将任何不是控制器、方法或有效路由的内容发送到您的页面控制器。然后,您可以使用任何您喜欢的 PHP 来显示页面或显示更好的 404 页面。

阅读我的指南,解释你是如何upgrade to CodeIgniter 2.0。此外,您可能有兴趣使用现有的 CMS,例如 PyroCMS,它现在接近最终的 v1.0 并且拥有大量追随者。

【讨论】:

    【解决方案2】:

    你很幸运。我自己正在开发一个 CMS,我花了很长时间才找到一个可行的解决方案。让我解释一下自己,以确保我们在同一页面上,但我相当确定我们是一致的。

    您的网址可以采用以下方式格式化:

    http://www.mydomain.com/about - 没有分类的顶级页面
    http://www.mydomain.com/services/maintenance - 有父分类的页面
    http://www.mydomain.com/services/maintenace/server-maintenance - 有分类和子分类的页面。

    在我的页面控制器中,我使用了 _remap 函数,该函数基本上捕获对控制器的所有请求,并让您可以对它们做任何事情。

    这是我的代码,为了您的方便而注释:

    <?php
    
    class Pages extends Controller {
    
        // Captures all calls to this controller
        public function _remap() 
        {
            // Get out URL segments
            $segments = $this->uri->uri_string();
            $segments = explode("/", $segments);
    
            // Remove blank segments from array
                foreach($segments as $key => $value) {
                   if($value == "" || $value == "NULL") {
                       unset($segments[$key]);
                   }
                }
    
                // Store our newly filtered array segments
                $segments = array_values($segments); 
    
                // Works out what segments we have
                switch (count($segments))
                {
                    // We have a category/subcategory/page-name
                    case 3:
                        list($cat, $subcat, $page_name) = $segments;
                    break;
    
                    // We have a category/page-name
                    case 2:
                        list($cat, $page_name) = $segments;
                        $subcat = NULL;
                    break;
    
                    // We just have a page name, no categories. So /page-name
                    default:
                        list($page_name) = $segments;
                        $cat = $subcat = NULL;
                    break;
                }
    
            if ($cat == '' && $subcat == '') {
    
                $page  = $this->mpages->fetch_page('', '', $page_name);
    
            } else if ($cat != '' && $subcat == '') {
    
                $page  = $this->mpages->fetch_page($cat, '', $page_name);
    
            } else if ($category != "" && $sub_category != "") {
    
                $page = $this->mpages->fetch_page($cat, $subcat, $page_name);
            }
    
                    // $page contains your page data, do with it what you wish.
    
    }
    ?>
    

    您当然需要修改您的页面获取模型函数接受 3 个参数,然后根据您正在查看的页面类型传入信息。

    在您的 application/config/routes.php 文件中,只需输入您想要路由的特定 URL,然后在最底部输入:

    /* Admin routes, login routes etc here first */
    
    $route['(:any)'] = "pages"; // Redirect all requests except for ones defined above to the pages controller.
    

    如果您需要更多说明或可下载的示例代码,请告诉我。

    【讨论】:

    • 这样做的问题是您必须将 WAAAY 设置为许多路由,只需升级到 CI 2 并使用 404_override :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2016-01-29
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多