织梦cms简单易用 是我们这些水货站长首选的cms 但随着功能的扩展,织梦好像渐渐的变得臃肿不堪,可扩展性不好,结构不是很清晰 ,跟joomla、wp、phpcms的架构不在一个级别上了,但并不是架构牛叉就是好货,只有适合自己的cms才是王道,用别人开源产品,还说三道四感觉不是很道德,我们讨论的目的其实是为了织梦变得更加牛逼,下面我们就来分享下我的织梦自带的轻量级的mvc框架学习笔记,如果织梦还有未来,应该也在朝这个方向发展,水平有限,求指导求打击。
涉及的文件
common.func.php 入口函数所在文件
control.class.php 控制器基类
model.class.php 模型基类
基本的目录结构
control 存放控制器
model 存放模型
static 静态资源
templates 模板文件
index.php 程序入口文件
入口文件分析:
<?php require_once(dirname(__file__).'/../include/common.inc.php');//织梦初始化必须的文件 require_once(DEDEINC.'/request.class.php');//过滤接受变量的处理,如果我们直接接受变量也可以,织梦默认就对get post cookies处理过了,搞不清楚 $ct = Request('c', 'index');//控制器 $ac = Request('a', 'index');//模型 RunApp($ct, $ac); ?>
比如我们要 访问jsbba这个控制器里面的index方法 构造的url /jsbba/index.php?c=jsbba&a=index
入口直接执行common.func.php文件里 RunApp函数
function RunApp($ct, $ac = '',$directory = '') { $ct = preg_replace("/[^0-9a-z_]/i", '', $ct);//匹配名称 $ac = preg_replace("/[^0-9a-z_]/i", '', $ac);//匹配名称 $ac = empty ( $ac ) ? $ac = 'index' : $ac; //如果没指定控制器就默认找index if(!empty($directory)) $path = DEDECONTROL.'/'.$directory. '/' . $ct . '.php';//没指定路径后的控制器路径 else $path = DEDECONTROL . '/' . $ct . '.php';//控制器路径 if (file_exists ( $path )) { require $path;//包含控制器 } else { if (DEBUG_LEVEL === TRUE)//如果开了调试输出提示 { trigger_error("Load Controller false!"); } //生产环境中,找不到控制器的情况不需要记录日志 else { header ( "location:/404.html" );//没有直接跳到404 die (); } } $action = 'ac_'.$ac;//组建控制器方法名称 比如我的方法为index 那么我定义方法名就应该为 ac_index $loaderr = FALSE; $instance = new $ct ( );//实例化控制器 if (method_exists ( $instance, $action ) === TRUE) { $instance->$action();//执行控制器里面的方法 unset($instance); } else $loaderr = TRUE; if ($loaderr)//处理方法不存在的情况 { if (DEBUG_LEVEL === TRUE) { trigger_error("Load Method false!"); } //生产环境中,找不到控制器的情况不需要记录日志 else { header ( "location:/404.html" ); die (); } } }
这样我就实例化了我们的控制器 并执行了控制器里面的方法
控制器基类 control.class.php
class Control { var $tpl;//编译型模板引擎实例 var $dsql;//数据库操作类实例 var $style='default'; var $_helpers = array(); var $apptpl = '../templates/'; function __construct() { $this->Control(); } // 析构函数 function Control() { global $dsql; $this->tpl = isset($this->tpl)? $this->tpl : new DedeTemplate();//实例模板引擎实例 $sqltype = "DedeSql"; if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init")) $sqltype = "DedeSql"; else $sqltype = "DedeSqli"; $this->dsql = isset($dsql)? $dsql : new $sqltype(FALSE);//根据前面的判定优先实例mysqli的数据库操作实例 } //设置模板 //如果想要使用模板中指定的pagesize,必须在调用模板后才调用 SetSource($sql) function SetTemplate($tplfile)//包了一个dedetemplate类的设置模板的方法 { $tplfile = DEDEAPPTPL.'/'.$this->style.'/'.$tplfile; $this->tpl->LoadTemplate($tplfile); } function SetTemplet($tplfile)//我靠这是是什么,搞不清白 { $tplfile = DEDEAPPTPL.'/'.$this->style.'/'.$tplfile; $this->tpl->LoadTemplate($tplfile); } //设置/获取文档相关的各种变量 function SetVar($k, $v)//分配变量到模板(视图) { $this->tpl->Assign($k, $v);//$GLOBALS['_vars']['变量名'] 这样获取 } function GetVar($k)//获取分配的变量 { global $_vars; return isset($_vars[$k]) ? $_vars[$k] : ''; } function Model($name='')//模型调用 在控制器里面$this-Model('模型名') 这样调用 { $name = preg_replace("#[^\w]#", "", $name); $modelfile = DEDEMODEL.'/'.$name.'.php'; if (file_exists($modelfile)) { require_once $modelfile; } if (!empty($name) && class_exists($name)) { return new $name;//返回模型 } return false; } function Libraries($name='',$data = '')//扩展类库的加载 { if(defined('APPNAME')) { $classfile = 'MY_'.$name.'.class.php'; if ( file_exists ( '../'.APPNAME.'/libraries/'.$classfile ) ) { require '../'.APPNAME.'/libraries/'.$classfile; return new $name($data);//返回实例 }else{ if (!empty($name) && class_exists($name)) { return new $name($data); } } return FALSE; }else{ if (!empty($name) && class_exists($name)) { return new $name($data); } return FALSE; } } //载入helper function helper($helper = "",$path) { $help_path = $path.'/data/helper/'.$helper.".helper.php"; if (file_exists($help_path)) { include_once($help_path); }else{ exit('Unable to load the requested file: '.$helper.".helper.php"); } } //显示数据 function Display()//包了模板引擎的display方法 { $this->tpl->SetObject($this); $this->tpl->Display(); } //保存为HTML function SaveTo($filename)//生成静态 { $this->tpl->SetObject($this); $this->tpl->SaveTo($filename); } // 释放资源 function __destruct() { unset($this->tpl); $this->dsql->Close(TRUE); } }
model.class.php 模型基类
基类非常的简单,没有什么功能 就直接引了个dsql数据库操作类
class Model { var $dsql; var $db; // 析构函数 function Model() { global $dsql; if ($GLOBALS['cfg_mysql_type'] == 'mysqli') { $this->dsql = $this->db = isset($dsql)? $dsql : new DedeSqli(FALSE); } else { $this->dsql = $this->db = isset($dsql)? $dsql : new DedeSql(FALSE); } } // 释放资源 function __destruct() { $this->dsql->Close(TRUE); } }
这样一个简单mvc架构就成了,感觉又点不好操作的是 控制器默认实例了一个模板引擎 不带分页功能 需要自己写 但织梦本身有一个datalistcp.class.php的处理分页的文件,里面包含了模板引擎实例,我们可以改控制器基类 让他默认就带分页的功能 那操作就方便点了,基类的方法太少了,织梦爱好者一起来扩展吧,呵呵