研究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的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...
随机推荐
- 华硕笔记本开机直接进入bios解决方法
1.开机按esc键或F12,进入bios,打开BOOT标签,将Launch CSM改为Enabled,但此时的Launch CSM是Disabled,并且是灰色不可编辑状态. 2.按方向键切换到Sec ...
- Pandas:SettingWithCopyWarning
当我为数据增加新的列的时候,Pandas一直报错:SettingWithCopyWarning 这个问题没有很好地解决方法,因为这个问题也无关大碍,不让Pandas报错就行了. 解决方法: pd.op ...
- yum 数据库报错与重构
[root@dhcp yum.repos.d]# cd /var/lib/rpm/ [root@dhcp rpm]# rm __db.* -rf[root@dhcp rpm]# rpm --rebui ...
- UITextField点击选中文字
1.先创建UITextField - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...
- 将VIM打造成强大的IDE
转载自:所需即所获:像 IDE 一样使用 vim 如侵犯您的版权,请联系:2378264731@qq.com --------------------------------------------- ...
- Linux系统在启动过程中启动级别发生错误的解决办法
一.系统启动级别一共有六个: 0:系统停机模式,系统不可以正常启动 1:单用户模式, root权限,用于系统的维护,禁止远程登陆 2:多用户模式,没有NFS网络支持 3:完整的多用户文本模式,有NFS ...
- 在.NET Core中连接使用Zookeeper
一开始找到的是ZookeeperNetEx,但是很多API都很原始,不怎么好用. 最后确定用Rabbit.Zookeeper来做,他对ZookeeperNetEx进行了封装,要简单不少. 和c语言和j ...
- c# 一个记录日志的通用方法
public static string WriteFile(string strText, string path) { Encoding code = Encoding.GetEncoding(& ...
- Unity3D 屏幕空间雪场景Shader渲染
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- Extjs 5 可选择日期+时间的组件DateTimeField
我们都知道ExtJs有日期组件DateField,但直到ExtJs 5.0版本该日期组件也只能选择日期,不能选择时间(具体到时.分.秒),而实际工作中又常常会有需要日期和时间同时选择的需求,我们只能自 ...