如何重写或者扩展 magento 内置 Block
Block 是 magento 中一个很重要的组长部份,在安装了 magento 后, magento 自身带了很多的模块,模块中有很多的 Block, 一般一个 Block 对应一个模板文件表示 html 的输出 .
如果我们要修改 magento 增加其功能适应自己的需求,一般都会涉及到要扩展原来的 magento. 下面我们通过一个例子说明怎么扩展 Block
如在上面的图中我们增加了‘打印’按钮
(1): 新建好如下 Adminhtml 和他下面的目录和文件 .
View.php:
<?php
class DEMO_Adminhtml_Block_Sales_Order_View extends Mage_Adminhtml_Block_Sales_Order_View
{
public function __construct ()
{
parent :: __construct ();
$this ->_addButton( 'order_print' , array (
'label' => Mage::helper( 'sales' )->__( 'Print' ),
//'onclick' => "popWin('/sales/order/print/order_id/{$this->getOrder()->getId()}')",
'onclick' => 'popWin(/'' . $this ->getPrintUrl() . '/',/'printwin/',/'width=800,height=600,resizable=yes,scrollbars=yes/')' ,
));
}
public function getPrintUrl()
{
return $this ->getUrl( '*/sales_print/print' );
}
}
红色部份类为原有 block 的类,我们必须继承原有的类来扩展 block 的功能。在这个 block 中,我们可以增加新的方法或者 override 父类方法来增加其功能。在他的模板文件中可以使用 $this 来引来此类,从而可以调用此类中的公用方法
config.xml
<?xml version="1.0"?>
<config>
<modules>
< DEMO_Adminhtml>
<version>0.1.0</version>
</ DEMO_Adminhtml>
</modules>
<global>
<blocks>
<adminhtml>
<rewrite>
<sales_order_view> DEMO_Adminhtml_Block_Sales_Order_View</sales_order_view>
</rewrite>
</adminhtml>
</blocks>
</global>
</config>
注意这里的 sales_order_view 被新的类所代替 , 而此类继承了原先的类,所以原本功能不会受影响
(2):app/etc/modules/ DEMO_All.xml
<?xml version="1.0"?>
<config>
< DEMO_Adminhtml>
<active>true</active>
<codePool>local</codePool>
</ DEMO_Adminhtml>
</modules>
</config>
指明模块代码存放的路经 .
(3): 说明
在 design/adminhtml/default/default/layout/sales.xml 中引用了此 block
<reference name="content">
<block type="adminhtml/ sales_order_view " name="sales_order_edit"></block>
</reference>
一般 block 都有一个如 : template="sales/order/view/info.phtml" 的属性,如果没有指明,此可以去这个 block 中这个类中去查找,很有可能在构选方法中用形如 :
$this- >setTemplate( 'widget/form/container.phtml' ) 进行了设置 .