【问题标题】:CodeIgniter building a CMS with different page typesCodeIgniter 构建具有不同页面类型的 CMS
【发布时间】:2014-06-06 16:30:33
【问题描述】:

我刚刚开始使用 PHP 进入 MVC,并且对 CodeIgniter 和 CakePHP 之类的东西感到很困惑。我有兴趣了解人们对以下问题的处理方式:

通常,当我过去使用 CMS 构建网站时,我会通过在我的数据库中拥有一个核心 URI 表来接近它。每个 URI 都是唯一的,代表我网站上的一个页面(例如,www.example.com/about 将引用我的 URI 表中的一条记录,其中 'about' 作为唯一 URI)。 URI 表还包含一个 'type' 列,它告诉系统它是什么类型的页面(例如,splash、basic、gallery 或其他)。每个“类型”在我的数据库中都有一个对应的表,其中包含该类型记录的所有数据(例如,我将有表:基本、图库和启动)。该类型还告诉系统要加载哪个模板/页面处理程序,而哪个模板/页面处理程序又会为每种页面类型执行所需的操作。

因此,如果您访问 www.example.com/about,我的系统会在我的 URI 表中查找带有 URI 'about' 的记录,发现它的类型是 'basic',因此它会加载使用的基本模板/页面处理程序我的数据库中用于加载和呈现页面的基本表。在 CMS 中,我采用了类似的方法,我将在我的页面管理器中添加/编辑所有不同类型的表单。

我想知道您将如何使用诸如 CodeIgniter 之类的 MVC 框架来解决这个问题?我本质上想在正面和背面为每种类型的页面使用不同的控制器。但是,当有人访问我的站点时,他们最终会使用一个单一级别的 URI,因此我需要检查页面的类型并将其传递给正确的控制器。有没有一种方法你会推荐检查每个页面的类型,然后加载相关的控制器来完成剩下的工作?

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    我最终的方法是扩展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();
        }
    
    }
    

    到目前为止,无论它是否是最好的方法似乎都有效。

    【讨论】:

      【解决方案2】:

      通常它是路由和命名控制器的组合。所以例如你有一个关于页面,你不需要一个单独的关于控制器。假设您有一个通用的 Pages 控制器,然后是一个 view($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

      【讨论】:

      • 感谢您的回答。这是我最初的想法,但是,如果我想要一个完全由没有代码经验的人通过 CMS 管理的系统怎么办。我想拥有不同的页面类型,它们基本上可以是任何东西。我本质上正在寻找的是一种在建立页面类型之后将控制权传递给另一个控制器的方法。有什么想法吗?
      • 我明白你在说什么。这就是为什么大多数 CMS 如此臃肿,因为他们想成为所有人的一切。如果你想制作一堆很酷的工具来创建画廊——example.com/gallery 没有任何问题,它可以访问画廊控制器。我的观点是,一点点的结构可以为你节省很多时间。它保持灵活。添加更多控制器非常容易。还要考虑一下控制器和模型的名称应该让其他开发人员更容易使用的想法。
      • 是的,这就是我想要自己做事的原因。我的目标是开发自己的 CMS,它易于扩展或缩减,具有非常基本的核心。虽然我知道添加更多控制器很容易并使其变得灵活 - 每次用户想要添加新页面时都需要开发人员进行干预以添加路由规则,这违背了拥有 CMS 的意义。我不认为有办法从数据库中提取路线并使用它们?这样我就可以写一些东西来管理系统内的路线。
      • 他们可以在没有新控制器的情况下添加新页面。再看第二个例子——你可以自动添加任意数量的页面。我不是在谈论每页新的控制器——我是在谈论是否向 CMS 添加新功能,例如搜索表单和分页结果。 example.com/search 并转到名为 search 的控制器。小心将您的基本应用程序逻辑隐藏在隐藏的数据库字段中。
      • 是的 - 添加一个带有现有控制器的新页面很好。问题与 URL 一起出现。如果我想要一个未在其中指定控制器名称的单级 URL,例如 /basic/view/uri,则必须添加一个路由。这需要开发人员干预。我想实现一个用户指定完整 URL 的系统,但它仍然根据页面类型执行正确的控制器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      相关资源
      最近更新 更多