用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4247|回复: 6
收起左侧

[讨论/交流] 让CI成为CMS的一点思路,望高手指教

[复制链接]
发表于 2012-1-10 23:01:52 | 显示全部楼层 |阅读模式
CI版本:2.1.0
一.整体思路:
  通过application/core/MY_Controller实现核心功能。
  1.网站设置:添加两个核心类:System、Web,储存网站系统设置和页面整体设置。
  2.主题功能:许多CMS的模板功能都是外挂[size=-1]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.载入设置类

PHP复制代码
  $SYS =& load_class('system', 'core');
  $WEB =& load_class('web', 'core');
复制代码

  2.定义类,并在构造函数内载入数据库
PHP复制代码
    $this->load->database();
 
    if ( ! $this->db->db_select())
    {
        show_error('Unable to connect databse!');
    }
复制代码

  3.在构造函数内载入设置类
PHP复制代码
    $this->load->model('base/settings_model');
复制代码

  通过设置类查询数据库初始化 System 类和 Web 类
  4.在构造函数内添加相应主题view path,以便Loader先读取主题内的view文件
PHP复制代码
    $this->load->add_view_path(THEMEPATH.$this->system->site_default_tem.'/');
复制代码


三.Loader类修改部分:
  1.修改view 路径方法
PHP复制代码
    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; ?>访问变量,尽量将程序部分和视图部分分开。
PHP复制代码
        extract($this->_ci_cached_vars);
        global $SYS, $WEB
复制代码


四.Lang类
  1.修改读取默认语言
PHP复制代码
        $config =& get_config();
 
        if ($idiom == '')
        {
            $deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language'];
            $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
        }
复制代码

  修改为
PHP复制代码
        $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.语言文件优先读取
PHP复制代码
            $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:}

发表于 2012-1-12 16:19:36 | 显示全部楼层
很好的思路,支持~
 楼主| 发表于 2012-1-14 17:14:54 | 显示全部楼层
终于不是0回复啦.....{:soso_e109:}
感谢Hex,不过估计还是要看看能不能把它分离出来给大家看看才实际些
发表于 2012-2-5 10:46:15 | 显示全部楼层
这个方法很好。不过我还是搞不明白代码要怎样写。
发表于 2012-2-5 10:47:09 | 显示全部楼层
望版主能贴出实现代码,感激不尽。小弟正想找这个方法。
 楼主| 发表于 2012-2-21 21:46:34 | 显示全部楼层
hsydxh 发表于 2012-2-5 10:47
望版主能贴出实现代码,感激不尽。小弟正想找这个方法。

不好意思...因为最近自己的项目比较紧,可能要三月份才有时间整理它们!到时再把这段时间的也汇总一下,让大家一起探讨下吧
发表于 2012-12-21 15:08:19 | 显示全部楼层
{:soso_e179:}

本版积分规则