我可以在quote-> getAllItems()上调用哪些方法?

时间:2012-06-21 20:37:53

标签: php magento

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

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

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

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

即。我见过getId()等,但我可以使用其他什么方法?

而且,如果我想在quote对象中有自定义数据,我会在哪里创建自定义get方法来访问这些数据?

由于 保罗

3 个答案:

答案 0 :(得分: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的magic methods之一:

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']的当前值。

这就是魔法。

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

答案 1 :(得分: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_Objectlib/varien/object.php

通过查看Varien_Object,您会找到getData()& setData()方法+魔法吸气剂& setter方法。这些是可用于在模型上获取和设置属性的一些方法(扩展Varien Object) - 这应该回答问题的第二部分。

答案 2 :(得分:0)

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

大多数方法用于检查项目的状态,以及它是否与其他方法分开运送等,但它也继承了一堆方法。

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