Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Magento_prepareLayout()调用了5次到多次_Layout_Magento_Module_Overriding_Customization - Fatal编程技术网

Magento_prepareLayout()调用了5次到多次

Magento_prepareLayout()调用了5次到多次,layout,magento,module,overriding,customization,Layout,Magento,Module,Overriding,Customization,**新编辑** 所以我想做的就是这样 我希望在以下url的产品视图中添加由模块生成的新表单元素 http://magento.example.com/catalog/product/view/id/46 最终,这些元素将由模块中的相关表显示 我希望,如果我在我的模块中扩展Mage_Catalog_Block_Product_视图(如下所示),我将能够在产品表单中创建一个包含此类表单字段的块,前提是该块位于我的模块中的相关表中 因此,我在中创建了一个test.phtml文件 app/desig

**新编辑**

所以我想做的就是这样

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

http://magento.example.com/catalog/product/view/id/46
最终,这些元素将由模块中的相关表显示

我希望,如果我在我的模块中扩展Mage_Catalog_Block_Product_视图(如下所示),我将能够在产品表单中创建一个包含此类表单字段的块,前提是该块位于我的模块中的相关表中

因此,我在中创建了一个test.phtml文件

 app/design/frontend/default/default/templates/<module>/test.phtml
app/design/frontend/default/default/templates//test.phtml
然后,正如您在我的View.php文件中所看到的,我构建了这个块并将其显示在产品视图中

它确实出现了,但是太多了5倍。从下面的答案来看,这是正常的,因此回答了为什么它会出现五次的问题,但留下了一个问题:既然这个计划不起作用,那么正确的处理方法是什么

**结束新编辑**

在我的模块中,我调用了_prepareLayout(),当我打开页面时,它会这样做5次

这是我的密码 在

/app/code/local/Namespace/Module/Product/Veiw.php
类块产品视图扩展了图像目录块产品视图{
受保护的函数_toHtml(){
返回父项::toHtml();
}
公共职能_prepareLayout(){
$block=$this->getLayout()->createBlock(
“法师核心块模板”,
“我的名字在这里”,
数组('template'=>'/test.phtml')
);
如果($block){
$this->getLayout()->getBlock('content')->insert($block)->toHtml();
}否则{
回声“无阻塞”;
}
返回父项::_prepareLayout();
}
}
注意: 我刚刚注意到,这也带走了价格可用性数量和添加到购物车按钮。这也是一个问题

编辑 首先,我要感谢大家的回答。第二,我想给你们更多的背景

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


这就是说,在xml文件中这样做是否仍然有意义?

我查看了CE 1.4.1的库存Magento安装,未经修改的
\u prepareLayout
方法在加载URL时调用了六次

http://magento.example.com/catalog/product/view/id/46
这是因为类被实例化了六次。所以这是正确的行为

至于消失元素,我不能肯定,但是您对
\u prepareLayout
的覆盖似乎也不存在

  • 执行与Mage_目录_块_产品_视图相同的操作::_prepareLayout

  • 调用父对象::_prepareLayout()

  • 当您重写Magento中的类时,您正在用自己的类替换现有的类。如果您更改了一个方法,您就要对正在运行的旧代码负责


    现在还不清楚你想在这里完成什么。你应该考虑把你的问题分解成更小的问题,然后张贴一个(或更多)“我试X,期望Y,Z”类型的问题。如前所述,没有人能够回答您的问题。

    在我看来,您的代码正在覆盖核心Magento模块,以便实现在布局xml配置中可以轻松完成的功能。我强烈建议如下:

  • 尽可能使用内置的配置机制(如布局xml—阅读Alan的优秀教程),而不是编写代码
  • 不要重写核心代码
  • 如果必须更改核心代码的行为,请使用观察者,而不是重写/重写
  • 如果您绝对必须重写,始终调用
    parent::whatever()
  • 例如,如果在主题(
    app/design/frontend/default//layout
    )中创建
    .xml
    布局文件,则可以使用以下代码:

    <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中调用以定位块

    因此,除非在
    \u prepareLayout
    中有其他功能,否则无需重写核心,甚至无需重写默认的
    catalog.xml

    编辑(上面的小编辑)

    因此,现在在您的块中(我建议您将其称为
    名称空间\模块\块\产品\自定义属性
    或类似的东西),您没有覆盖核心产品\视图块,而只是处理用于呈现自定义属性的html小部件的逻辑。将剩余的层级价格、添加到购物车、其他通用产品代码等留给Magento解决


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

    背景是一切与Magento问题。1.“当你叫_prepareLayout”时,你在哪里叫它?你为什么要手动调用它。2.“当我打开页面”什么页面?3.您在模块中还做了什么。@Alan Storm感谢您的回复,1。我在这里调用它,你可以在我的代码2中看到它。我正在翻开的那页
    <catalog_product_view>
        <reference name="content">
            <block type="module/block" name"my_block_name_here" template="module/test.phtml"/>
        </reference>
    </catalog_product_view>