Magento _prepareLayout()调用了5次到多次

mcg*_*ilm 2 layout customization overriding module magento

**新编辑**

所以我要做的就是这个.

我希望在以下网址的产品视图中添加由我的模块生成的新表单元素

http://magento.example.com/catalog/product/view/id/46
Run Code Online (Sandbox Code Playgroud)

最终这些元素将被确定为由我的模块中的相关表格显示

我期望如果我在我的模块中扩展Mage_Catalog_Block_Product_View,如下所示,我将能够在产品表单中创建一个包含此类表单字段的块,只有当他在我的模块中的相关表中时

所以我在中创建了一个test.phtml文件

 app/design/frontend/default/default/templates/<module>/test.phtml
Run Code Online (Sandbox Code Playgroud)

然后你可以在我描述的View.php文件中看到,我构建了块并在产品视图中显示它.

它确实出现了5次太多了.从下面的答案这是正常的,以便回答问题,为什么它出现五次,但留下问题是什么是正确的方法,因为这个计划不起作用

**结束新编辑**

在我的模块中,我调用_prepareLayout(),当我拉起页面时它会执行5次

这是我的代码

/app/code/local/Namespace/Module/Product/Veiw.php
class <Namespace>_<module>_Block_Product_View extends Mage_Catalog_Block_Product_View {
    protected function _toHtml() {
        return parent::_toHtml();
    }

    public function _prepareLayout() {
        $block = $this->getLayout()->createBlock(
            'Mage_Core_Block_Template',
            'my_block_name_here',
            array('template' => '<module>/test.phtml')
        );
        if ($block){
            $this->getLayout()->getBlock('content')->insert($block)->toHtml();
        }else{
            echo "no block";
        }
            return parent::_prepareLayout();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意: 我刚注意到这也消除了价格可用性数量并添加到购物车按钮.这也是一个问题

编辑 首先我要感谢大家的答案.其次,我想给你更多的背景

选择在模块中执行此操作的原因是我不希望块出现在每个产品上.我所拥有的是一个表格,我称之为自定义选项,包含产品的属性,如头发颜色高度重量等,并取决于附加到产品的属性集(如果有的话)将取决于什么html内容将显示在页面上.所以在一种情况下,我得到一个下拉菜单,在另一种情况下,它可能会得到一个输入框.另一个非常重要的部分是必须进行设置,以便我可以将最终结果作为可以安装的模块给出,而不用担心如果有人在那里进行升级就不会显示

那说在xml文件中执行此操作仍然有意义吗?

Jon*_*Day 5

在我看来,您的代码覆盖了核心Magento模块,以实现在布局xml配置中可以轻松完成的任务.我强烈推荐以下内容:

  1. 使用内置配置机制(如布局文件-阅读艾伦的优秀教程在这里),而不是写代码,只要有可能.
  2. 不要覆盖核心代码
  3. 如果必须更改核心代码的行为,请使用Observer而不是Rewrite/Override
  4. 如果你绝对必须覆盖,请随时致电parent::whatever()

例如,如果<module>.xml在theme(app/design/frontend/default/<theme>/layout)中创建布局文件,则可以使用以下代码:

<catalog_product_view>
    <reference name="content">
        <block type="module/block" name"my_block_name_here" template="module/test.phtml"/>
    </reference>
</catalog_product_view>
Run Code Online (Sandbox Code Playgroud)

然后,您需要getChildHtml('my_block_name_here');在phtml中使用调用来定位块.

因此,除非您内部发生其他功能_prepareLayout,否则无需覆盖核心,甚至覆盖默认值catalog.xml.

编辑(上面的小编辑)

所以现在在你的Block中(我建议你调用它Namespace_Module_Block_Product_Customattributes或类似的东西),你没有覆盖核心的Product_View块,而只是处理你的逻辑,用于渲染自定义属性的html小部件.将其余的等级价格,添加到购物车,其他通用产品块代码等留给Magento来解决.

如果您担心模块用户的升级路径,那么绝对不应该覆盖核心代码.使用配置方法并非常有选择地引入与系统"玩得很好"的代码,而不是尝试使用覆盖来实现它.