代码之家  ›  专栏  ›  技术社区  ›  BrynJ

Codeigniter-CMS的最佳路由配置?

  •  3
  • BrynJ  · 技术社区  · 14 年前

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

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

    有完美的方法吗?我不希望有一个路由,其中所有CMS内容的前缀与控制器名称,但我也需要能够一般覆盖其他控制器的路由。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Phil Sturgeon    14 年前

    如果您使用CodeIgniter 2.0(已稳定使用数月),那么您可以使用:

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

    upgrade to CodeIgniter 2.0 . 另外,您可能对使用现有的CMS感兴趣,例如 PyroCMS

        2
  •  3
  •   Dwayne Charrington    14 年前

    你很幸运。我正在开发一个CMS自己,它花了我很多时间找到一个可行的解决办法。让我解释一下,以确保我们在这一点上是一致的,但我相当肯定,我们在这一领域。

    您的URL可以通过以下方式格式化:

    http://www.mydomain.com/about
    http://www.mydomain.com/services/maintenance -具有父类别的页面
    http://www.mydomain.com/services/maintenace/server-maintenance

    在我的页面控制器中,我使用的是\重新映射功能,它基本上可以捕获对控制器的所有请求,并允许您对它们执行所需的操作。

    以下是我的代码,为方便起见,请评论:

    <?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.
    
    }
    ?>
    

    在应用程序/配置中/路由.php文件中只需列出您要路由的特定URL,并在最下面列出:

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

    让我知道如果你需要任何更多的澄清或下载的示例代码。