zoukankan      html  css  js  c++  java
  • ECMall系统请求跳转分析

    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:

    01include(ROOT_PATH . '/eccore/ecmall.php'); 
    02/* 启动ECMall */ 
    03ECMall::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:

    01class 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 
    03class 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。之后的操作跟前台差不多,区别是调度中心把命令传给"后台"控制中心。但控制器调用的模型是同一个模型中心。

  • 相关阅读:
    C++之private虚函数
    图的遍历DFS与BFS(邻接表)
    拓扑排序(邻接矩阵)
    paypal Encryption 支付编程全解
    JAVA 正则表达式 分组
    正则表达式 <A HREF>
    Linux 逻辑卷管理 实例
    LINUX命令笔记(2)
    哀悼日:快速设置黑白页面
    XEN笔记
  • 原文地址:https://www.cnblogs.com/farcall/p/3765051.html
Copyright © 2011-2022 走看看