ECMALL完整教程.doc

上传人:asd****56 文档编号:70345616 上传时间:2023-01-19 格式:DOC 页数:24 大小:103.50KB
返回 下载 相关 举报
ECMALL完整教程.doc_第1页
第1页 / 共24页
ECMALL完整教程.doc_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《ECMALL完整教程.doc》由会员分享,可在线阅读,更多相关《ECMALL完整教程.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Ecmall的详细分析-系统请求跳转分析ecmall的程序的大致结构,如图所示:根据ecmall的程序结构图,你可以清楚的知道ecmall的五脏六腑!ecmall的五脏六腑然后,根据我的学习,觉得其中一些值得我学习的地方,一一提取出来,对它进行分析,与理解。做如下几个问题的处理:需要分析的问题:1、系统请求跳转分析2、数据库关系模型的实现3、登录用户信息$this-visitor-get(“user_id”)的实现4、模板解析分析5、页面json对象传输实现6、 缓存分析这里需要提出的是:笔者也是在慢慢的学习它,难免会有不对之处,欢迎大侠们拍转,提出宝贵的意见!谢谢1、系统请求跳转分析:对于这

2、个问题,我们要首先看看下面的这段代码: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./include

3、s/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.php 21.22. classecmall 23. 24. /*启动*/ 25. functionstartup($config=array() 26. 27. /*加载初始化文件*/ 28. require(ROOT_PATH./eccore/

4、controller/app.base.php);/基础控制器类 29. require(ROOT_PATH./eccore/model/model.base.php);/模型基础类 30.31. if(!emptyempty($configexternal_libs) 32. 33. foreach($configexternal_libsas$lib) 34. 35. require($lib); 36. 37. 38. /*数据过滤*/ 39. if(!get_magic_quotes_gpc() 40. 41. $_GET=addslashes_deep($_GET); 42. $_P

5、OST=addslashes_deep($_POST); 43. $_COOKIE=addslashes_deep($_COOKIE); 44. 45.46. /*请求转发*/ 47. $default_app=$configdefault_app?$configdefault_app:default; 48. $default_act=$configdefault_act?$configdefault_act:index; 49.50. $app=isset($_REQUESTapp)?trim($_REQUESTapp):$default_app; 51. $act=isset($_REQ

6、UESTact)?trim($_REQUESTact):$default_act; 52.53. $app_file=$configapp_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

7、_class_name(); 66. c($app); 67. $app-do_action($act);/转发至对应的Action 68. $app-destruct(); 69. 70. 71.72. /根据app后面所跟的参数,来判断加载对应的控制器类文件,类文件在app文件夹下,对应名称与参数相同,act 后面的参数是对应控制器中的操作方法处理请求 73. /而对应的动作中,会有一个判断:if(!IS_POST)请求前的页面内容的显示else请求后的表单处 理及处理完成后的页面跳转。其中包括使用json处理数据 74. /这里需要提出的是:在控制器中: 75. $this-assign

8、(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 = fals

9、e)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)/* 不存在该文件,则无法获取模型 */return false;include_once($model_file);$model_name = ucfirst(

10、$model_name) . Model;if ($is_new)return new $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);

11、if ($is_new | !isset($models$model_hash)$model_file = ROOT_PATH . /includes/models/ . $model_name .model.php;if (!is_file($model_file)/* 不存在该文件,则无法获取模型 */return false;include_once($model_file);$model_name = ucfirst($model_name) . BModel;if ($is_new)return new $model_name($params, db();$models$model_

12、hash = new $model_name($params, db();return $models$model_hash; 所谓模型,则是一个一个的数据实体,换句话说就是一个数据表,你可以基于这个模型,调用model.base.php中的数据库操作函数来对数据进行增、删、改、查的操作。这里的业务模型,是在实体模型基础上,再继承一次,然后对一些方法进行重写。系统中只有三个实体有业务模型:推荐类型 recommend;商品数据模型 goods;商品分类业务模型 gcategory;具体操作例子:/物品表的操作:$model_goods = & m(goods);$goods_info = $m

13、odel_goods-get($goods_id); 这里需要解释一下对于数据模型的操作是怎样的一个函数调用过程:首先:$model_goods = &m(goods);我们看一下&m()函数的代码,其中var_export()函数则是将传进来的实体,返回相应的实体类对象,因为所有的model都继承至model.base.php中的BaseModel类,这个类中定义了基本所有的操作函数,因此$model_goods对象可以对数据库进行相应的操作。而我们再看看goods.model.php中的GoodsModel的代码: class GoodsModel extends BaseModelvar

14、 $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 = H

15、AS_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_goods

16、image = 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,mi

17、ddle_table = category_goods,foreign_key = goods_id,reverse = has_goods,),/ 商品和会员是多对多的关系(会员收藏商品)be_collect = array(model = member,type = HAS_AND_BELONGS_TO_MANY,middle_table = collect,foreign_key = item_id,ext_limit = array(type = goods),reverse = collect_goods,),/ 商品和推荐类型是多对多的关系 todobe_recommend = a

18、rray(model = recommend,type = HAS_AND_BELONGS_TO_MANY,middle_table = recommended_goods,foreign_key = goods_id,reverse = recommend_goods,),);var $_autov = array(goods_name = array(required = true,filter = trim,),);这里贴出了实体goods模型类中的内容,先是表格的属性,再就是goods与其它实体之间的关联关系的定义。然后我们再看看这个函数,它是BaseModel构造函数里调用的方法,对

19、对象中的基础变量进行初使化:function BaseModel($params, $db)$this-db =& $db;!$this-alias & $this-alias = $this-table;$this-_prefix = DB_PREFIX;$this-table = $this-_prefix . $this-table;if (!emptyempty($params)foreach ($params as $key = $value)$this-$key = $value; 大家已经看出$_relation 中间是此实体的关联信息,然后在BaseModel类中的一个函数:f

20、unction _getJoinString($relation_info)switch ($relation_infotype)case HAS_ONE:/$model =& m($relation_infomodel);/* 联合限制 */$ext_limit = ”;$relation_infoext_limit & $ext_limit = AND . $this-_getExtLimit($relation_infoext_limit);/* 获取参考键,默认是本表主键(直接拥有),否则为间接拥有 */$refer_key = isset($relation_inforefer_ke

21、y) ? $relation_inforefer_key : $this-prikey;/* 本表参考键=外表外键 */return ” LEFT JOIN $model-table $model-alias ON $this-alias.$refer_key=$model-alias.$relation_infoforeign_key$ext_limit”;break;case BELONGS_TO:/* 属于关系与拥有是一个反向的关系 */$model =& m($relation_infomodel);$be_related = $model-getRelation($relation_

22、inforeverse);if (emptyempty($be_related)/* 没有找到反向关系 */$this-_error(no_reverse_be_found, $relation_infomodel);return ”;$ext_limit = ”;!emptyempty($relation_infoext_limit) & $ext_limit = AND . $this-_getExtLimit($relation_infoext_limit, $this-alias);/* 获取参考键,默认是外表主键 */$refer_key = isset($be_relatedref

23、er_key) ? $be_relatedrefer_key :$model-prikey ;/* 本表外键=外表参考键 */return ” LEFT JOIN $model-table $model-alias ON $this-alias.$be_relatedforeign_key = $model-alias.$refer_key$ext_limit”;break;case HAS_AND_BELONGS_TO_MANY:/* 连接中间表,本表主键=中间表外键 */$malias = isset($relation_infoalias) ? $relation_infoalias :

24、 $relation_infomiddle_table;$ext_limit = ”;$relation_infoext_limit & $ext_limit = AND . $this-_getExtLimit($relation_infoext_limit, $malias);return ” LEFT JOIN $this-_prefix$relation_infomiddle_table $malias ON $this-alias.$this-prikey = $malias.$relation_infoforeign_key$ext_limit”;break;/* 模型相关常量定义

25、 */define(HAS_ONE, 1); /一对一关联define(BELONGS_TO, 2); /属于关联define(HAS_MANY, 3); /一对多关联define(HAS_AND_BELONGS_TO_MANY, 4); /多对多关联define(DROP_CONDITION_TRUNCATE, TRUNCATE); /清空从这个函数中,我们可以看到,对于不同的关联关系,它会返回不同的关联时的查询语句片断,然后连接上主sql语句,就可以针对实体的关联实体进行相应的关联操作了。/物品表的操作:$model_goods = & m(goods);$goods_info = $mo

26、del_goods-find(array(conditions = “if_show=1 and closed=0,fields = goods_id,goods_name,s.store_id,s.store_name,join = blongs_to_store); 这里的join = blongs_to_store ,我们从上面的:/ 一个商品只能属于一个店铺belongs_to_store = array(model = store,type = BELONGS_TO,foreign_key = store_id,reverse = has_goods,),这里我们可以知道这是在与st

27、ore表进行关联查找了。到这里,读者就可以知道,如果在上面进行二次开发的话,怎样进行数据库操作就已经很明确的了。在BaseModel与cls_mysql(mysql.php)中,有很多的有关数据操作的函数,这里就不需要再一一进行解释了,而在cls_mysql中,有一些更基础的操作函数,还有仿真 Adodb 的函数,可以直接跳过BaseModel中的函数以上介绍了如何在ecmall的平台上进行数据库操作,如果操作更加的复杂,这里还有一种更加直接的方法:$sql = “select g.goods_id,g.goods_name, from “.DB_PREFIX.”goods g, “.DB_P

28、REFIX.”goods_spec gs , “.DB_PREFIX.”store s where cate_id=”.$cate_id.” AND g.if_show = 1 AND g.closed = 0 and g.goods_id=gs.goods_id and g.store_id=s.store_id and gs.stock0 and s.state=1 order by g.add_time desc limit 6;$goods_mod =& m(goods);$category_goods = $goods_mod-getAll($sql);if(!$category_g

29、oods)$category_goods=array();return $category_goods; 就可以直接使用sql语句进行数据操作了。还可以在BaseModel中定义自己的操作方法,其中可以使用$this-db-(cls_mysql中定义的方法) 来调用cls_mysql中的函数,从而可以添加更加复杂的数据操作函数。好了,数据操作分析就这些了,有不对之处,还请拍砖!Ecmall的详细分析3-登录用户信息$this-visitor-get(“user_id”)的实现在ecpp.base.php中定义了一个BaseVisitor extends Object 类,它对session中的

30、当前登录的用户信息进行判断与初使化,我们先看看它的构造器:Php代码1. function BaseVisitor() 2. 3. if ($_SESSION$this-_info_keyuser_id) 4. 5. $this-info =$_SESSION$this-_info_key; 6. $this-has_login = true; 7. 8. else 9. 10. $this-info = array( 11. user_id = 0, 12. user_name = Lang:get(guest) 13. ); 14. $this-has_login = false; 15.

31、 16. 它在构造器中就对$_SESSION中进行_info_key的判断,判断是否存在,存在则用户已经登录,不存在,则用户还没有登录而这里的_info_key,则是在它的子类:UserVisitor extends BaseVisitor中进行附值的:Php代码1. class UserVisitor extends BaseVisitor 2. 3. var $_info_key= user_info; 4. 这个子类,在FrontendApp extends ECBaseApp类中的:Php代码1. function _init_visitor() 2. 3. $this-visitor

32、 =& env(visitor, new UserVisitor(); 4. 中对visitor进行初使化的。因此这就可以让我们在FrontendApp的子类中使用$this-visitor-get(“user_id”)就可以获取当前登录用户的信息,而根据ecmall的继承图中我们可以知道,基本在所有的实体对象操作类中都可以使用它对当前登录用户进行访问!而在BaseVisitor类中,集合了更多的函数可以对用户是否登录,获取当前用户信息等内容进行操作。而对于系统后台的用户操作,与前台是一样的,只不过后台是:admin/app/backend.base.php中的BackendApp类.Ecma

33、ll的详细分析4-模板渲染模板说白了,就是在php文件里,把要算的数都算出来,然后在模板文件中使用php算出来的结果,而不要html代码套在php循环里面。 拿店铺的网址为例,注意,最后id的那个参数要根据你的程序来。在根目录下的app文件夹内找到store.app.php文件,这就是控制店铺页面的php文件。 这个页面有很多的function,第一个 function index() 就是我们要找到控制店铺页面的具体代码,在这个index的函数最后,有句$this-display(store.index.html);这是说跟这段php代码配套的模板文件叫store.index.html,然后

34、我们就去根目录下的themes/store/里去找到它。第一句include file=header.html表示调用同级目录下的header.html,你把这样的代码去掉,刷新页面就知道他们具体是哪块内容了。 我们再回到store.app.php页面,$this-assign 这个函数出现的很多,它表示一个声明,声明一个php里运算出的变量可以在模板文件中使用 ,比如说“/* 取得推荐商品 */”,就是把友情链接的数组赋值给recommended_goods,我们在store.index.html中搜索recommended_goods,会找到,这是模板文件的写法,表示循环输出这个recommended_goods数组,其实跟php里的foreach函数的作用一样,只是换个写法罢了。基本上就这样,此外提醒一点就是,我们在store.app.php中看到友情链接的声明partners,在store.index.html中搜索,是没有的,不是我们搞错了,是因为这段模板代码是调用的include file=footer.html,你在footer.html里就会找到。好了说到这大概就知道ECMALL怎么回事了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁