tl;dr:setOptionList
通过一种魔术方法调用,该方法生成一个名为option_list
. 这可以通过getOptionList
稍后检索。
首先,让我们从模板开始:
模板文件 options_list.phtml 使用Mage_Wishlist_Block_Customer_Wishlist_Item_Options
块类。该类扩展Mage_Wishlist_Block_Abstract
,扩展Mage_Catalog_Block_Product_Abstract
。该类文件又扩展Mage_Core_Block_Abstract
了 ,它最终是Varien_Object
.
这些类都没有名为 的属性或方法options_list
。那么它是从哪里来的呢?
这是 Magento 的 ORM 的一部分,它为对象中的某些数据提供魔术 getter 和 setter。对象的属性通过下划线分隔,并且很多时候与数据库表的列名相关。许多对象直接与数据库表相关。例如,base_tax_amount
在 sales_flat_order 中通过 调用getBaseTaxAmount()
。
但是,如何option_list
填充?简单的。在Mage_Wishlist_Block_Customer_Wishlist
第 178 行:
return $block->setTemplate($template)
->setOptionList($helper->getOptions($item))
->toHtml();
这种行为是通过__call
PHP 中的一个内置功能实现的,它允许您在引用不存在的类方法时路由方法调用:
http://php.net/manual/en/language.oop5.magic.php
现在怎么办?我需要扩展这个!
好消息,你可以。Mage_Wishlist_Block_Customer_Wishlist_Item_Options
像往常一样扩展或重写该类并添加以下方法:
public function getOptionList()
{
$options = parent::getOptionList();
//your functionality here
return $options;
}
当通过 option_list.phtml 模板调用时,将找到您的新方法,并且您的方法将引用父级 - 我们知道它不存在。这将回退到__call
,这将返回option_list
您对象的属性。最后别忘了回来$options
!
补充阅读:
这可能有助于您了解 Magento 核心的 Varien 对象系统:
http://alanstorm.com/magento_varien_object_debugging