我一直在将Magento的心愿单模块重新用于我自己的版本,并且大部分成功地重新追踪了它的每个部分是如何组合在一起的。
在 app / design / frontend / package / theme / template / wishlist / options_list.phtml 中,wishlist显示产品选项和配置的方式。它调用$this->getOptionList()
,它返回与该产品关联的选项/配置数组。我无法跟踪此方法的来源,因此我搜索了整个 app / code / core / 目录,该目录与愿望清单无关!
这种方法来自哪里?我想在wishlist模块中的其他地方使用它,但它似乎是该特定类所独有的,但它没有在任何地方定义,所以我完全糊涂了。
Magento 1.7
答案 0 :(得分:3)
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 。对象上的属性通过下划线分隔,并且多次与数据库表列名相关联。许多对象直接与数据库表相关。例如,sales_flat_order中的base_tax_amount
是通过getBaseTaxAmount()
调用的。
但option_list
如何填充?简单。在第178行的Mage_Wishlist_Block_Customer_Wishlist
中:
return $block->setTemplate($template)
->setOptionList($helper->getOptions($item))
->toHtml();
此行为是通过PHP中的内置功能__call
实现的,它允许您在引用不存在的类方法时路由方法调用:
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对象系统: