【问题标题】:Understanding Magento's unsetChild method了解 Magento 的 unsetChild 方法
【发布时间】:2012-05-14 03:20:49
【问题描述】:

我想了解 Magento 块,因此我阅读了 Mage_Core_Block_Abstract 的 Magento 1.5 代码。

insert($block,,,$alias) 方法 首先调用 setChild($alias,$block) 方法,该方法构建一个 _children 数组(value=$block, key=$alias), 然后构建一个 _sortedChildren 数组(value=$name, key=number)。

我无法理解的是 unsetChild($alias) 方法,在取消设置 _children[$alias] 项后……试图通过 array_search($alias,_sortedChildren) 找到对应的 _sortedChildren 项……嗯,_sortedChildren 的值是块名称,而不是别名!

unsetChild 是否适用于别名不等于其名称的孩子?

【问题讨论】:

  • 可能是bug,可能在更多新版本中修复?
  • 也许...有人可以检查更新的版本吗?
  • 如果是bug,我认为出在insert方法上,而不是unsetChild方法上。要问的问题是:使用块名称作为 _sortedChildren 数组的值是否正确?为什么不是块本身,就像 _children 数组一样?
  • 为什么不将当前块别名作为 _sortedChildren 数组的值,就像 _children 的键一样?然后, unsetChild 的代码将保持不变。另一方面,排序后的 getChildHtml('') 的代码应该使用 _children 数组来抓取块。
  • ... 和 core/text_list _toHtml() 方法也应该更新为使用 _children 数组来抓取块实例

标签: magento


【解决方案1】:

unsetChild 用于将现有块从一个地方移动到另一个地方。您可以从默认位置取消设置块,并在其他位置插入具有相同名称的块(您不能使用remove 方法执行此操作,因为它会完全删除块)。

【讨论】:

  • 谢谢!根据我在代码中读到的内容,如果别名不等于名称,则不会从 _sortedChildren 中取消设置该块。所以,如果你重新插入同名的,同一个block就不能在_sortedChildren数组中出现两次吗?
  • 是的,我认为块会在那里出现两次。
  • 这是预期的行为吗? getChildHtml('') 遍历_sortedChildren,并渲染块...因此,如果别名和块不相等,但重新插入时别名保持不变,我认为该块将被渲染两次:不是移动,而是副本块的...
  • 现在,如果 alias 和 name 相等且保持不变,则移动块,因为 _sortedChildren[$name=$alias] 被 unsetChild 取消设置。嗯……
  • 勘误:请阅读“因此,如果别名和名称不相等”,而不是“因此,如果别名和块不相等”,
猜你喜欢
  • 2017-03-24
  • 2013-12-25
  • 2012-09-07
  • 2011-09-15
  • 2013-10-29
  • 1970-01-01
  • 2016-07-06
  • 2014-07-20
  • 2015-08-01
相关资源
最近更新 更多