我想在Codeigniter中创建一个自定义CMS,我需要一种机制将常规页面路由到默认控制器 - 例如:
mydomain.com/about
mydomain.com/services/maintenance
这些将通过我的pagehandler控制器进行路由。 Codeigniter中的默认路由行为当然是路由到匹配的控制器和方法,因此在上面的示例中,它需要一个About控制器和一个Services控制器。这显然不是一种实用的,甚至是明智的方法。
我已经看到以下解决方案放在routes.php中:
$route['^(?!admin|products).*'] = "pagehandler/$0";
但这相信我自己的问题。例如,它只是在请求uri中查找“产品”,如果找到了到Products控制器的路径 - 但是如果我们将服务/产品作为CMS页面怎么办?这不会被路由到产品控制器吗?
对此有完美的解决方法吗?我不希望有一个路由,其中所有CMS内容都以控制器名称为前缀,但我还需要能够一般覆盖其他控制器的路由。
答案 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 :(得分:3)
如果您使用CodeIgniter 2.0(已经足够稳定使用数月),那么您可以使用:
$route['404_override'] = 'pages';
这将向页面控制器发送任何非控制器,方法或有效路径。然后你可以使用你喜欢的任何PHP来显示页面或显示更好的404页面。
请阅读我的指南,了解您的upgrade to CodeIgniter 2.0。此外,您可能有兴趣使用现有的CMS,例如PyroCMS,它现在已接近最终的v1.0,并且有大量的追随者。