magento控件(widgets)其实就是预定义好的并且带有配置参数前端版块(frontend block)。定义好magento控件(widgets)后,不懂技术的人也可以通过后台将前端版块(frontend block)调用到magento网站的各类页面,并可以通过预定义好的参数做一些基本控制,比如前端版块(frontend block)在前台展示的位置。magento 网站或商店的管理员通过后台管理界面调用magento控件(widgets)我们称之为magento控件(widgets)的一个实例(或实例化,有点类似类和对象)。从这个意义上说,你定义好一个magento控件(widgets)后,你可以在前台调用N次控件的实例。 说了太多的概念,举个例子吧!比如你有一个显示最新产品的block,如果你没有定义成magento控件(widgets),那么只有你或懂magento的人才会调用,而且只能在模板中调用。但是如果定义成magento控件(widgets),不懂技术的店主自己就可以在后台调用,而且可以通过后台界面控制这个block的位置,产品数量等参数。 那么如何创建一个magento widgets呢? 1、首先要创建一个模块架构。比如我的模块名称为FeaturedCatalog app/code/community/FeaturedCatalog/ —————————————————–/etc/config.xml —————————————————–/Helper —————————————————–/Block config.xml是模块的基本配置文件,用来定义这个模块版本信息,同时还要声明这个模块中涉及到的block类,helper类的基础类名,也就是这些类各自的前缀。
现在假设说我们已经定义好了两个Block,一个是推荐新商品,一个是热销商品,现在的目录结构应该是 app/code/community/FeaturedCatalog/ —————————————————–/etc/config.xml —————————————————–/Helper —————————————————–/Block —————————————————–/Block/New.php —————————————————–/Block/Bestsale.php 2、然后向magento注册新的模块,在app/etc/modules/目录下创建一个xml文件,文件名不限,不过通常命名规则是package_module.xml的格式,所以,我们这边就叫mzcart_featuredcatalog.xml Mzcart_FeaturedCatalog>
3、向magento声明定义magento 控件(widgets),任何一个模块如果有涉及到magento 控件(widgets)都要在模块的etc目录下创建widgets.xml向magento声明它定义了哪些magento 控件(widgets)。
上面的这个widgets.xml文件示例说明了向magento声明widgets至少要包含的内容:
a 、给magento 控件(widgets)起一个唯一的名字如,featuredcatalog_new
b、声明magento 控件(widgets)的name
c、声明magento 控件(widgets)的描述
d、最重要的一点,通过type属性指定调用的block类,这个用法和模板开发中layolut文件的用法是类似的。
现在模块的文件目录结构应该是
app/code/community/FeaturedCatalog/
—————————————————–/etc/config.xml
—————————————————–/etc/widgets.xml
—————————————————–/Helper —————————————————–/Block —————————————————–/Block/New.php —————————————————–/Block/Bestsale.php
4、至此,基本上算是完成了。然而最核心的步骤还是如何定义block类,这类block(就是将要被调用来声明widget的block)通常要实现Mage_Widget_Block_Interface接口类。这个类定义了三个所有block类都需要实现的方法:
a、toHtml() 用来生成html以供输出
b、addData(array $arr), setData($key, $value = null) 用来实现在magento后台配置block的参数
看下面的代码,你可能会问,那为什么还要继承Mage_Core_Block_Abstract,有两个理由:
a、在这个类里面已经定义toHtml,基本符合我们需求,这样我们就不需要再定义了,代码重得利用嘛
b、addData、setData这两个方法也在Mage_Core_Block_Abstract这个类的父类Varien_Object中实现了,节省代码也节省时间啊
class Mzcart_FeaturedCatalog_Block_New
extends Mage_Core_Block_Abstract implements Mage_Widget_Block_Interface {
/** }
注:最后要提的是,之所以在这个类中实现的是_toHtml方法,是因为由于toHtml方法在Mage_Core_Block_Abstract父类中被定义成final了,所以不能在子类中重新定义。不过由于这个方法在父类的实现调用了_toHtml方法,所以,我们可以通过重定义_toHtml方法来实现重定义toHtml方法。
(责任编辑:好模板) |