layout - Magento _prepareLayout() 调用 5 次到多次

标签 layout magento module overriding customization

** 新编辑 **

所以我想做的是这个。

我希望在以下 url 的产品 View 上添加由我的模块生成的新表单元素

http://magento.example.com/catalog/product/view/id/46

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

我预计,如果我在我的模块中扩展 Mage_Catalog_Block_Product_View 如下所示,我将能够在产品表单中创建一个包含此类表单字段的 block ,前提是他位于我的模块中的相关表中

所以我在

中创建了一个test.phtml文件
 app/design/frontend/default/default/templates/<module>/test.phtml

然后,正如您在下面描述的 View.php 文件中看到的那样,我构建了该 block 并将其显示在产品 View 中。

它确实出现了,但次数太多了 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();
    }
}

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

编辑 首先我要感谢大家的回答。其次,我想为您提供更多背景信息

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

也就是说,在 xml 文件中完成这一切仍然有意义吗?

最佳答案

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

  1. 尽可能使用内置配置机制(例如布局 xml - 阅读 Alan 的优秀教程 here),而不是编写代码。
  2. 不要覆盖核心代码
  3. 如果必须更改核心代码的行为,请使用观察者而不是重写/覆盖
  4. 如果您绝对必须覆盖,请始终调用 parent::whatever()

例如,如果您创建 <module>.xml在您的主题( 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>

然后您需要使用 getChildHtml('my_block_name_here');在你的 phtml 中调用来定位 block 。

所以除非你的 _prepareLayout 内部发生了其他功能,不需要覆盖核心,甚至不需要覆盖默认的 catalog.xml .

编辑(上面的小修改)

所以现在在您的 block 中(我建议您将其称为 Namespace_Module_Block_Product_Customattributes 或类似的名称),您不会覆盖核心 Product_View block ,而只是处理用于呈现自定义属性的 html 小部件的逻辑。将其余的层级价格、添加到购物车、其他通用产品 block 代码等留给 Magento 来计算。

如果您担心模块用户的升级路径,那么您绝对不应该覆盖核心代码。使用配置方法并非常有选择性地引入与系统“运行良好”的代码,而不是尝试通过覆盖来控制它。

关于layout - Magento _prepareLayout() 调用 5 次到多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3794351/

相关文章:

mysql - 如何获取此类错误的表 - SQLSTATE [23000] : Integrity constraint violation: 1062

css - 在 IE 中悬停之前,导航链接显示的边距错误

magento - 当产品添加到购物车时切换下拉迷你购物车

c# - 在xamarin项目中使用android模块

model-view-controller - CakePHP 中的动态布局

python-pptx 在布局中更改图片

python - 导入python模块的问题

linux - 使用 Ansible 中的 RPM 模块删除包

java - Android:Canvas:尝试绘制太大

python - 从seaborn散点图中的点中删除白色边框