在ecmall.php文件中实例化控制器类,每一个控制器类,必须继承(extends)upload\admin\app\backend.base.php文件。在继承中调用方法是谁先被继承谁的方法被先调用。
以default为例,首先在公共入口文件index.php文件中包含eccore/ecmall.php文件,调用startup方法并把includes/global.lib.php,includes/libraries/time.lib.php,includes/ecapp.base.php,includes/plugin.base.php,app/backend.base.php,以数据方式传递。在ECMAall类中的startup()方法中包含了eccore/controller/app.base.php和eccore/model/model.base.php文件。
获得控制器默认为[upload\admin\app\default.app.php文件,并继承BackendApp(app/backend.base.php)类,并继承ECBaseApp(includes/ecapp.base.ph)类,并继承BaseApp(eccore/controller/app.base.php),并继承Object(eccore/ecmall.php)]。然后调用ECBaseApp中的do_action()方法在调用其实父类BaseApp中的do_action()并判断$act(index)方法在默认控制器中是否存在,如果存在并符合条件,调用本对像是最早继承文件(app/backend.base.php)他中的_run_action()方法。
07 |
function _run_action() |
10 |
if (!$this->visitor->has_login) |
18 |
if (!$this->visitor->i_can('do_action', $this->visitor->get('privs'))) |
20 |
$this->show_warning('no_permission'); |
26 |
parent::_run_action(); |
在此要判断当前用户是否登录。
如果没有登录,调用(app/backend.base.php)他中的login()方法。
03 |
if ($this->visitor->has_login) |
05 |
$this->show_warning('has_login'); |
11 |
if (Conf::get('captcha_status.backend')) |
13 |
$this->assign('captcha', 1); |
15 |
$this->display('login.html'); |
19 |
if (Conf::get('captcha_status.backend') && base64_decode($_SESSION['captcha']) !=strtolower($_POST['captcha'])) |
21 |
$this->show_warning('captcha_faild'); |
26 |
$user_name = trim($_POST['user_name']); |
27 |
$password = $_POST['password']; |
30 |
$user_id = $ms->user->auth($user_name, $password); |
34 |
$this->show_warning($ms->user->get_error()); |
40 |
if (!$this->_do_login($user_id)) |
45 |
$this->show_message('login_successed', |
46 |
'go_to_admin', 'index.php'); |
然后调用includes/ecapp.base.php文件中的display()方法加载页面模板,在加载过程中需要给视图传递变量,调用eccore/controller/app.base.php中的assign()方法,在这个方法中还需要调用eccore/controller/app.base.php中的_init_view()方法,在这个过程中很重要因为他要引用返回eccore/ecmall.php文件中的& v()方法所引用的变量(引用eccore/view/template.php)文件,类似于加载,然后在eccore/controller/app.base.php中的assign()方法调用(eccore/view/template.php)文件assign()方法,以,键·值,形式赋值给_var数组中。
display()函数:
03 |
if ($this->_hook('on_display', array('display_file' => & $f))) |
07 |
$this->assign('site_url', SITE_URL); |
08 |
$this->assign('ecmall_version', VERSION); |
09 |
$this->assign('random_number', rand()); |
12 |
$this->assign('lang', Lang::get()); |
15 |
$this->assign('visitor', isset($this->visitor) ? $this->visitor->info : array()); |
18 |
$this->assign('new_message', isset($this->visitor) ? $this->_get_new_message() : ''); |
19 |
$this->assign('charset', CHARSET); |
20 |
$this->assign('price_format', Conf::get('price_format')); |
21 |
$this->assign('async_sendmail', $this->_async_sendmail()); |
22 |
$this->_assign_query_info(); |
26 |
if ($this->_hook('end_display', array('display_file' => & $f))) |
assign()函数:
09 |
function assign($k, $v = null) |
14 |
$args = func_get_args(); |
15 |
foreach ($args as $arg) //遍历参数 |
17 |
foreach ($arg as $key => $value) //遍历数据并传给视图 |
19 |
$this->_view->assign($key, $value); |
25 |
$this->_view->assign($k, $v); |
_init_view()函数:
10 |
if ($this->_view === null) |
13 |
$this->_config_view(); //配置 |
在includes/ecapp.base.php文件中的display()中调用其父类eccore/controller/app.base.php中的display()方法,在display()方法中引用变量调用(eccore/view/template.php)文件中的display()方法,在display()方法中首先要判断当前的页面文件(upload\admin\templates)是否被修改如果有被修改重新缓存(upload\temp\compiled\admin),在模板缓存的时候首先要用strpos()方法判断编码头部(\xEF\xBB\xBF)是否出现过,如果出现在用我们最常用的str_replace()方法把其替换为空。
在页面提交中用到define('IS_POST', (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'))来判断是否提交,因为在页面提交的时候,$_SERVER['REQUEST_METHOD']默认为GET。
在登录页面中用method="post"方法提交表单所以得到IS_POST定义值为TRUE,进入到执行SQL语句中,判断是否登录成功。
在这个过程中要引用includes/global.lib.php文件中的&ms()方法(此方法中包含/includes/passport.base.php,/includes/passports/' . MEMBER_TYPE . '.passport.php,MEMBER_TYPE在data/config.inc.php中定义默认为default),把变量值地址引用到/includes/passports/default.passport.php文件中DefaultPassport类,DefaultPassport(/includes/passports/default.passport.ph)继承了BasePassport(/includes/passport.base.php)
05 |
* @return Passport 会员系统连接接口 |
12 |
include(ROOT_PATH . '/includes/passport.base.php'); |
13 |
include(ROOT_PATH . '/includes/passports/' . MEMBER_TYPE . '.passport.php'); |
14 |
$class_name = ucfirst(MEMBER_TYPE) . 'Passport'; |
15 |
$ms = new $class_name(); |
在这个过程中,把若干类实例化,所以调用auth(&username,&password)判断用户是不是存在正确,如果正确获得用户ID执行登陆操作调用_do_login方法,在这里我们的回到刚加载文件时候的初始化中因为在includes/ecapp.base.php文件初始化的时候执行了$this->_init_visitor();方法引用了AdminVisitor他类并继承了BaseVisitor类,所以可以在_do_login()方法中应用$this->visitor->assign()方法,其实就是BaseVisitor类中的
1 |
function assign($user_info) |
3 |
$_SESSION[$this->_info_key] = $user_info; |
这样就把用户信息用SESSION保存,在执行操作的时候就可以对$this->has_login进行改变了。
好了这就是登录了。
其实他应用到"引用"和"继承"比较多所以会让初学者都感觉到很乱,没有头绪。引用就是不同的名字访问同一个变量内容,引用作为函数参数可以避免参数对象的额外拷贝。
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除.另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。
继承其实结果就是为增加代码的可重用性,也就是你定义一个方法如果他有一定的共性可以被多个新增加的效果所调用。
如果登录,在(app/backend.base.php)他文件_run_action()他方法中调其父类includes/ecapp.base.php文件中的_run_action()方法,在调用其父类eccore/controller/app.base.php他文件中的_run_action()方法,在此方法中调用自己所在的控制器(默认default)也就是(upload\admin\app\default.app.php)文件中的方法(默认index)index();
这些只是一点程序走向结构,具体内容结构还没有研究。程序结构给人感觉似乎挺乱的,但是如果细心研究执行效果非常的好。
- 分析ECMall的注册与登录机制
ecmall的注册流程index.php?app=member&act=register. 首先app是member,act是register方法. index.php中.通过ecmall的s ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- 单系统登录机制SSO
一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...
- SSH免密登录机制
SSH免密登录机制:(见下图) 1.A先使用ssh-keygen生成一对公钥和私钥:ssh-keygen 2.将A的公钥复制给B一份,并且将其追加到B的授权文件中:ssh-copy-id B 3.接 ...
- 一次实战CTF-WEB(多重登录机制中的缺陷)
要求登录admin账号 1.登录界面 我们发现有找回密码这个易受攻击点 2.直奔找回密码 通过观察前两个阶段url(reset1.htm1 reset2.html),我们推测出了第三个阶段的url(r ...
- 聊一聊Axios与登录机制
前言 因为HTTP是一个stateless的协议,服务器并不会保存任何关于状态数据. 所以需要登录功能让服务器在以后请求的过程中能够识别到你的身份,而不是每次发请求都要输入用户名和密码. 下面介绍一下 ...
- 深度剖析JDK动态代理机制
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...
- Session和Cookie,Django的自动登录机制
什么是Cookie? Cookie是浏览器的本地存储机制,存储服务器返回的各种信息,下次发起请求时再发送给服务端,比如访问baidu 什么是Session? 刚才说道,Cookie存储服务端返回的信息 ...
- ecmall用户登录后自动退出解决方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
随机推荐
- Java 实现顺序查找
package search; import java.util.Scanner; /*通常把查找过程中对关键字的平均比较次数,也叫平均查找长度(ASL)作为衡量一个查找算法效率优劣的标准: * AS ...
- 自己动手实现SharePointList的分页展示
SharePoin列表里对条目的展示只有上一页下一页,不能够跳转,不能够一次导航到第一页和最后一页. 项目需要,所以对列表的数据展示进行了定制化开发来实现如上的功能. 前端用GridView展示,用L ...
- 怎么用js代码改变单选框的选中状态
今天突然有一个需求要用到,使用js代码改变单选框的选中状态.当时想也不想直接 function doGender(gender) { if (gender == "男") { ge ...
- 二维码QRCode
package com.aig.ecompass.ecard; import java.awt.image.BufferedImage; import java.io.File; import jav ...
- 将Cell中的视图取出传递到根视图
当我们点击Cell中的某个图片时,图片会有一种从Cell中取出,放大,然后再回到原来的Cell中的效果.我的想法是:当Cell中的图片用button 来显示.当我们点击Cell中的这个button的时 ...
- jsonp调用webapi和mvc
webapi代码如下: public string Get(int id) { var callback = HttpContext.Current.Request["callback&qu ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 在远程服务器上完成本地设备的程序烧写和调试(基于vivado ,SDK软件)
在使用vivado和SDK进行设计开发的时候,通常需要登录到远程服务器上进行,但是会遇到一个问题就是,所使用的开发板通常是连接在自己的电脑上(local-PC),那要怎么才能让运行在服务器上的设计软件 ...
- Headfirst设计模式的C++实现——工厂方法(Factory Method)
引用原书的一句话:所有的工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么来达到封装的目的. Pizza类及其派生类与上一例相同 PizzaStore.h #ifndef _P ...
- ubuntu tengine 安装
参考文章:http://wangyan.org/blog/install-openssl-from-source.html http://www1.site90.com/Linux/405.html ...