** 新编辑 **
所以我想做的是这个。
我希望在以下 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 配置中可以轻松完成的任务。我强烈推荐以下内容:
- 尽可能使用内置配置机制(例如布局 xml - 阅读 Alan 的优秀教程 here),而不是编写代码。
- 不要覆盖核心代码
- 如果必须更改核心代码的行为,请使用观察者而不是重写/覆盖
- 如果您绝对必须覆盖,请始终调用
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/