Ecmall 2.0核心系统分析
ecmall 2.0与ecmall 1.1版本相比,面向对象更加纯粹,其MVC的表现也愈加清晰。相对于1.1,ecmall 2.0版本重新设计了系统的底层结构,提高了系统的灵活性和扩展性。其核心文件为/eccore/ecmall.php,系统底层基础类为class ecmall,结构十分清晰。而且在MVC模式中,2.0对Model层进行了重新设计,提高了系统的数据存取简易性和灵活性。
首页代码很简单,这里就不再解释,启动Ecmall只需初始化Ecmall类的startup方法,具体如下:
ECmall启动: 启动Ecmall
/* 启动ecmall */
ecmall::startup(array(
‘default_app’ => ‘default’,
‘default_act’ => ‘index’,
‘app_root’ => ROOT_PATH . ‘/app’,
‘external_libs’ => array(
ROOT_PATH . ‘/includes/global.lib.php’,
ROOT_PATH . ‘/includes/libraries/time.lib.php’,
ROOT_PATH . ‘/includes/ecapp.base.php’,
ROOT_PATH . ‘/includes/plugin.base.php’,
ROOT_PATH . ‘/app/frontend.base.php’,
ROOT_PATH . ‘/includes/subdomain.inc.php’,
),
));
?>
我们来说下核心代码,代码如下:
<?php
class ecmall
{
/* 启动 */
function startup($config = array())
{
/* 加载初始化文件 */
require(ROOT_PATH . ‘/eccore/controller/app.base.php’); //基础控制器类
require(ROOT_PATH . ‘/eccore/model/model.base.php’);
/*模型基础类。对于数据库关系模型的分析,需要从两个函数说起:&m和&bm。所谓模型,则是一个一个的数据实体,换句话说就是一个数 据表,你可以基于这个模型,调用model.base.php中的数据库操作函数来对数据进行增、删、改、查的操作。这里的业务模型,是在实体模型基础 上,再继承一次,然后对一些方法进行重写。*/if (!empty($config[‘external_libs’]))
{
foreach ($config[‘external_libs’] as $lib)
{
require($lib);//加载初始化文件
}
}
/* 数据过滤 */
if (!get_magic_quotes_gpc())
{
$_GET = addslashes_deep($_GET);
$_POST = addslashes_deep($_POST);
$_COOKIE= addslashes_deep($_COOKIE);
}/* 请求转发 */
$default_app = $config[‘default_app’] ? $config[‘default_app’] : ‘default’;/* 系统初始化页面已定义该变量 */
$default_act = $config[‘default_act’] ? $config[‘default_act’] : ‘index’;/* 系统初始化页面已定义该变量 */
$app = isset($_REQUEST[‘app’]) ? trim($_REQUEST[‘app’]) : $default_app;
$act = isset($_REQUEST[‘act’]) ? trim($_REQUEST[‘act’]) : $default_act;
$app_file = $config[‘app_root’] . “/{$app}.app.php”;
/* 根据不同动作选择不同操作类,$config[‘app_root’]变量是路径 */
if (!is_file($app_file))
{
exit(‘Missing controller’);
}
require($app_file);/* 加载前台处理的操作类 */
define(‘APP’, $app);* 定义常量*/
define(‘ACT’, $act);* 定义常量*/
$app_class_name = ucfirst($app) . ‘App’;/* 是类名称首字母大写*/
/* 实例化控制器 */
$app = new $app_class_name();
c($app);//获取当前控制器实例子赋予$GLOBALS[‘ECMALL_APP’]
$app->do_action($act); //转发至对应的Action
$app->destruct();//控制器结束运行
}
}
?>
根据app后面所跟的参数,来判断加载对应的控制器类文件,类文件在 app文件夹下,对应名称与参数相同,act后面的参数是对应控制器中的操作方法处理请求
而对应的动作中,会有一个判断: if (!IS_POST){请求前的页面内容的显示}else{请求后的表单处理及处理完成后的页面跳转}。其中包括使用json处理数据
这里需要提出的是:在控制器中:
$this->assign(’order’, $order_info); //向模板页传递所需要参数的值
$this->display(’buyer_order.confirm.html’);//跳转到哪个页面
$this->json_result($new_data, ‘confirm_order_successed’);//使用json的方式传递参数,然后在页面上使用javascript处理请求的跳转 实例化控制器