Ecmall的详细分析—-系统请求跳转分析ecmall的程序的大致结构,如图所示:根据ecmall的程序结构图,你可以清楚的知道ecmall的五脏六腑!ecmall的五脏六腑然后,根据我的学习,觉得其中一些值得我学习的地方,一一提取出来,对它进行分析,与理解。做如下几个问题的处理:需要分析的问题:1、系统请求跳转分析2、数据库关系模型的实现3、登录用户信息$this-visitor-get(“user_id”)的实现4、模板解析分析5、页面json对象传输实现6、缓存分析这里需要提出的是:笔者也是在慢慢的学习它,难免会有不对之处,欢迎大侠们拍转,提出宝贵的意见!谢谢1、系统请求跳转分析:对于这个问题,我们要首先看看下面的这段代码:Php代码1.index.php:2.3.include(ROOT_PATH.’/eccore/ecmall.php’);4./*启动ecmall*/5.ecmall::startup(array(6.‘default_app’=’default’,7.‘default_act’=’index’,8.‘app_root’=ROOT_PATH.’/app’,9.//加载系统所需要的基础类10.‘external_libs’=array(11.ROOT_PATH.’/includes/global.lib.php’,12.ROOT_PATH.’/includes/libraries/time.lib.php’,13.ROOT_PATH.’/includes/ecapp.base.php’,14.ROOT_PATH.’/includes/plugin.base.php’,15.ROOT_PATH.’/app/frontend.base.php’,16.),17.));18.19.20.ecmall.php21.22.classecmall23.{24./*启动*/25.functionstartup($config=array())26.{27./*加载初始化文件*/28.require(ROOT_PATH.’/eccore/controller/app.base.php’);//基础控制器类29.require(ROOT_PATH.’/eccore/model/model.base.php’);//模型基础类30.31.if(!emptyempty($config['external_libs']))32.{33.foreach($config['external_libs']as$lib)34.{35.require($lib);36.}37.}38./*数据过滤*/39.if(!get_magic_quotes_gpc())40.{41.$_GET=addslashes_deep($_GET);42.$_POST=addslashes_deep($_POST);43.$_COOKIE=addslashes_deep($_COOKIE);44.}45.46./*请求转发*/47.$default_app=$config['default_app']?$config['default_app']:’default’;48.$default_act=$config['default_act']?$config['default_act']:’index’;49.50.$app=isset($_REQUEST['app'])?trim($_REQUEST['app']):$default_app;51.$act=isset($_REQUEST['act'])?trim($_REQUEST['act']):$default_act;52.53.$app_file=$config['app_root'].”/{$app}.app.php”;54.if(!is_file($app_file))55.{56.exit(‘Missingcontroller’);57.}58.59.require($app_file);60.define(‘APP’,$app);61.define(‘ACT’,$act);62.$app_class_name=ucfirst($app).’App’;63.64./*实例化控制器*/65.$app=new$app_class_name();66.c($app);67.$app-do_action($act);//转发至对应的Action68.$app-destruct();69.}70.}71.72.//根据app后面所跟的参数,来判断加载对应的控制器类文件,类文件在app文件夹下,对应名称与参数相同,act后面的参数是对应控制器中的操作方法处理请求73.//而对应的动作中,会有一个判断:if(!IS_POST){请求前的页面内容的显示}else{请求后的表单处理及处理完成后的页面跳转}。其中包括使用json处理数据74.//这里需要提出的是:在控制器中:75.$this-assign(‘order’,$order_info);//向模板页传递所需要参数的值76.$this-display(‘buyer_order.confirm.html’);//跳转到哪个页面77.$this-json_result($new_data,’confirm_order_successed’);//使用json的方式传递参数,然后在页面上使用javascript处理请求的跳转Ecmall的详细分析2—-数据库关系模型的实现对于数据库关系模型的分析,我觉得需要从两个函数说起://获取一个模型function&m($model_name,$params=array(),$is_new=false){static$models=array();$model_hash=md5($model_name.var_export($params,true));if($is_new||!isset($models[$model_hash])){$model_file=ROOT_PATH.‘/includes/models/’.$model_name.‘.model.php’;if(!is_file($model_file)){/*不存在该文件,则无法获取模型*/returnfalse;}include_once($model_file);$model_name=ucfirst($model_name).‘Model’;if($is_new){returnnew$model_name($params,db());}$models[$model_hash]=new$model_name($params,db());}return$models[$model_hash];}//获取一个业务模型function&bm($model_name,$params=array(),$is_new=false){static$models=array();$model_hash=md5($model_name.var_export($params,true));if($is_new||!isset($models[$model_hash])){$model_file=ROOT_PATH.‘/includes/models/’.$model_name.‘.model.php’;if(!is_file($model_file)){/*不存在该文件,则无法获取模型*/returnfalse;}include_once($model_file);$model_name=ucfirst($model_name).‘BModel’;if($is_new){returnnew$model_name($params,db());}$models[$model_hash]=new$model_name($params,db());}return$models[$model_hash];}所谓模型,则是一个一个的数据实体,换句话说就是一个数据表,你可以基于这个模型,调用model.base.php中的数据库操作函数来对数据进行增、删、改、查的操作。这里的业务模型,是在实体模型基础上,再继承一次,然后对一些方法进行重写。系统中只有三个实体有业务模型:推荐类型recommend;商品数据模型goods;商品分类业务模型gcategory;具体操作例子://物品表的操作:$model_goods=&m(‘goods’);$goods_info=$model_goods-get($goods_id);这里需要解释一下对于数据模型的操作是怎样的一个函数调用过程:首先:$model_goods=&m(‘goods’);我们看一下&m()函数的代码,其中var_export()函数则是将传进来的实体,返回相应的实体类对象,因为所有的model都继承至model.base.php中的BaseModel类,这个类中定义了基本所有的操作函数,因此$model_goods对象可以对数据库进行相应的操作。而我们再看看goods.model.php中的GoodsModel的代码:classGoodsModelextendsBaseModel{var$table=‘goods’;var$prikey=‘goods_id’;var$alias=‘g’;//缩写var$_name=‘goods’;var$temp;//临时变量var$_relation=array(//一个商品对应一条商品统计记录‘has_goodsstatistics’=array(‘model’=‘goodsstatistics’,‘type’=HAS_ONE,‘foreign_key’=‘goods_id’,‘dependent’=true),//一个商品对应多个规格‘has_goodsspec’=array(‘model’=‘goodsspec’,‘type’=HAS_MANY,‘foreign_key’=‘goods_id’,‘dependent’=true),//一个商品对应一个默认规格‘has_default_spec’=array(‘model’=‘goodsspec’,‘type’=HAS_ONE,‘refer_key’=‘default_spec’,‘foreign_key’=‘spec_id’,),//一个商品对应多个属性‘has_goodsattr’=array(‘model’=‘goodsattr’,‘type’=HAS_MANY,‘foreign_key’=‘goods_id’,‘dependent’=true),//一个商品对应多个图片‘has_goodsimage’=array(‘model’=‘goodsimage’,‘type’=HAS_MANY,‘foreign_key’=‘goods_id’,‘dependent’=true),//一个商品只能属于一个店铺‘belongs_to_store’=array(‘model’=‘store’,‘type’=BELONGS_TO,‘foreign_key’=‘store_id’,‘reverse’=‘has_goods’,),//商品和分类是多对多的关系‘belongs_to_gcategory’=array(‘model’=‘gcategory’,‘type’=HAS_AND_BELONGS_TO_MANY,‘middle_table’=‘category_goods’,‘foreign_key’=‘goods_id’,‘reverse’=‘has_goods’,),//商品和会员是多对多的关系(会员收藏商品)‘be_collect’=array(‘model’=‘member’,‘type’=HAS_AND_BELONGS_