1

我想修改显示在我的 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_Playervideo/player.phtml
  • catalog.xml如果我从 app/design/frontend/base/default/layout/catalog.xmlto 复制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无效?
4

1 回答 1

0

你好我想你可以 <catalog_product_view>在你的模块中添加标签layout xml

<catalog_product_view>
     <reference name="content">
         <reference name="product.info">
             <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> 
         </reference>
    </reference>
</catalog_product_view> 

这将帮助你

于 2012-11-09T05:58:58.937 回答