0

我一直在将 Magento 的愿望清单模块重新用于我自己的版本,并且在重新跟踪它的每个部分是如何组合在一起方面取得了很大的成功。

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

这种方法从何而来?我想在愿望清单模块的其他地方使用它,但它似乎是该特定类独有的,但它没有在任何地方定义,所以我完全糊涂了。

Magento 1.7

4

1 回答 1

3

tl;drsetOptionList通过一种魔术方法调用,该方法生成一个名为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

于 2013-04-04T21:00:24.297 回答