3

モジュールで提供されている新しいもので 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>

ここで何か不足していますか?

4

1 に答える 1

7

Magento のバージョンについては言及していません、Magento 1.7.0.1 のバニラ インストールで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メソッドが機能しているだけです。同様に、Magento を呼び出すと、ブロックでまだgetTemplateFile誰も呼び出されていないため、Magento は 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" />
于 2012-09-07T18:58:53.060 に答える