覆盖Magento块和模板

Yeh*_*lam 3 magento

我正在尝试使用我的模块中提供的新模块覆盖Mage_Catalog_Block_Product_Price_Template块和模板,通过设置配置覆盖块是正常的:

<global>
    <blocks>
        <catalog>
            <rewrite>
                <product_price>ABC_PriceX_Block_Price</product_price>
            </rewrite>
        </catalog>
    </blocks>
</global>
Run Code Online (Sandbox Code Playgroud)

然后调用新块

<?php

class ABC_PriceX_Block_Price extends Mage_Catalog_Block_Product_Price_Template {

    protected function _construct() {
        parent::_construct();

        Mage::log('I am in ABC block');
        $this->setTemplate('pricex/price.phtml');


        Mage::log('Template file is '. $this->getTemplateFile() );
    }

}
Run Code Online (Sandbox Code Playgroud)

但是我得到了一个非常奇怪的行为,价格块在前端不再显示,而我在日志文件中得到的只是

2012-09-07T18:05:38+00:00 DEBUG (7): I am in ABC block
2012-09-07T18:05:38+00:00 DEBUG (7): Template file is 
Run Code Online (Sandbox Code Playgroud)

并且不呈现模板:

<p>
<?php Mage::log('I am in ABC template'); ?>
</p>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Ala*_*orm 7

你没有提到的Magento的版本,在香草,安装Magento的1.7.0.1的Mage_Catalog_Block_Product_Price_Template类,尽管它的误导性名称,不是一个模板block类.

#File: app/code/core/Mage/Catalog/Block/Product/Price/Template.php
class Mage_Catalog_Block_Product_Price_Template extends Mage_Core_Block_Abstract
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,它从延伸Mage_Core_Block_Abstract,而不是Mage_Core_Block_Template.

所以,因为它是一个块,你可以设置一个模板

$this->setTemplate('pricex/price.phtml');
Run Code Online (Sandbox Code Playgroud)

但这只是该区块的魔力getset方法.类似地,当你调用getTemplateFileMagento时返回null,因为setTemplateFile你的块上还没有人调用.(与继承的块相对Mage_Core_Block_Template,实际上有一个已定义的getTemplateFile方法.

您的主要问题是,Mage_Catalog_Block_Product_Price_Template当它不是模板块时,您将其视为模板块.这由同一块的布局更新XML代码支持

<block type="catalog/product_price_template" name="catalog_product_price_template" />
Run Code Online (Sandbox Code Playgroud)