(参考网上相关文章,进行测试点评,下述方法测试成功)

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');
      $goods=$test_mod->getAll("select * from ecm_goods where goods_id =1");
      return $goods;
     }
   }
 
  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=good}-->
                       <li>{$good[goods_name]}</li>
                      <!--{/foreach}-->
               </ul>
              </div>
          </div>
       </div>
    挂件开发说明
     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'));
    }
 
 

ecmall 挂件开发实例一的更多相关文章

  1. ecmall挂件开发实例二(转)

    下述例子讲述了快速增加挂件的方法,但对系统中的代码未做更改,基本参照image_ad挂件的方法. 第 一步: 了解首页模板结构 首页文 件结构 include hearder.html 包含的头文件, ...

  2. ecmall widgets 挂件开发详解

    Ecmall挂件开发 实质上是后台开发很多页面,分别去调用程序展示这些页面,达到首页内容更换很快的目的,这样做减少后续开发,开发人员只需开发挂件就可以了,至于位置可随意定.(还需调整html,但是起码 ...

  3. ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】

    本文包含商品自定义添加教程及进一步的开发实例: 教程: 说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. ...

  4. RDIFramework.NET -.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(WebForm版)

    RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(WebForm版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之 ...

  5. RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)

    RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(MVC版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之产品管理 ...

  6. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  7. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)

    最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...

  8. RDIFramework.NET开发实例━表约束条件权限的使用-Web

    RDIFramework.NET开发实例━表约束条件权限的使用-Web 在上一篇文章“RDIFramework.NET开发实例━表约束条件权限的使用-WinForm”我们讲解了在WinForm下表约束 ...

  9. RDIFramework.NET开发实例━表约束条件权限的使用-WinForm

    RDIFramework.NET开发实例━表约束条件权限的使用-WinForm 在实际的应用中,客户常有这样的需求,指定用户或角色可以看指定条件下的数据,这里的“指定条件”在RDIFramework. ...

随机推荐

  1. find命令中选项-path和-prune的使用

    在Windows中可以在某些路径中查找文件,也可以设定不在某些路径中查找文件,下面用Linux中的find的命令结合其-path -prune参数来看看在Linux中怎么实现此功能.假如在当前目录下查 ...

  2. js中删除数组中某一项的方法

    1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...

  3. Neutron三层网络服务实现原理

    Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent).该 Agent 利用 Linux IP 栈.route 和 iptables 来实现内网内不同网络 ...

  4. RMAN中format的参数

    (转自:http://blog.chinaunix.net/uid-23079711-id-2554290.html) format 的替换变量,注意大小写! 1.     %d --数据库的db_n ...

  5. poj 1258 Agri-Net 最小生成树 prim算法+heap不完全优化 难度:0

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41230   Accepted: 16810 Descri ...

  6. HDU 3779 Railroad(记忆化搜索)

    Railroad Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  7. 学习笔记之AutoLayout

    Align:用来添加对齐约束. Pin:添加标准约束,比如相对于其他视图的大小和位置. Reslove Auto Layout Issues:可以让Xcode 自动生成约束,或者基于约束把子视图的边框 ...

  8. L170 Autism Linked to Zinc Deficiency in Childhood

    While the exact cause of autism is unknown, its development in children has been linked to various g ...

  9. 修改myelipse中部署路径deploy location内容的方法

    在new web project 中的project name等内容,可以打开.mymetadata文件进行修改 <?xml version="1.0" encoding=& ...

  10. react 生命周期图

    1. react v16 版本生命周期 2. react v17 (还未发布), 生命周期将被改动,下面红框的部分就是会被删除的部分,注意调整!