你现在的位置:首页 > PHP网站建设知识库 > ecmall > 正文

ecmall挂件开发实例讲解

ecmall自带了很多挂件,模板里调用挂件加载代码来显示挂件。这样做的好处是减少了ecmall开发的工作量,开发人员一门心思开发挂件就好,样式可用css样式表来定义。首先我们先来了解一下ecmall模板挂件机制

ecmall挂件工作原理:

1:ecmall模板页面调用widget页面(整个过程比较复杂) 
  <!--{widgets page=index area=cycle_image}--> 
参数:page:指明页面是index页面 
     Area:指明显示的区域。(相当于告诉程序生成的页面是放在那里的) 

2:经过ecmall模板引擎重新生成一个临时php文件,上面那句代码被解析成这样的php代码。 
<!--{widgets page=index area=cycle_image}--> 
                     || 
<?php $this->display_widgets(array('page'=>'index','area'=>'cycle_image')); ?>

3:接下来我们来看看它是如何显示的,display_widgets()方法的源码 
/** 
* 视图回调函数[显示小挂件] 

* @author    Garbin 
* @param     array $options 
* @return    void 
*/ 
function display_widgets($options) { 
$area = isset ( $options ['area'] ) ? $options ['area'] : ''; 
$page = isset ( $options ['page'] ) ? $options ['page'] : ''; 
if (! $area || ! $page) { 
return; 

include_once (ROOT_PATH . '/includes/widget.base.php');
/* 获取该页面的挂件配置信息 */ 
$widgets = get_widget_config ( $this->_get_template_name (), $page );
/* 如果没有该区域 */ 
if (! isset ( $widgets ['config'] [$area] )) { 
return; 
}
/*将该区域内的挂件依次显示出来 */ 
foreach ( $widgets ['config'] [$area] as $widget_id ) { 
$widget_info = $widgets ['widgets'] [$widget_id]; 
$wn = $widget_info ['name']; 
$options = $widget_info ['options'];
$widget = & widget ( $widget_id, $wn, $options ); 
$widget->display (); 

}
/** 
* 获取当前使用的模板名称 

* @author    Garbin 
* @return    string 
*/ 
function _get_template_name() { 
return 'default'; 
}
/** 
*    获取指定风格,指定页面的挂件的配置信息 

*    @author    Garbin 
*    @param     string $template_name 
*    @param     string $page 
*    @return    array 
*/ 
function get_widget_config($template_name, $page)//default index 

    static $widgets = null; 
    $key = $template_name . '_' . $page; 
    if (!isset($widgets[$key])) 
    { 
        $tmp = array('widgets' => array(), 'config' => array()); 
        $config_file = ROOT_PATH . '/data/page_config/' . $template_name . '.' . $page . '.config.php'; 
        if (is_file($config_file)) 
        { 
            /* 有配置文件,则从配置文件中取 */ 
            $tmp = include_once($config_file); 
        }
        $widgets[$key] = $tmp; 
    }
    return $widgets[$key]; 
}

/** 
*    获取挂件实例 

*    @author    Garbin 
*    @param     string $id 
*    @param     string $name 
*    @param     array  $options 
*    @return    Object Widget 
*/ 
function &widget($id, $name, $options = array()) 

    static $widgets = null; 
    if (!isset($widgets[$id])) 
    { 
        $widget_class_path = ROOT_PATH . '/external/widgets/' . $name . '/main.widget.php'; 
        $widget_class_name = ucfirst($name) . 'Widget'; 
        include_once($widget_class_path); 
        $widgets[$id] = new $widget_class_name($id, $options); 
    }
    return $widgets[$id]; 
}
    /** 
     *    显示 
     * 
     *    @author    Garbin 
     *    @param    none 
     *    @return    void 
     */ 
    function display() 
    { 
        echo $this->get_contents(); 
}
    /** 
     *    将取得的数据按模板的样式输出 
     * 
     *    @author    Garbin 
     *    @return    string 
     */ 
    function get_contents() 
    { 
        /* 获取挂件数据 */ 
        $this->assign('widget_data', $this->_get_data());
        /*可能有问题*/ 
        $this->assign('options', $this->options); 
        $this->assign('widget_root', $this->widget_root);
        return $this->_wrap_contents($this->fetch('widget')); 
    }

明白机制后,我们来做一个ecmall挂件实例开发: 

\

1:在页面上添加要展示的页面模块 

<div class="left" area="bottom_foot" widget_type="area"> 
    <!--{widgets page=index area=bottom_foot}--> 
</div> 

2:修改工程目录下/data/page_config/default.index.config.php添加该模块的相关信息 

   'widgets' => 
  array ( 
     '_widget_1000' => 
                 array ( 
                 'name' => 'test', 
                 'options' => 
                             array ( 
                             'ad_image_url' => 'data/files/mall/template/200908070207084061.gif', 
                             'ad_link_url' => '', 
                              ), 
                 ), 
  ), 
  'config' => 
    array( 
      'bottom_foot' => 
      array ( 
            0 => '_widget_1000', 
            ), 
),

3:在工程目录external/widgets建name(跟上面定义的name要一致)目录,然后再建文件main.widget.php  
  class TestWidget extends BaseWidget{ 
    var $_name = 'test'; 
    function _get_data(){ 
      $test_mod=&m('test'); 
      $users=$test_mod->getAll("select * from ecm_member"); 
          return $users; 
    } 
  }  

4:在includes/model下建模型文件(同数据库交互) 
  class TestModel extends BaseModel{ 
      
     
   } 

5:在同级目录创建widget.html文件(该模板为展示内容) 

<div class="module_common"> 
    <h2><b class="news" title="NEWS公告栏"></b></h2> 
    <div class="wrap"> 
        <div class="wrap_child"> 
            <ul class="news_list"> 
                <!--{foreach from=$widget_data item=user}--> 
                <li>{$user[user_name]}</li> 
                <!--{/foreach}--> 
            </ul> 
        </div> 
    </div> 
</div>