在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 (); |
16 | } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。