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:
include(ROOT_PATH . '/eccore/ecmall.php');
/* 啟動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',
),
));
ecmall.php:
class ECMall
{
/* 啟動 */
function startup($config = array())
{
/* 加載初始化文件 */
require(ROOT_PATH . '/eccore/controller/app.base.php'); //基礎控制器類
require(ROOT_PATH . '/eccore/model/model.base.php'); //模型基礎類
if (!emptyempty($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";
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);
$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處理請求的跳轉
由於這個機制,ECMALL中可以自行添加APP,模塊,插件等。如何在ECMALL中添加自己的APP呢?比如訪問地址為http://xxx.com/index.php?app=hello
$h = "Hello";
$this->assign("h",$h);
$this->display('hello.index.html');
這個URL訪問的名為hello的app類中的test方法,其實http://xxx.com/index.php?app=hello默認訪問的是index方法。
//1、在upload/app/下建立一個test.app.php
<?php
class TestApp extends MallbaseApp
{
public function index()
{
$str="hello world";
$uc_first= ucfirst($str).'<br>';
$uc_words=ucwords($str).'<br>';
$Model=&m('goods');
$res=$Model->get(27);
print_r($res);
$this->assign('ss',$uc_first);
$this->assign('sss',$uc_words);
$this->display('test.index.html');
}
}
?>
//2、在upload/languages/sc-utf-8/下建立一個test.lang.php
<?php
return array();
?>
// 3、在upload/themes/mall/default/建立一個test.index.html
admin.php這是啟動ecmall後台。啟動後也進入ecmall框架核心文件ecmall.php。之後的操作跟前台差不多,區別是調度中心把命令傳給"後台"控制中心。但控制器調用的模型是同一個模型中心。