**新编辑**
所以我要做的就是这个。
我希望在以下网址的产品视图中添加由我的模块生成的新表单元素
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文件中执行此操作仍然有意义吗?
答案 0 :(得分:5)
在我看来,您的代码覆盖了核心Magento模块,以实现在布局xml配置中可以轻松完成的任务。我强烈推荐以下内容:
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>
然后,您需要在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
的覆盖似乎不是
做与Mage_Catalog_Block_Product_View :: _ prepareLayout
调用parent :: _ prepareLayout();
当您在Magento中覆盖一个类时,您将使用自己的类替换现有类。如果更改方法,则负责运行旧代码。
目前还不清楚你要在这里完成什么。您应该考虑将问题分解为较小的问题,然后发布一个(或更多)“我试过X,期望Y,并得到Z”类型的问题。如上所述,没有人能够回答你的问题。