ecmall widgets 挂件开发详解

简介: Ecmall挂件开发 实质上是后台开发很多页面,分别去调用程序展示这些页面,达到首页内容更换很快的目的,这样做减少后续开发,开发人员只需开发挂件就可以了,至于位置可随意定.(还需调整html,但是起码后台取数据不用做了) 流程介绍: 1:ecmall模板页面调用widget页面(整个过程比较复杂)   参数:page:指明页面是index页面      Area:指明显示的区域。
Ecmall挂件开发
实质上是后台开发很多页面,分别去调用程序展示这些页面,达到首页内容更换很快的目的,这样做减少后续开发,开发人员只需开发挂件就可以了,至于位置可随意定.(还需调整html,但是起码后台取数据不用做了)
流程介绍:
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'));
    }
 
 
实例开发:
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>
目录
相关文章
|
8月前
qt 开发 “控件之家“
qt 开发 “控件之家“
|
8月前
|
小程序
Qt实现图片可拖拉
Qt实现图片可拖拉
|
8月前
|
XML Java 数据格式
Anrodi Studio App开发入门之网格视图GridView的使用及实战(附源码 超详细必看)
Anrodi Studio App开发入门之网格视图GridView的使用及实战(附源码 超详细必看)
106 0
【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】
【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】
|
XML 开发框架 编译器
基于Qt编写超精美自定义控件
无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,越复杂功能越多的项目,自定义控件的数量就越多,最开始的时候可能每个自定义控件都针对特定的应用场景,甚至里面带了特定的场景的一些设置和处理,随着项目数量的增多,有些控件又专门提取出来共性,做成了通用的自定义控件,意味着控件主要做外观处理,用户根据不同的场景需要,设置不同的外观和规则,就这样搞来搞去搞到现在,已经超过了202个控件,慢慢的积累迭代和更新,历经超过9年的时间不断的完善,尤其是对不同Qt版本、不同编译器、不同操作系统的支持,其中Qt6改动比较大,很多方法或者类改名或者废弃了,需要用类似的方法处理,在改完整个自定义控件大全
142 0
基于Qt编写超精美自定义控件
|
存储 程序员 API
Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo
Qt开发技术:Qt拽拖开发(一)拽托框架详解及Demo
用 Pyqt5 打造一个精美 图片浏览器
Pyqt5 是一套Qt 应用框架与 python的结合,同时支持 2.x 和 3.x。是附属于 python 一款强大的 GUI 库。 本片文章写的 图片浏览程序 就是基于 pyqt5 所完成的,由于 图片预览器 中我们需要增加一些滚动滑轮,所以这里我用到的控件主要是 pyqt5的 QScrollArea ;能够伴随着图片的不断增加而增加页面空间,
Qt-网易云音乐界面实现-9 照片墙功能
最近车也买了,不过倒是没有想象的那么开心,车真的是想消耗品啊。
223 0
Qt-网易云音乐界面实现-9 照片墙功能
Qt-网易云音乐界面实现-6 迷你个人中心实现
这个界面除了麻烦耗时,没有啥技术含量。暂时我也就把它称为迷你个人中心,因为后面还有一个个人中心了。 先看下完成品
143 0
Qt-网易云音乐界面实现-6 迷你个人中心实现
|
C++
Qt-网易云音乐界面实现-3 音乐名片模块的实现
Qt-网易云音乐界面实现-3 音乐名片模块的实现
162 0
Qt-网易云音乐界面实现-3 音乐名片模块的实现