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'); |
03 |
ECMall::startup(array( |
04 |
'default_app' => 'default', |
05 |
'default_act' => 'index', |
06 |
'app_root' => ROOT_PATH . '/app', |
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', |
ecmall.php:
04 |
function startup($config = array()) |
07 |
require(ROOT_PATH . '/eccore/controller/app.base.php'); //基础控制器类 |
08 |
require(ROOT_PATH . '/eccore/model/model.base.php'); //模型基础类 |
10 |
if (!emptyempty($config['external_libs'])) |
12 |
foreach ($config['external_libs'] as $lib) |
18 |
if (!get_magic_quotes_gpc()) |
20 |
$_GET = addslashes_deep($_GET); |
21 |
$_POST = addslashes_deep($_POST); |
22 |
$_COOKIE= addslashes_deep($_COOKIE); |
26 |
$default_app = $config['default_app'] ? $config['default_app'] : 'default'; |
27 |
$default_act = $config['default_act'] ? $config['default_act'] : 'index'; |
29 |
$app = isset($_REQUEST['app']) ? trim($_REQUEST['app']) : $default_app; |
30 |
$act = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : $default_act; |
32 |
$app_file = $config['app_root'] . "/{$app}.app.php"; |
33 |
if (!is_file($app_file)) |
35 |
exit('Missing controller'); |
41 |
$app_class_name = ucfirst($app) . 'App'; |
44 |
$app = new $app_class_name(); |
46 |
$app->do_action($act); //转发至对应的Action |
51 |
//根据app后面所跟的参数,来判断加载对应的控制器类文件,类文件在app文件夹下,对应名称与参数相同,act后面的参数是对应控制器中的操作方法处理请求 |
52 |
//而对应的动作中,会有一个判断: if (!IS_POST){请求前的页面内容的显示}else{请求后的表单处理及处理完成后的页面跳转}。其中包括使用json处理数据 |
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方法,可以使用模板的方式输出:
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 |
03 |
class TestApp extends MallbaseApp |
05 |
public function index() |
08 |
$uc_first= ucfirst($str).'<br>'; |
09 |
$uc_words=ucwords($str).'<br>'; |
16 |
$this->assign('ss',$uc_first); |
17 |
$this->assign('sss',$uc_words); |
18 |
$this->display('test.index.html'); |
23 |
//2、在upload/languages/sc-utf-8/下建立一个test.lang.php |
28 |
// 3、在upload/themes/mall/default/建立一个test.index.html |
admin.php这是启动ecmall后台。启动后也进入ecmall框架核心文件ecmall.php。之后的操作跟前台差不多,区别是调度中心把命令传给"后台"控制中心。但控制器调用的模型是同一个模型中心。
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- Android日志系统Logcat源代码简要分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系 ...
- 为什么不能将客户端的连接请求跳转或转发到本机lo回环接口上?
一.为什么不能将本机的请求跳转/转发到回环接口上? 如上图一样,服务器对外只开放了一个80端口,但是web服务监听在了lo 接口上8080端口上,现在要实现外网通过访问服务器的80端口,来提供web服 ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- Android 属性系统 Property service 设定分析 (转载)
转自:http://blog.csdn.net/andyhuabing/article/details/7381879 Android 属性系统 Property service 设定分析 在Wind ...
- struts2请求过程源代码分析
struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...
- 9.2 Binder系统_驱动情景分析_服务注册过程
1. 几个重要结构体的引入给test_server添加一个goodbye服务, 由此引入以下概念: 进程间通信其实质也是需要三要素:源.目的.数据,源是自己,目的用handle表示:通讯的过程是源向实 ...
- Django(35)Django请求生命周期分析(超详细)
Django请求生命周期分析 1.客户端发送请求 在浏览器输入url地址,例如www.baidu.com,浏览器会自动补全协议(http),变为http://www.baidu.com,现在部分网站都 ...
随机推荐
- C#扫盲之:前台线程后台线程
1.线程分类 线程由程序员创建,可是创建的方式不同,总体来说有两种,一种是个人构造,也就是使用thread类new线程对象创建,这一类线程是大部分程序员知道的,也叫专用线程;还有一种是由CLR创建,这 ...
- <video>和<audio>标签
一.<video>基本格式: <video width=" " heigh="" src=""> </vide ...
- String filePath = request.getSession().getServletContext().getRealPath("/");这句话返回的路径是什么,解释下getRealPath("/")函数中的"/"表示什么意思
request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了.getRealPath("/") 获取实 ...
- java List交集 并集 差集 去重复并集
首先定义两个list List list1 =new ArrayList(); list1.add("); list1.add("); list1.add("); Lis ...
- 面试相关的技术问题---java基础
最近在准备秋季校招,将一些常见的技术问题做一个总结!希望对大家有所帮助! 1.面向对象和面向过程的区别是什么? 面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描 ...
- 学习笔记_第一个strut程序_之中文乱码,过滤器解决方案及过程总结
1. 第一次碰到加过滤器的过程,就是在学习struct1的时候,中文乱码 几个需要注意的关键字 2.什么叫package 所谓package就是打包的意思,就是说以下程序都是处于这个包内,所以一开始 ...
- swift-02代码流程的控制
// // main.swift // 02-语句 // // Created by wanghy on 15/8/9. // Copyright (c) 2015年 wanghy. All ...
- sql中truncate 、delete与drop区别
SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL ...
- 暑假集训(2)第九弹 ----- Points on Cycle(hdu1700)
Points on Cycle Time Limit:1000MS Memory Limit:32768 ...
- IOS 学习笔记 2015-04-15 控制器数据反向传值
// // FirstViewController.h // 控制器数据传递 // // Created by wangtouwang on 15/4/15. // Copyright (c) 201 ...