你很幸运。我自己正在开发一个 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.
如果您需要更多说明或可下载的示例代码,请告诉我。