这证明无法找到谷歌搜索,所以如果有人能帮助我解决这个问题,我将不胜感激。我对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方法来访问这些数据?
由于 保罗
答案 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_Object
(lib/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')来获取特定产品属性的数据。