2

事实证明,这不可能找到谷歌搜索,所以如果有人能帮我解决这个问题,我将不胜感激。我对 Magento 比较陌生,所以它甚至可能有官方文档。

当我有以下内容时,即抓取引用对象,然后在其上调用 getAllItems(),我在哪里可以看到我可以在 getAllItems() 上调用的所有方法?

$cart = Mage::getModel('checkout/cart')->getQuote();

foreach ($cart->getAllItems() as $item) {
    $productId = $item->getProduct()->getId();
    $productPrice = $item->getProduct()->getPrice();
}

即我见过 getId() 等,但我还可以使用哪些其他方法?

此外,如果我想在报价对象中包含自定义数据,我应该在哪里创建自定义 get 方法来访问这些数据?

谢谢保罗

4

3 回答 3

3

获取类方法

如果您只想知道可以调用哪些方法$item,请使用

var_dump(get_class_methods($item));

获取类方法列表。

识别类文件

如果你想知道哪个文件包含 的类定义$item,首先使用

var_dump(get_class($item));

获取类名(Mage_Sales_Model_Quote_Item在这种情况下)。

_然后用斜杠 ( )替换所有下划线 ( )/并附.php加到它。这将为您提供类文件的相对文件路径(Mage/Sales/Model/Quote/Item.php在本例中)。

现在检查文件夹

app/code/local/
app/code/community/
app/code/core/
lib/

按照给定的相对路径的顺序。第一个匹配通常是你想要的类文件。

创建访问自定义报价属性的方法

你不必。Magento 将为您执行此操作。

像许多其他 Magento 模型一样,报价对象基于Varien_Object. 后者提供了一种_call()方法,这是 PHP 的神奇方法之一:

public function __call($method, $args)
{
    switch (substr($method, 0, 3)) {
        case 'get' :
            //Varien_Profiler::start('GETTER: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $data = $this->getData($key, isset($args[0]) ? $args[0] : null);
            //Varien_Profiler::stop('GETTER: '.get_class($this).'::'.$method);
            return $data;

        case 'set' :
            //Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $result = $this->setData($key, isset($args[0]) ? $args[0] : null);
            //Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method);
            return $result;

        case 'uns' :
            //Varien_Profiler::start('UNS: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $result = $this->unsetData($key);
            //Varien_Profiler::stop('UNS: '.get_class($this).'::'.$method);
            return $result;

        case 'has' :
            //Varien_Profiler::start('HAS: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            //Varien_Profiler::stop('HAS: '.get_class($this).'::'.$method);
            return isset($this->_data[$key]);
    }
    throw new Varien_Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
}

现在,当您想在报价对象中包含自定义数据时,您只需调用

$quote->setMyCustomAttribute(911);

在这样的调用中,PHP 将检查引用对象中定义的方法setMyCustomAttribute()。如果找不到这样的方法,它会检查对象是否有魔法__call()方法并调用这个方法。

在我们的示例中,将匹配的set大小写。__call()

现在发生的事情是,Magento 首先将驼峰式字符串setMyCustomAttribute转换为带下划线的键my_custom_attribute。然后它将值存储911到受保护的属性Varien_Object::_data['my_custom_attribute']中。

要从报价对象中读​​取自定义数据,您可以简单地调用

$value = $quote->getMyCustomAttribute();

原理是一样的:getMyCustomAttribute转换成my_custom_attribute,返回当前值Varien_Object::_data['my_custom_attribute']

这就是所有的魔法。

但请注意,这只是暂时的。如果您希望能够保存/加载自定义属性,则需要扩展报价对象。但那是另一回事了。

于 2012-06-22T09:42:04.793 回答
2

报价项目的类型是Mage_Sales_Model_Quote_Item

您可以通过执行以下操作来确认:get_class($item)

所以你的调查将从这里开始:app/code/core/mage/sales/model/quote/item.php

注意:其中一个非常有用且经常使用的方法是getProduct()返回报价项目所代表的产品。它将为您提供类型模型,Mage_Catalog_Model_Product因此可以访问产品属性,这在很多情况下都非常有用。

同样值得注意的是 getQuote() 方法。

除此之外,只需查看报价项目类文件及其扩展的文件即可发现正在发生的事情以及您可以使用的内容。

最终,一个引用项扩展了:Mage_Core_Model_Abstract并且反过来Varien_Object( lib/varien/object.php)

通过查看,Varien_Object您会发现getData()&setData()方法 + 神奇的 getter 和 setter。这些是一些可用于获取和设置模型(扩展Varien Object)属性的方法 - 这应该回答您问题的第二部分。

于 2012-06-21T21:26:20.990 回答
0

如果我错了,请纠正我,但我相信您可以使用销售订单项目模型中的所有方法:http: //docs.magentocommerce.com/Mage_Sales/Mage_Sales_Model_Order_Item.html

大部分方法是用来检查物品的状态,是否与其他物品分开发货等,但它也继承了一堆方法。

您也可以使用旧的$item->getData('attribute')来获取特定产品属性的数据。

于 2012-06-21T20:47:15.687 回答