2013-04-04 52 views
0

我一直在重新利用Magento的愿望清单模块到我自己的版本中,并且在重新追踪它的每个部分是如何放在一起的成功案例中都取得了成功。寻找一个magento方法的定义,特别是getOptionList()

app/design/frontend/package/theme/template/wishlist/options_list.phtml是心愿表如何显示产品选项和配置。它调用$this->getOptionList(),它返回与该产品相关的选项/配置数组。我无法跟踪这个方法来自哪里,所以我搜索了整个app/code/core/目录,这个目录与希望列表没有任何关系!

此方法来自哪里?我希望在wishlist模块中的其他地方使用它,但它似乎是该特定类的专有,但它没有在任何地方定义,所以我完全困惑。

Magento的1.7

回答

3

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

+0

哇,如果我能请你喝一杯。当我研究这个时,魔术方法确实出现了,但我很难理解它们的工作方式,更不用说在Magento中。所以,我感谢你的答案,我不知何故了解; p 虽然我有一个后续问题:我试图从扩展'Mage_Wishlist_Block_Abstract'的自定义模块调用getOptionList。它会在那里工作吗,因为它都可以追溯到Varien Object? – andyjv 2013-04-05 12:19:35

+0

它可能不起作用,因为'setOptionList'发生在'$ block'的上下文中,这不是Abstract,而是具体的类。如果你可以重写'Mage_Wishlist_Block_Customer_Wishlist_Item_Options',你应该可以访问它。 – philwinkle 2013-04-05 14:28:01

+0

非常感谢,你的回答实际上表明我正在吠叫错误的树。 – andyjv 2013-04-05 16:23:28