CodeIgniter构建具有不同页面类型的CMS


CodeIgniter building a CMS with different page types

我刚刚开始使用PHP进入MVC,并且对CodeIgniter和CakePHP之类的东西感到很混乱。我很想知道人们是如何处理以下问题的:

通常,当我建立了一个网站与CMS在过去我已经接近它有一个核心URI表在我的数据库。每个URI都是唯一的,代表我网站上的一个页面(例如www.example.com/about将引用我的URI表中的记录,其中"关于"作为唯一的URI)。URI表还包含一个"type"列,它告诉系统它是什么类型的页面(例如,splash, basic, gallery或其他)。每种"类型"在我的数据库中都有一个相应的表,其中包含该类型记录的所有数据(例如,我会有表:基本,画廊和飞溅)。该类型还告诉系统要加载哪个模板/页面处理程序,然后为每个页面类型做它需要做的事情。

所以如果你去www.example.com/about,我的系统在我的URI表中寻找一个URI 'about'的记录,发现它的类型是'基本',所以它加载基本模板/页面处理程序,它使用我的数据库中的基本表来加载和渲染页面。在CMS中,我采用了类似的方法,我将在页面管理器中为所有不同类型添加/编辑表单。

我想知道你会如何使用MVC框架,如CodeIgniter?实际上,我想为前后两种类型的页面设置不同的控制器。但是,当有人访问我的站点时,他们最终会访问一个具有单一级别的URI,因此我需要检查页面的类型并将其传递给正确的控制器。是否有一种方法,你会建议检查每个页面的类型,然后加载相关的控制器做剩下的工作?

我最终的方法是扩展Router类的_parse_routes()方法,以检查数据库中是否有与当前uri匹配的记录,并使用数据库中的相应值设置请求。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Router extends CI_Router {
    function __construct() {
        parent::__construct();
    }
    function _parse_routes() {
        require_once( BASEPATH .'database/DB'. EXT );
        $db =& DB();
        $routes_table_exists = $db->query("SHOW TABLES LIKE 'routes';");
        if ($routes_table_exists->num_rows > 0) {
            $uri_routes = $db->get_where('routes', array('uri' => $this->uri->uri_string()));
            if ($uri_routes->num_rows > 0) {
                $row = $uri_routes->result()[0];
                if (isset($row->request)) {
                    return $this->_set_request(explode('/', $row->request));
                }
            }
        }
        parent::_parse_routes();
    }
}

不管这是不是最好的方法,到目前为止似乎是有效的。

通常是路由和命名控制器的组合。比如你有一个关于页面,你不需要一个单独的关于控制器。假设您有一个通用的Pages控制器,然后有一个视图($page)方法来检索和显示页面。

example.com/about
$route['about'] = "pages/view/about";

如果你只有几个页面,硬编码路由是有好处的——它可以保护你的数据库。但除此之外,从教程

中选取一个例子
$route['default_controller'] = 'pages/view';
$route['(:any)'] = 'pages/view/$1';

这个也是一样的但是现在它会取example。com/任何东西都可以放到这里

而不是像联系人页面这样的东西——你可能想要有一个单独的控制器叫contact,因为你需要验证联系人表单,将它添加到数据库中,发送邮件,显示响应,如果没有验证再次显示表单,等等,所以你可以做一个简单的链接来显示联系人表单:example.com/contact

联系人表单提交到:example.com/contact/submit

关于路由的更多信息http://ellislab.com/codeigniter/user-guide/general/routing.html

,一定要看一下教程,它会给你更多关于路由的例子http://ellislab.com/codeigniter/user-guide/tutorial/index.html