Codeigniter-CMS的最佳路由配置?
我想在Codeigniter中创建一个自定义CMS,我需要一种机制将常规页面路由到默认控制器-例如:Codeigniter-CMS的最佳路由配置?,codeigniter,content-management-system,routing,Codeigniter,Content Management System,Routing,我想在Codeigniter中创建一个自定义CMS,我需要一种机制将常规页面路由到默认控制器-例如: mydomain.com/about mydomain.com/services/maintenance 这些将通过我的pagehandler控制器路由。Codeigniter中的默认路由行为当然是路由到匹配的控制器和方法,因此在上面的示例中,需要一个About控制器和一个Services控制器。这显然不是一个切实可行甚至不明智的办法 我在routes.php中看到了以下解决方案: $rout
mydomain.com/about
mydomain.com/services/maintenance
这些将通过我的pagehandler控制器路由。Codeigniter中的默认路由行为当然是路由到匹配的控制器和方法,因此在上面的示例中,需要一个About控制器和一个Services控制器。这显然不是一个切实可行甚至不明智的办法
我在routes.php中看到了以下解决方案:
$route['^(?!admin|products).*'] = "pagehandler/$0";
但我相信这也带来了问题。例如,它只是在请求uri中查找“产品”,如果找到,则路由到产品控制器-但是如果我们将服务/产品作为CMS页面会怎么样?然后是否将其路由到产品控制器
有没有一个完美的方法?我不希望所有CMS内容都以控制器名称作为前缀,但我还需要能够覆盖其他控制器的路由。你很幸运。我自己正在开发一个CMS,我花了很多时间才找到一个可行的解决方案。让我自己解释一下,以确保我们在这方面是一致的,但我相当肯定我们在这方面是一致的 您的URL可以通过以下方式格式化:
<?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.
}
?>
-没有类别的顶级页面-包含父类别的页面
-包含类别和子类别的页面 在my pages controller中,我使用了_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.
}
?>
如果您需要更多说明或可下载的示例代码,请告诉我。如果您使用CodeIgniter 2.0(已稳定使用数月),那么您可以使用:
$route['404_override'] = 'pages';
这会将任何不是控制器、方法或有效路由的内容发送到pages控制器。然后,您可以使用任何PHP来显示页面或显示更好的404页面
给我读一本指南,解释你是如何做到的。此外,您可能会对使用现有的CMS感兴趣,例如现在接近最终版本1.0且拥有大量追随者的CMS。鉴于您在帖子中提供的信息,很难确切说出最佳方法是什么。你所说的“CMS内容”到底是什么意思?您希望您的URI在不同情况下如何显示?我知道您可能很清楚自己想要做什么,但我们需要更具体的示例来帮助您。老实说,我从未在我的CI应用程序中使用任何路由。这样做的问题是您必须将WAAAY设置为多个路由,只需升级到CI 2并使用404_覆盖:)