织梦轻量级mvc框架笔记

织梦cms简单易用  是我们这些水货站长首选的cms  但随着功能的扩展,织梦好像渐渐的变得臃肿不堪,可扩展性不好,结构不是很清晰 ,跟joomla、wp、phpcms的架构不在一个级别上了,但并不是架构牛叉就是好货,只有适合自己的cms才是王道,用别人开源产品,还说三道四感觉不是很道德,我们讨论的目的其实是为了织梦变得更加牛逼,下面我们就来分享下我的织梦自带的轻量级的mvc框架学习笔记,如果织梦还有未来,应该也在朝这个方向发展,水平有限,求指导求打击。

涉及的文件

common.func.php  入口函数所在文件

control.class.php 控制器基类

model.class.php 模型基类

基本的目录结构

织梦轻量级mvc框架笔记

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的处理分页的文件,里面包含了模板引擎实例,我们可以改控制器基类 让他默认就带分页的功能 那操作就方便点了,基类的方法太少了,织梦爱好者一起来扩展吧,呵呵


你可能感兴趣的:(织梦轻量级mvc框架笔记)