Magento_prepareLayout()调用了5次到多次
**新编辑** 所以我想做的就是这样 我希望在以下url的产品视图中添加由模块生成的新表单元素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
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
的覆盖似乎也不存在
现在还不清楚你想在这里完成什么。你应该考虑把你的问题分解成更小的问题,然后张贴一个(或更多)“我试X,期望Y,Z”类型的问题。如前所述,没有人能够回答您的问题。在我看来,您的代码正在覆盖核心Magento模块,以便实现在布局xml配置中可以轻松完成的功能。我强烈建议如下:
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>