2010-09-25 72 views
2

**新编辑**Magento _prepareLayout()被称为5次到很多

所以我想要做的是这样的。

我想补充我的模块上的以下网址

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

最终,这些元素将被确定为通过相关表我的模块中展现出来的产品视图生成新的表单元素

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

所以我CREA特德在

app/design/frontend/default/default/templates/<module>/test.phtml 

一个test.phtml文件,那么你可以在我所描述的View.php文件中看到波纹管我建块,并在产品视图中显示它。

它确实出现但是5倍太多。从下面的答案是正常的,以便回答这个问题,为什么它显示了五次,但留下了什么是正确的方法来处理,因为这个计划不起作用

**结束新编辑* *

我的模块中

我打电话_prepareLayout(),当我在

/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(); 
    } 
} 

注意拉起页面

这里是我的代码 它这样做5次: 我刚刚注意到这也带走了价格可用性数量并添加到购物车按钮。这也是一个问题

编辑 首先我要感谢大家的答复。其次,我想给你更多的背景

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

说,这样做仍然有意义在xml文件中完成这一切?

+1

上下文是Magento问题的一切。 1.“当你调用_prepareLayout”时,你在哪里调用它?你为什么要手动调用它。 2.“当我拉起页面时”什么页面? 3。你还在模块中做什么? – 2010-09-25 18:36:59

+0

@Alan Storm感谢您的回应,1.我在那里调用它,在您的代码中看到它2.我正在拉起的页面是产品视图3.我在模块中执行的其他内容到目前为止与管理员端建立一个网格,并保存数据等。 – mcgrailm 2010-09-25 18:59:11

+0

这似乎正在采取漫长的路要做一个简单的添加到页面布局。我同意艾伦的观点,更多的背景将会有所帮助。你如何测试它被执行的次数?是否有另一个地方可以执行此代码? – 2010-09-25 20:16:44

回答

4

我看了看一只股票的Magento安装CE 1.4.1,并且未修改加载URL

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

这是因为类实例化六次当_prepareLayout方法被调用倍。所以这是正确的行为。

至于消失的元素,我can'y肯定地说,但你的越权_prepareLayout不会出现任何

  1. 做同样的事情Mage_Catalog_Block_Product_View :: _ prepareLayout

  2. 调用parent :: _ prepareLayout();

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

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

+0

这确实是我试图修改的页面。我确实遗漏了\t return parent :: _ prepareLayout();在我的文章,但确实有它在我的原代码,所以我想问题是如何打电话给phtml文件与使用准备布局,因为准备布局被称为5次 – mcgrailm 2010-09-27 14:18:40

+0

我知道你认为你告诉我们你需要什么知道你什么时候说'叫phtml文件',但这可能意味着很多不同的东西。上次:描述你想要做什么,描述你正在采取的方法,描述你期望发生的事情与实际发生的事情。 – 2010-09-27 17:42:38

5

在我看来,你的代码覆盖了一个核心Magento模块,以实现在布局xml配置中可以轻松完成的任务。我强烈建议follwing:

  1. 使用内置配置机制(例如,布局文件 - 阅读艾伦的优秀教程here)只要有可能,而不需要编写代码。
  2. 不会覆盖核心代码
  3. 如果必须改变核心代码的行为,使用一个观察者,而不是重写/覆盖
  4. 如果你绝对必须重写,总是电话parent::whatever()

例如,如果你在你的主题(app/design/frontend/default/<theme>/layout)创建<module>.xml布局文件,你可以使用下面的代码:

<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

EDIT(以上小编辑)

所以,现在在你的块(我建议你把它Namespace_Module_Block_Product_Customattributes或类似的东西),你是不是压倒一切的核心Product_View块,而仅仅是处理你的逻辑使用什么html小部件来呈现您的自定义属性。留下剩余的等级价格,添加到购物车,其他通用产品块代码等,以Magento解决。

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

+0

谢谢你的回答。请参阅我上面的编辑 – mcgrailm 2010-09-27 14:16:28

+0

@mcgrailm - 是的,在布局xml中调用Block仍然有意义。是否显示下拉菜单或单选按钮的逻辑将由您的自定义块处理。看到我上面的编辑。 – 2010-09-27 14:59:50