Magento Web サイトの製品ビュー ページに表示されるコンテンツを変更し、そのページでも使用する独自のカスタム ブロックを作成したいと考えています。
私がやったこと
製品ビュー ハンドルのレイアウト更新を作成
製品のビュー ページに表示されていたものを更新するために、local.xml
ファイル内に次のレイアウトの更新を追加しました。
<catalog_product_view>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
<reference name="content">
<remove name="product.tierprices" />
<remove name="product.info.upsell" />
<remove name="product.clone_prices" />
<remove name="product.description" />
<remove name="product.tag.list" />
<remove name="product.info.addto" />
<remove name="product.info.addtocart" />
<remove name="product.info.downloadcontent" />
<remove name="product.info.extrahint" />
<remove name="product.info.options.wrapper.bottom" />
<remove name="product.info.container1" />
<remove name="product.info.container2" />
<remove name="alert.urls" />
<remove name="catalog.compare.sidebar" />
<remove name="cart_sidebar" />
<remove name="right.permanent.callout" />
<remove name="paypal.partner.right.logo" />
<remove name="right.poll" />
<remove name="bundle.tierprices" />
<remove name="product.attributes" />
<!-- This should override the original product.info block -->
<block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">
<!-- Custom MyNamespace_Videos_Block_Player block -->
<block type="videos/player" name="videoPlayer" as="videoPlayer" template="video/player.phtml"/>
</block>
</reference>
</catalog_product_view>
この時点で、ノードの削除が機能していることを確認しました。明らかに、videos/player
この時点ではブロック クラスを作成していなかったため、何も表示されませんでした。
カスタムモジュール
の下に次のフォルダー構造を作成して、カスタム モジュールを作成しましたapp/code/local
。
- マイネームスペース
- MyNameSpace/ビデオ
- MyNameSpace/ビデオ/ブロック
- MyNameSpace/ビデオ/など
モジュールの構成ファイルを作成しMyNameSpace/Videos/etc/config.xml
、次の xml ノードを配置しました。
<?xml version="1.0"?>
<config>
<modules>
<mynamespace_videos>
<version>0.0.1</version>
</mynamespace_videos>
</modules>
<global>
<blocks>
<videos>
<class>MyNamespace_Videos_Block</class>
</videos>
</blocks>
</global>
</config>
次に、モジュールを有効にして、機能することを確認しました。
カスタム ブロック クラス
MyNameSpace/Videos/Block/Player.phtml
次のようにカスタム ブロックを作成しました。
class MyNamespace_Videos_Block_Player extends Mage_Core_Block_Template {
public function _toHtml() {
echo "Block's _toHtml() method called!";
parent::_toHtml();
}
}
カスタム テンプレート ファイル
design/frontend/mythemepackage/default/template/video/player.phtml
次に、以下を含むカスタム テンプレート ファイルを作成しました。
<!--Check to see if Magento sees this!-->
<?php Mage::log(get_class($this)); ?>
catalog/product/view.phtml を修正
videos/player
ブロックを 内に表示するために、 のデザイン パッケージ
catalog/product/view.phtml
にコピーしました。app/design/frontend/base/default/template/catalog/product/view.phtml
app/design/frontend/mythemepackage/default/template/catalog/product/view.phtml
次に、新しくコピーしたビュー テンプレートに次の行を追加しました。
<b>This text will show up!</b>
<i>The following wont: </i>
<?php echo $this->getChildHtml('videoPlayer'); ?>
結果
videoPlayer
上記の構成では、ブロックをレンダリングできません。
私が知っていることは次のとおりです。
- ファイルに通常の html テキストが表示されます
catalog/product/view.phtml
。何が反響しているか見えない$this->getChildHtml('videoPlayer');
- クラスの
_toHtml()
メソッド が呼び出されておらず、テンプレートからの出力が表示されません。MyNamespace_Videos_Block_Player
video/player.phtml
- からコピー
catalog.xml
しapp/design/frontend/base/default/layout/catalog.xml
て ブロックを追加すると、「app/design/frontend/mythemepackage/default/layout/catalog.xml
ブロックの _toHtml() メソッドが呼び出されました!」と表示されます。ブロックによってエコーされました。への追加は次のようになります。videos/player
videos/player
catalog.xml
<block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">
<block type="videos/player" name="videoPlayer" as="videoPlayer" template="video/player.phtml"/>
</block>
catalog.xml
ブロックのメソッド呼び出しのローカル バージョンを使用しても_toHtml()
、テンプレートからは何も出力されません。
質問
この問題のトラブルシューティングにかなりの時間を費やしました。でキャッシュを完全に削除var/cache
し、モジュールがアクティブで動作していることを確認しました。
- 私は何が欠けていますか?ブロックをレンダリングするには何が必要ですか?
- ブロックのコピー
catalog.xml
と追加は機能するのに、更新はlocal.xml
機能しないのはなぜですか?