覆盖Magento块和模板

时间:2012-09-07 18:16:26

标签: magento

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

<global>
    <blocks>
        <catalog>
            <rewrite>
                <product_price>ABC_PriceX_Block_Price</product_price>
            </rewrite>
        </catalog>
    </blocks>
</global>

新块被称为

<?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() );
    }

}

然而,我得到了一个非常奇怪的行为,价格块在前端不再显示,而我在日志文件中的所有内容都是

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 

模板未呈现:

<p>
<?php Mage::log('I am in ABC template'); ?>
</p>

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:7)

你没有在Magento 1.7.0.1的vanilla安装中提到Magento版本,但是Mage_Catalog_Block_Product_Price_Template类,尽管名称误导,模板块类。

#File: app/code/core/Mage/Catalog/Block/Product/Price/Template.php
class Mage_Catalog_Block_Product_Price_Template extends Mage_Core_Block_Abstract
{
    ...
}

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

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

$this->setTemplate('pricex/price.phtml');

但这只是该块的魔术getset方法正常工作。同样,当你调用getTemplateFile时,Magento会返回null,因为你的块上还没有人调用setTemplateFile。 (与继承自Mage_Core_Block_Template的块相反,后者实际上具有已定义的getTemplateFile方法。

您的主要问题是,当Mage_Catalog_Block_Product_Price_Template不是模板块时,您将<block type="catalog/product_price_template" name="catalog_product_price_template" /> 视为模板块。这由相同块的布局更新XML代码支持

{{1}}