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

时间:2010-09-25 15:17:41

标签: layout magento module override customization

**新编辑**

所以我要做的就是这个。

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

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

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

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

所以我在

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

然后正如您在我所描述的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();
    }
}

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

修改 首先,我要感谢大家的答案。其次,我想给你更多背景信息

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

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

2 个答案:

答案 0 :(得分:5)

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

  1. 使用内置配置机制(例如布局xml - 阅读Alan的优秀教程here),而不是尽可能编写代码。
  2. 不要覆盖核心代码
  3. 如果您必须更改核心代码的行为,请使用Observer而不是Rewrite / Override
  4. 如果您绝对必须覆盖,始终致电parent::whatever()
  5. 例如,如果您在主题(<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>
    

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

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

    编辑(上面的小编辑)

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

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

答案 1 :(得分:4)

我看了一下CE 1.4.1的Magento库存,未加修改的 _prepareLayout方法在加载URL时被称为六次

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

那是因为该类被实例化了六次。所以这是正确的行为。

至于消失的元素,我可以肯定地说,但你对_prepareLayout的覆盖似乎不是

  1. 做与Mage_Catalog_Block_Product_View :: _ prepareLayout

  2. 相同的事情
  3. 调用parent :: _ prepareLayout();

  4. 当您在Magento中覆盖一个类时,您将使用自己的类替换现有类。如果更改方法,则负责运行旧代码。

    目前还不清楚你要在这里完成什么。您应该考虑将问题分解为较小的问题,然后发布一个(或更多)“我试过X,期望Y,并得到Z”类型的问题。如上所述,没有人能够回答你的问题。