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();
这种行为是通过__callPHP 中的一个内置功能实现的,它允许您在引用不存在的类方法时路由方法调用:
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