ecmall是一个基于mvc模式框架系统,跟thinkphp有点像。先从ecmall的入口开始,ecmall入口文件upload/index.php、admin.php:
index.php启动ecmall前台,启动后则进入ecmall框架核心文件ecmall.php. ecmall.php相当于一个调度中心,接收不同的控制命令(app)以及命令的相关操作(funciton),接着对其进行分配处理。然后调度中心把这些命令(app)和方法(function) 传到前台控制中心对应的具体控制器上。"控制器"接收到命令后,开始实施执行控制,接着把处理后的结果传给view模板文件(模板命名规则:appname.fucname.html)。
其中控制器接收到命令执行过程中,可以调用调度中心的模型获取方法&m()实例化一个模型,进行数据的curd操作。
index.php:
01include(ROOT_PATH .'/eccore/ecmall.php');
02/* 启动ECMall */
03ECMall::startup(array(
04'default_app' =>'default',
05'default_act' =>'index',
06'app_root' => ROOT_PATH .'/app',
07//加载系统所需要的基础类
08'external_libs' =>array(
09ROOT_PATH .'/includes/global.lib.php',
10ROOT_PATH .'/includes/libraries/time.lib.php',
11ROOT_PATH .'/includes/ecapp.base.php',
12ROOT_PATH .'/includes/plugin.base.php',
13ROOT_PATH .'/app/frontend.base.php',
14),
15));
ecmall.php:
01class ECMall
02{
03/* 启动 */
04function startup($config =array())
05{
06/* 加载初始化文件 */
07require(ROOT_PATH .'/eccore/controller/app.base.php');//基础控制器类
08require(ROOT_PATH .'/eccore/model/model.base.php');//模型基础类
09
10if (!emptyempty($config['external_libs']))
11{
12foreach ($config['external_libs']as $lib)
13{
14require($lib);
15}
16}
17/* 数据过滤 */
18if (!get_magic_quotes_gpc())
19{
20$_GET = addslashes_deep($_GET);
21$_POST = addslashes_deep($_POST);
22$_COOKIE= addslashes_deep($_COOKIE);
23}
24
25/* 请求转发 */
26$default_app =$config['default_app'] ?$config['default_app'] :'default';
27$default_act =$config['default_act'] ?$config['default_act'] :'index';
28
29$app = isset($_REQUEST['app']) ? trim($_REQUEST['app']) :$default_app;
30$act = isset($_REQUEST['act']) ? trim($_REQUEST['act']) :$default_act;
31
32$app_file =$config['app_root'] ."/{$app}.app.php";
33if (!is_file($app_file))
34{
35exit('Missing controller');
36}
37
38require($app_file);
39define('APP',$app);
40define('ACT',$act);
41$app_class_name = ucfirst($app) .'App';
42
43/* 实例化控制器 */
44$app =new $app_class_name();
45c($app);
46$app->do_action($act);//转发至对应的Action
47$app->destruct();
48}
49}
50
51//根据app后面所跟的参数,来判断加载对应的控制器类文件,类文件在app文件夹下,对应名称与参数相同,act后面的参数是对应控制器中的操作方法处理请求
52//而对应的动作中,会有一个判断: if (!IS_POST){请求前的页面内容的显示}else{请求后的表单处理及处理完成后的页面跳转}。其中包括使用json处理数据
53//这里需要提出的是:在控制器中:
54$this->assign('order',$order_info);//向模板页传递所需要参数的值
55$this->display('buyer_order.confirm.html');//跳转到哪个页面
56$this->json_result($new_data,'confirm_order_successed');//使用json的方式传递参数,然后在页面上使用javascript处理请求的跳转
由于这个机制,ECMALL中可以自行添加APP,模块,插件等。如何在ECMALL中添加自己的APP呢?比如访问地址为http://xxx.com/index.php?app=hello在ecmall的app目录下建立一个新的名称为hello.app.php的应用文件
在languages的sc-utf8的目录下建立对应的语言文件 hello.lang.php ,并返回数组 (若不建立,会出错)
hello.app.php中的类为HelloApp,并继承FrontendApp
此为前端程序,在ecmall的themes/mall/default文件夹下建立一个hello.index.html模板文件
重写默认的index方法,可以使用模板的方式输出:
1$h ="Hello";
2$this->assign("h",$h);
3$this->display('hello.index.html');
编写其他方法比如访问地址为http://xxx.com/index.php?app=hello&act=test
这个URL访问的名为hello的app类中的test方法,其实http://xxx.com/index.php?app=hello默认访问的是index方法。
01//1、在upload/app/下建立一个test.app.php
02<?php
03class TestAppextends MallbaseApp
04{
05public function index()
06{
07$str="hello world";
08$uc_first= ucfirst($str).'
';
09$uc_words=ucwords($str).'
';
10
11$Model=&m('goods');
12$res=$Model->get(27);
13print_r($res);
14
15
16$this->assign('ss',$uc_first);
17$this->assign('sss',$uc_words);
18$this->display('test.index.html');
19}
20}
21?>
22
23//2、在upload/languages/sc-utf-8/下建立一个test.lang.php
24<?php
25return array();
26?>
27
28// 3、在upload/themes/mall/default/建立一个test.index.html
admin.php这是启动ecmall后台。启动后也进入ecmall框架核心文件ecmall.php。之后的操作跟前台差不多,区别是调度中心把命令传给"后台"控制中心。但控制器调用的模型是同一个模型中心。