2010-09-16 64 views
3

我想笨內創建一個定製的CMS,我需要一種機制來路由一般網頁的默認控制器 - 例如:Codeigniter - CMS的最佳路線配置?

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

這些將通過我的頁面處理器控制器進行路由。 Codeigniter中的默認路由行爲當然是路由到匹配的控制器和方法,因此通過上述示例,它需要一個關於控制器和一個服務控制器。這顯然不是一種實際的或者明智的方法。

我已經看到了以下解決方案,以在routes.php文件放置:

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

但是,這帶來了它自己的問題,我相信。例如,它只是在請求URI中查找「產品」,並且如果找到了到Products控制器的路由 - 但是如果我們有服務/產品作爲CMS頁面會怎麼樣?這是否不會被路由到產品控制器?

有沒有一個完美的方法呢?我不希望有一個路由,其中​​所有的CMS內容都以控制器名稱爲前綴,但我也需要能夠一般地覆蓋其他控制器的路由。

+0

鑑於您在帖子中提供的信息,很難確切說出最佳方法。 「CMS內容」是什麼意思?你希望你的URI在不同情況下出現?我知道你可能對你想做什麼有一個很好的想法,但我們需要更多具體的例子來幫助你。 – treeface 2010-09-16 18:10:05

+0

說實話,我從未在我的CI應用程序中使用任何路線。 – 2010-10-15 00:57:50

回答

3

如果你使用CodeIgniter的2.0(這已經足夠穩定使用幾個月),那麼你可以使用:

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

這將發送任何不是一個控制器,方法或有效路由到您的網頁控制器。然後你可以使用任何你喜歡的PHP來顯示頁面或者顯示更好的404頁面。

讀我指導解釋你如何upgrade to CodeIgniter 2.0。此外,您可能有興趣使用現有的CMS如PyroCMS,該版本現在接近最終版本v1.0,並且擁有大量的關注內容。

3

你很幸運。我正在自己開發一個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. 

讓我知道如果你需要任何更多的澄清或可下載示例代碼。

+1

這樣做的問題是您必須將WAAAY設置爲多條路線,只需升級到CI 2並使用404_override :) – 2010-10-18 14:51:56