TL;博士: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为对象的某些数据的一部分。对象的属性通过下划线分隔,并多次与数据库表列名称相关联。许多对象直接与数据库表相关联。例如,sales_flat_order中的base_tax_amount
通过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的核心:
http://alanstorm.com/magento_varien_object_debugging
哇,如果我能请你喝一杯。当我研究这个时,魔术方法确实出现了,但我很难理解它们的工作方式,更不用说在Magento中。所以,我感谢你的答案,我不知何故了解; p 虽然我有一个后续问题:我试图从扩展'Mage_Wishlist_Block_Abstract'的自定义模块调用getOptionList。它会在那里工作吗,因为它都可以追溯到Varien Object? – andyjv 2013-04-05 12:19:35
它可能不起作用,因为'setOptionList'发生在'$ block'的上下文中,这不是Abstract,而是具体的类。如果你可以重写'Mage_Wishlist_Block_Customer_Wishlist_Item_Options',你应该可以访问它。 – philwinkle 2013-04-05 14:28:01
非常感谢,你的回答实际上表明我正在吠叫错误的树。 – andyjv 2013-04-05 16:23:28