查找magento方法定义,特别是getOptionList()

时间:2013-04-04 20:30:40

标签: magento magento-1.7

我一直在将Magento的心愿单模块重新用于我自己的版本,并且大部分成功地重新追踪了它的每个部分是如何组合在一起的。

app / design / frontend / package / theme / template / wishlist / options_list.phtml 中,wishlist显示产品选项和配置的方式。它调用$this->getOptionList(),它返回与该产品关联的选项/配置数组。我无法跟踪此方法的来源,因此我搜索了整个 app / code / core / 目录,该目录与愿望清单无关!

这种方法来自哪里?我想在wishlist模块中的其他地方使用它,但它似乎是该特定类所独有的,但它没有在任何地方定义,所以我完全糊涂了。

Magento 1.7

1 个答案:

答案 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对象系统:

http://alanstorm.com/magento_varien_object_debugging