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。之後的操作跟前台差不多,區別是調度中心把命令傳給"後台"控制中心。但控制器調用的模型是同一個模型中心。