我想修改显示在我的 Magento 网站的产品视图页面上的内容,并且我想创建自己的自定义块以在页面上使用。
我做了什么
为产品视图句柄创建布局更新
为了更新产品视图页面上显示的内容,我将以下布局更新放入我的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/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)); ?>
修改目录/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
要渲染的块。
这是我所知道的:
- 我可以
catalog/product/view.phtml
在我的文件中看到正常的 html 文本。我看不到回响的内容$this->getChildHtml('videoPlayer');
- 没有调用类的
_toHtml()
方法, 我看不到模板的任何输出。MyNamespace_Videos_Block_Player
video/player.phtml
catalog.xml
如果我从app/design/frontend/base/default/layout/catalog.xml
to 复制app/design/frontend/mythemepackage/default/layout/catalog.xml
然后将我的videos/player
块添加到其中,我可以看到“调用了 Block 的 _toHtml() 方法!” 这已得到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
无效?