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:

01 include(ROOT_PATH . '/eccore/ecmall.php'); 
02 /* 启动ECMall */ 
03 ECMall::startup(array
04     'default_app'   =>  'default'
05     'default_act'   =>  'index'
06     'app_root'      =>  ROOT_PATH . '/app'
07 //加载系统所需要的基础类 
08     'external_libs' =>  array
09         ROOT_PATH . '/includes/global.lib.php'
10         ROOT_PATH . '/includes/libraries/time.lib.php'
11         ROOT_PATH . '/includes/ecapp.base.php'
12         ROOT_PATH . '/includes/plugin.base.php'
13         ROOT_PATH . '/app/frontend.base.php'
14     ), 
15 )); 

ecmall.php:

01 class ECMall 
02
03     /* 启动 */ 
04     function startup($config array()) 
05     
06         /* 加载初始化文件 */ 
07         require(ROOT_PATH . '/eccore/controller/app.base.php');     //基础控制器类 
08         require(ROOT_PATH . '/eccore/model/model.base.php');   //模型基础类 
09    
10         if (!emptyempty($config['external_libs'])) 
11         
12             foreach ($config['external_libs'as $lib
13             
14                 require($lib); 
15             
16         
17         /* 数据过滤 */ 
18         if (!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"
33         if (!is_file($app_file)) 
34         
35             exit('Missing controller'); 
36         
37    
38         require($app_file); 
39         define('APP'$app); 
40         define('ACT'$act); 
41         $app_class_name = ucfirst($app) . 'App'
42    
43         /* 实例化控制器 */ 
44         $app     new $app_class_name(); 
45         c($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

  1. 在ecmall的app目录下建立一个新的名称为hello.app.php的应用文件
  2. 在languages的sc-utf8的目录下建立对应的语言文件 hello.lang.php ,并返回数组 (若不建立,会出错)
  3. hello.app.php中的类为HelloApp,并继承FrontendApp
  4. 此为前端程序,在ecmall的themes/mall/default文件夹下建立一个hello.index.html模板文件
  5. 重写默认的index方法,可以使用模板的方式输出:
  6. 1 $h "Hello"
    2     $this->assign("h",$h); 
    3     $this->display('hello.index.html'); 
  7. 编写其他方法比如访问地址为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 
03 class TestApp extends MallbaseApp 
04
05     public function index() 
06     
07         $str="hello world"
08         $uc_first= ucfirst($str).'<br>'
09         $uc_words=ucwords($str).'<br>'
10             
11         $Model=&m('goods'); 
12         $res=$Model->get(27); 
13         print_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 
25     return array();            
26 ?> 
27     
28 //  3、在upload/themes/mall/default/建立一个test.index.html 

admin.php这是启动ecmall后台。启动后也进入ecmall框架核心文件ecmall.php。之后的操作跟前台差不多,区别是调度中心把命令传给"后台"控制中心。但控制器调用的模型是同一个模型中心。

ECMall系统请求跳转分析的更多相关文章

  1. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  2. Android日志系统Logcat源代码简要分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...

  3. 为什么不能将客户端的连接请求跳转或转发到本机lo回环接口上?

    一.为什么不能将本机的请求跳转/转发到回环接口上? 如上图一样,服务器对外只开放了一个80端口,但是web服务监听在了lo 接口上8080端口上,现在要实现外网通过访问服务器的80端口,来提供web服 ...

  4. Tomcat处理HTTP请求源码分析(上)

    Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...

  5. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  6. Android 属性系统 Property service 设定分析 (转载)

    转自:http://blog.csdn.net/andyhuabing/article/details/7381879 Android 属性系统 Property service 设定分析 在Wind ...

  7. struts2请求过程源代码分析

    struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...

  8. 9.2 Binder系统_驱动情景分析_服务注册过程

    1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...

  9. Django(35)Django请求生命周期分析(超详细)

    Django请求生命周期分析 1.客户端发送请求 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都 ...

随机推荐

  1. ITopologicalOperator Buffer调用异常的解决方法 .异常来自 HRESULT:0x8004023E

    最近在做一个分析功能时,需要循环调用Buffer来对图形创建缓冲区.在开发测试时没问题,但拿到客户实际使用时,出现异常. 后来把出异常的数据拿来测试,发现在调用Buffer时出错.但做为参数传入的图形 ...

  2. Android_ImageView

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  3. extjs6整合到web项目中

    最近有一个项目需要应用extjs作为前端界面,因此研究了一下如何将extjs 6引入到项目中.以下是操作步骤 extjs6下载地址 extjs 6有gpl版本的,下载地址https://www.sen ...

  4. Struts,Spring,Hibernate的作用

    Spring的作用: 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因 为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL ...

  5. 学点css之经验总结篇章

    学css说起来应该有三天左右的时间的,加上之前了解的基础,对css有一点的感性认识了,相应代码有有比较好的把握,现在就通过分享几张照片的形式分享一下我的收获 备注:在Border的外边的部门被称作:o ...

  6. Canvas实现曲线运动

    前言 Html5添加的最受欢迎的功能就是<canvas>元素,它负责在页面中设定一个区域,然后在里面可以通过javascript动态地在其内绘制图形. 主流浏览器,IE9+,手机端都是支持 ...

  7. 那天有个小孩跟我说LINQ(一) 转载

    1  LINQ准备(代码下载) 新建项目 linq_Ch1控制台程序,新建一个Entity文件夹     1.1 对象初始化器     在Entity新建一个类Student,代码如下 using S ...

  8. Java_web 乱码和一些地址输错的问题(原创)

    1.首先记录下java_web的发布问题:安装好了Tomcat和MyEclipse后,从MyEcilpe中自动发布,不需要手动打开Tomcat 2.ipmort别人的程序后,先部署,后run后拉你的T ...

  9. [Twisted] Test

    由于Twisted程序采用事件驱动,并使用Deferred来处理事件,使用Python unittest的写测试并不容易.因此, Twisted拓展了unitest,并使用命令行工具来运行测试.这些组 ...

  10. iOS 多张图片保存到相册问题(add multiple images to photo album)

    不知道朋友们有木有做过多图保存到系统的相册这个需求,我在用`UIImageWriteToSavedPhotosAlbum`保存图片时候,在代理回调方`didFinishSavingWithError` ...