gevilrror 发表于 2012-1-10 23:01:52

让CI成为CMS的一点思路,望高手指教

CI版本:2.1.0
一.整体思路:
  通过application/core/MY_Controller实现核心功能。
  1.网站设置:添加两个核心类:System、Web,储存网站系统设置和页面整体设置。
  2.主题功能:许多CMS的模板功能都是外挂smarty实现或者通过正则表达式替换文本,就如CI刚开始"<?=",在此为了保证php速度并没有使用这些,而且取消了Output内的正则替换(protected $parse_exec_vars = FALSE;)。主要是通过Loader类修改view路径实现Theme主题功能;并将view需要用的变量存在$SYS, $WEB内,在include view前 global $SYS, $WEB(其实也可以通过CI本来extract的方法,这里不知道选哪个比较好)等变量,实现view内直接访问,不用再传变量到view里。
  3.语言功能:修改Lang核心类 读取 默认语言 部分,实现多语言切换功能,这里还将原来读取application/language修改为优先读取根目录下language文件夹。
  4.模块功能:这个功能还没想好,因为还是新手,个人不太喜欢分开“每个module,module内都含有相应配置、控制器、model、view”这种实现方式,感觉很复杂。其实看了Loader类里其实有几个package方法:add_package_path、get_package_paths、remove_package_path等,这些方法为CI添加新的config、model、view路径,感觉可以用来处理模块功能。

二.MY_Controller文件流程:
  1.载入设置类

$SYS =& load_class('system', 'core');
$WEB =& load_class('web', 'core');
  2.定义类,并在构造函数内载入数据库
    $this->load->database();

    if ( ! $this->db->db_select())
    {
      show_error('Unable to connect databse!');
    }
  3.在构造函数内载入设置类
    $this->load->model('base/settings_model');
  通过设置类查询数据库初始化 System 类和 Web 类
  4.在构造函数内添加相应主题view path,以便Loader先读取主题内的view文件
    $this->load->add_view_path(THEMEPATH.$this->system->site_default_tem.'/');

三.Loader类修改部分:
  1.修改view 路径方法
    public function add_view_path($view_path = '')
    {
      if($view_path == '')
            return false;
      
      $this->_ci_view_paths = array($view_path.'views/' => true) + $this->_ci_view_paths;
      
      return true;
    }
  2.global变量,以便view内能<? echo $SYS->site_default_tem; ?>访问变量,尽量将程序部分和视图部分分开。
      extract($this->_ci_cached_vars);
      global $SYS, $WEB

四.Lang类
  1.修改读取默认语言
      $config =& get_config();

      if ($idiom == '')
      {
            $deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
            $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
      }
  修改为
      $system =& load_class('system', 'core');

      if ($idiom == '')
      {
            $deft_lang = ( ! isset($system->site_default_lang)) ? 'english' : $system->site_default_lang;
            $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
      }
  2.语言文件优先读取
            $found = FALSE;
            
            //change lang path
            if (file_exists(LANGPATH.$idiom.'/'.$langfile))
            {
                include(LANGPATH.$idiom.'/'.$langfile);
                $found = TRUE;
            }

以上的LANGPATH、THEMEPATH为index.php内定义的类似APPPATH的常量。

其实也不多,该想法参考了部分CMS和ionize的做法。其实也就是工作的一部分拿出来分享和交流,还望大家能帮忙提些改善的意见!{:soso_e113:}

Hex 发表于 2012-1-12 16:19:36

很好的思路,支持~

gevilrror 发表于 2012-1-14 17:14:54

终于不是0回复啦.....{:soso_e109:}
感谢Hex,不过估计还是要看看能不能把它分离出来给大家看看才实际些

hsydxh 发表于 2012-2-5 10:46:15

这个方法很好。不过我还是搞不明白代码要怎样写。

hsydxh 发表于 2012-2-5 10:47:09

望版主能贴出实现代码,感激不尽。小弟正想找这个方法。

gevilrror 发表于 2012-2-21 21:46:34

hsydxh 发表于 2012-2-5 10:47 static/image/common/back.gif
望版主能贴出实现代码,感激不尽。小弟正想找这个方法。

不好意思...因为最近自己的项目比较紧,可能要三月份才有时间整理它们!到时再把这段时间的也汇总一下,让大家一起探讨下吧{:1_1:}

max51888 发表于 2012-12-21 15:08:19

{:soso_e179:}
页: [1]
查看完整版本: 让CI成为CMS的一点思路,望高手指教