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>
- EasyPR--开发详解(6)SVM开发详解
在前面的几篇文章中,我们介绍了EasyPR中车牌定位模块的相关内容.本文开始分析车牌定位模块后续步骤的车牌判断模块.车牌判断模块是EasyPR中的基于机器学习模型的一个模块,这个模型就是作者前文中从机 ...
- 基于H5的微信支付开发详解
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- ****基于H5的微信支付开发详解[转]
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- 【转发】NPAPI开发详解,Windows版
NPAPI开发详解,Windows版 9 jiaofeng601, +479 9人支持,来自Meteor.猪爪.hanyuxinting更多 .是非黑白 .Yuan Xulei.hyolin.Andy ...
- 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版
2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...
- 嵌入式Linux应用程序开发详解------(创建守护进程)
嵌入式Linux应用程序开发详解 华清远见 本文只是阅读文摘. 创建一个守护进程的步骤: 1.创建一个子进程,然后退出父进程: 2.在子进程中使用创建新会话---setsid(): 3.改变当前工作目 ...
- iOS原生地图开发详解
在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ...
- wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- PayPal 开发详解(七):运行REST API SAMPLE
1.编译成功,修改配置文件 sdk_config.properties ,使用我们申请的测试帐号执行收款测试,clientId 和 clientSecret 参见 PayPal 开发详解(五) 2.将 ...
随机推荐
- PyPI镜像网站
镜像列表:http://www.pypi-mirrors.org/ 清华镜像:http://e.pypi.python.org/
- 基于opencv的人脸检测的web应用
参考资料 https://github.com/bsdnoobz/web-based-face-detect http://opencv-code.com/projects/web-based-int ...
- Java核心 --- 泛型
CoreJava 泛型 java泛型的出现避免了强制类型转换,便于代码更好的被阅读 本文的写作参照了张孝祥的泛型介绍:http://www.itcast.cn/news/dbfd20f1/f4b1/4 ...
- STL六大组件之——迭代器这个东西
迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...
- 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码
JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...
- 有趣的库:pipe(类似linux | 管道)库
pipe并不是Python内置的库,如果你安装了easy_install,直接可以安装它,否则你需要自己下载它:http://pypi.python.org/pypi/pipe 之所以要介绍这个库,是 ...
- navigationController 之间的切换
项目要实现从一个Navigation 下push出的第N层controller后 立即切换到另一个 Navigation下 例如:在微信的通讯录Nav中选择一个好友,进入好友的详细资料,点击发消息按钮 ...
- (原创)jquery插件-可选可填控件
;(function ($) { $.fn.autoFillTextBox = function (options) { var defaults = { nShow: 5, //显示条数 nLen: ...
- 第三百五十七天 how can I 坚持
502是我对你没有爱的意思吗?为什么要要这样啊,好绝情. 明天要去加班,今晚回来也好晚了,晚上回来都有点精神恍惚了. 他们要聚会,本来要想去樱木花道来,哎. 后天..什么都没学. .. .. .. 准 ...
- Django 1.6 最佳实践: 如何设置和使用 Log(转)
原文: http://www.weiguda.com/blog/37/ 任何参与过高要求的大型项目的编程人员都明白设置适当的log等级, 创建不同的logger, 记录重要事件的重要性. 正确的设置和 ...