研究ecmall一些流程、结构笔记 (转)
index.php
ECMall::startup() //ecmall.php
object //所有类的基础类 ecmall.php
BaseApp //控制器基础类 app.base.php
ECBaseApp //ecapp.base.php
FrontendApp //前台控制器基础类 frontend.base.php
MallbaseApp //商城控制器基类 frontend.base.php
default.app.php //以上的类是defaultApp类的父类
根目录表示@(在这表示wwwroot/ecmall)
@index.php(根目录下的index.php文件,即wwwroot/ecmall/index.php)
@index.php(加载配置文件config.inc.php和核心文件ecmall.php)
=>ECMall::startup();
=>ecmall.php
=>startup();
=>require(ROOT_PATH.'/app'."/{$app}.app.php");(加载控制器,默认为default.app.php)
=>do_action();(DefaultApp类的方法)
=>default.app.php
=>do_action();(do_action在,defaultApp父类MallbaseApp的父类FrontendApp的父类ECBaseApp中,
其中类MallbaseApp和类FrontendApp在frontend.base.php文件中,ECBaseApp类在ecapp.base.php文件中)
=>parent::do_action();(即类ECBaseApp的父类BaseApp的成员函数do_action()(不是静态成员,若为静态成员parent改为类名),
其中BaseApp类在app.base.php文件中)
=>_run_action();
=>$this->$action();($action=$this->_curr_action,在这是等于index)
deault.app.php(DefaultApp类)
=>index();
=>$this=>assign();
=>app.base.php(BaseApp类)
=>assign();
=>_init_view();
=>$this->_view=& v();
=>ecmall.php(object类)
=>& v();(加载了/eccore/view/template.php,ecsTemplate类)
=>app.base.php(BaseApp类)
=>$this->_view->assign();(此时的$this->_view为ecsTemplate类的一个实例)
=>template.php(ecsTemplate类)
=>assign();
=>$this->_var[$key]=$val;
> default.app.php(DefaultApp类)
=>display()
=>frontend.base.php
=>display()
seo(即title,description,keywords)
$this->_config_seo(array('title'=>'...',...));//设置title标签的
=>ecapp.base.php(ECBaseApp类)
=>_config_seo();
=>_assign_seo();
=>_get_seo_code();//生成html代码,如$html.="<{$type}>{$info}</{$type}>";
frontend.base.php(FrontendApp类,line 17-18)
加载lang配置文件,
Lang::load(lang_file('common));
//加载了每个应用的配置
Lang::load(lang_file(APP));
ecmall.php()
=>lang_file();ROOT_PATH . '/languages/' . LANG . '/' . $file . '.lang.php';(config.inc.php中'LANG'=>'sc-utf-8')
ecapp.base.php(ECBaseApp类)
=>加载了Conf配置,在line 114,Conf::load($setting->getAll());
初始化方向
ecmall.php(122,require($app_file,如default.app.php))
=>default.app.php(DefaultApp类)
=>frontend.base.php(类MallbaseApp和类FrontendApp)
=>MallbaseApp
=>FrontendApp
Lang::load(lang_file('common'));
Lang::load(lang_file(APP));
=>ecapp.base.php(ECBaseApp类)
=>ECBaseApp
->$setting=af();加载了/includes/arrayfile.base.php和/include/arrayfiles/$type(如,settings).arrayfile.php
->$setting->getAll();执行了settings.arrayfile.php中get_default()和arrayfile.base.php中的_loadfromfile();
$this->_init_visitor();(Line116)(但执行了frontend.base.php中的FrontendApp类的成员函数_init_visitor(),跟
frontend.base.php中的类UserVisitor和ecapp.base.php中的类BaseVisitor相关)
=>app.base.php(BaseApp类)
=>BaseApp
$this->_init_session();//$GLOBALS['EC_ENV']
=>ecmall.php(object类)
ecapp.base.php(line 146)
env('session',$this->_session);//实现$GLOBALS['EC_ENV']['session']=$this->_session;
app.base.php()
->display
->_init_view();
->_config_view();//ecapp.base.php
模板文件夹themes/mall/default
控制器存放文件夹/app
模板编译文件夹temp/compiled
default.app.php(display())
=>template.php()
->display();
->fetch();
->make_compiled();
->fetch_str();
->smarty_prefilter_preCompile(); //去除<!-- -->,提取{}里面的内容,把它发送到select();函数中去
->select(); //解析{}里面内容
login.html
有一表单action属性的值为空则当前action的值为当前窗口的url
登陆验证码
settings.arrayfile.php
需'captcha_status'=>array('login'=>1),默认是空数组
FrontendApp::login();
if(Conf::get('captcha_status.login')){$this->assign('captcha',1);}
login.html
包含如下代码,即$captcha为真时,则显示验证码代码,为非真时则不执行验证码代码
< !--{if $captcha}-->
<tr><td>{$lang.captcha}:</td>
< td><input type="text" name="captcha" class="text" id="captcha1" />
< span><a href="javascript:change_captcha($('#captcha'));" class="renewedly">
< img id="captcha" src="index.php?app=captcha&{$random_number}" /></a>
< /span></td>
< /tr>
< !--{/if}-->
模型
ecmall.php
& db();创建MySql数据库对象实例
include_once(ROOT_PATH.'/eccore/model/mysql.php');
return new cls_mysql();
& m();获得一个模型
ROOT_PATH.'/includes/models/'.$model_name.'.model.php';
return new $model_name($params,db());
global.lib.php
& ms();会员系统连接接口
include(ROOT_PATH.'/includes/passport.base.php')
//config.inc.php,MEMBER_TYPE=>'default',default(使用内置的用户系统)
include(ROOT_PATH.'/include/passports/'.MEMBER_TYPE.'.passport.php');
return new ucfirst(MEMBER_TYPE).'Passport';
联接
自定模型属性$_relation=array();
在某模块中查询数据,如$this->_user_mod->find(array(..,'join'=>'..,..',..));
BaseModel::find();
$this->_joinModel($tables,$join);
$this->_getJoinString($_im);
$_relation['dependent']='true'。如果该在member模型定义与store模型关系。则意思即,store属于(belong to)member。
store模型对参考模型的依赖,删除时用到
has_one,belongs_to 在自定义模型设置的模型关系。区别在BaseModel::_getJoinString();函数中,如果是HAS_ONE,
则$refer_key=$this->$prikey;如果是BELONGS_TO,则$refer_key=$model->$prikey; $prikey是在自定义模型里设置的变量,$this和$model分别是这两个模型
关系分别关联的模型的实例的引用
reverse,是在type为belongs_to关系中,值是为一个自定模型的关系名称。如果在member.model.php有$_relation(..,'manage_store'=>array('model'=>'store','reverse'=>'be_manage',..),..);
则M('store')的$_relation属性中就有be_manage关系。
has_one
本表参考键=外表外键
belongs_to
本表外键=外表参考键
has_and_belongs_to_many
本表主键=中间表外键
中间表意思就是这个表是两个表之间的关系表,如会员表跟角色表的关系表就是中间表,这个表必须包含有这两个表的主键,如果会员表
名为user而角色表名为role则中间表为user_role
后台的登陆页,/ecmall/admin/index.php
=>ECMall::startup();
=>ecmall.php
=>startup();
=>require(dirname(__FILE__).'/app'."/{$app}.app.php");(加载控制器,默认为default.app.php)
=>do_action();(do_action在,defaultApp父类MallbaseApp的父类FrontendApp的父类ECBaseApp中,
其中类MallbaseApp和类FrontendApp在frontend.base.php文件中,ECBaseApp类在ecapp.base.php文件中)
=>app.base.php
=>do_action();ECBaseApp类父类BaseApp的方法)
=>backend.base.php
=>_run_action();
=>$this->login();或parent::_run_action();(ecapp.base.php)
***********************************************************************************************************************
模板
显示挂件
template::display_widgets();
FrontendApp::display_widgets();
include_once '/includes/widget.base.php';
& widget(); //widget.base.php
include_once('external/widgets/'.$name.'/main.widget.php'); //$name值如,notice
return new $name.'Widget'();
BaseWidget::BaseWidget();
$this=id,widget_path,widget_root,_view,_view->lib_base,options;
assign=options,widget_root,id,name
$widget->display(); //frontendApp::display_widgets();$widget=new $name.'Widget'();
BaseWidget::display();
echo BaseWidget::get_contents();
BaseWidget::get_contents();
NoticeWidget::_get_data();
assgin=widget_data,options,widget_root
BaseWidget::_wrap_contents();
***********************************************************************************************************************
eccore/ecmall.php
class Object function _error($msg,$obj=''); //eccore/model/model.base.php中有实例
研究ecmall一些流程、结构笔记 (转)的更多相关文章
- 分享一下我研究SQLSERVER以来收集的笔记
分享一下我研究SQLSERVER以来收集的笔记 前言 为什麽分享??因为像现在网上很多人攻城师那样,转行去卖水果,卖早餐,总有一日我也会离开这个行业的 由于本人不是在大公司上班工资很低,我希望有一天存 ...
- 【转】《分享一下我研究SQLSERVER以来收集的笔记》未整理
分享一下我研究SQLSERVER以来收集的笔记 http://www.cnblogs.com/lyhabc/archive/2013/07/27/3219117.html
- 【粗糙版】javascript的变量、数据类型、运算符、流程结构
本文内容: javascript的变量 javascript的数据类型 javascript的运算符 javascript的流程结构 首发日期:2018-05-09 javascript的变量 创建变 ...
- MySQL学习之流程结构
流程结构 流程结构:代码的执行顺序. if分支 根据要求选择合适的执行部分. 基本语法 if在MySQL中有两种基本用法 1.用在select查询当中,当作一种条件来进行判断. 基本语法:if(条件, ...
- C语言基础知识-程序流程结构
C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...
- Go流程结构(for)
一.程序的流程结构 程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构. 顺序结构:代码从上向下逐行的执行 选择结构:条件满足,某些代码才会被执行.0-1次 if语句,switch语句 循环结 ...
- Go流程结构(if)
一.程序的流程结构 程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构. 顺序结构:从上向下,逐行执行. 选择结构:条件满足,某些代码才会执行.0-1次 分支语句:if,switch,sele ...
- 巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
流程结构就是指程序逻辑到底怎么执行,进而言之,程序执行逻辑的顺序.众所周知,程序整体都是自上由下执行的,但有的时候,又不仅仅是从上往下执行那么简单,大体上,Go lang程序的流程控制结构一共有三种: ...
- VerilogHDL概述与数字IC设计流程学习笔记
一.HDL的概念和特征 HDL,Hard Discrimination Language的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...
随机推荐
- underscore || lodash
1.http://www.css88.com/archives/5443 (underscore) let list = _.filter(record.orderGoodsList, item =& ...
- Oracle 使用小技巧
1.小数转换成字符往往会丢失前面的零. 解决方法: to_char(0.12345,'fm9999999990.00'); 2.除数为零的话oracle老是报错. 解决方法: decode(B,0,0 ...
- 四、dbms_alert(用于生成并传递数据库预警信息)
1.概述 作用:用于生成并传递数据库预警信息.使用包DBMS_ALERT,则必须以SYS登陆,为该用户授予执行权限.sql>conn sys/oracle as sysdbasql>gra ...
- 深入理解java泛型
一. 什么是泛型? 泛 型(Generic type 或者 generics)是对 简单的理解,就是对类型的参数化,比如我们定义一个类属性或者实例属性时,往往要指定具体的类型,如Integer.Per ...
- (转)MapReduce Design Patterns(chapter 6 (part 2))(十二)
Chain Folding 这是对job 链的一种优化.基本上是一种大体规则:每条记录都会提交给多个mapper,或者给reducer然后给mapper.这种综合处理方法会节省很多读文件和传输数据的时 ...
- 利用层序遍历(含空节点)和中序遍历重建二叉树 python
给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...
- 01-名字管理系统.py
#-*- coding:utf-8 -*- #1.打印功能提示 print("-"*50) print("名字管理系统 V8.6") print("1 ...
- 实现Python代码发送邮件
import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMETex ...
- usb udev
[root@localhost ~] # udevadm monitor monitor will print the received events for: UDEV - the event wh ...
- 每天一个linux命令:【转载】mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目 ...