从Magento订单中获取产品

12
在我的Magento项目中,在我的帐户>我的订单(登录的客户)下,我能够查看订单详细信息以及我订购的产品。现在,对于每个订购的产品,我想检索特定属性,然而,根据我的理解,在sales/order/items/renderer/default.phtml的代码片段开头,$_item = $this->getItem();代表了订单本身,因此如果我使用像$_item->getId()这样的东西,我得到的是订单ID而不是产品ID。
我尝试过研究,最后得到了以下代码:
$orders = Mage::getModel('sales/order')->load($_item->getId());
foreach($orders as $order):
    $is = $order->getAllItems();
    foreach($is as $i):
        echo $i->getProductId();
    endforeach;
endforeach;

希望我可以使用产品编号获取该产品的其他属性。然而,使用此代码时出现错误,但无法确定错误的原因。我也尝试了类似于以下内容的代码:

 $_productCollection = Mage::getResourceModel('reports/product_collection')
                        ->addAttributeToSelect('*')
                        ->addAttributeToFilter('name', $name);

                    foreach($_productCollection as $_product):
                        $_temp = $_product->getResource()->getAttribute('name_en')->getFrontend()->getValue($_product);
                    endforeach;

但是当我尝试检查产品集合中的项目数时,始终得到0。我该如何在此页面检索产品的自定义属性?


1
你可以从这个问题的答案中查看我的回答:http://stackoverflow.com/questions/18307847/product-details-in-magento/18309045#18309045 - Emi
谢谢,但我没有产品的ID,所以无法使用它来加载产品的详细信息。 - user1597438
2
如果您在 sales/order/items/renderer/default.phtml 中,变量 $_item 是一个订单项,而不是一个订单,因此您需要使用 $item->getProductId();。 - Emi
非常感谢。我现在已经得到了产品ID,但是我仍然无法获取我想要显示的自定义属性。 - user1597438
正如我在第一条评论中所说,如果您查看我的答案,您会发现(在获取productId之后),您有两种方法可以获取产品的属性。第一种方法是执行$product = Mage::getModel('catalog/product')->load($productId);,第二种方法是将该属性添加到Magento的销售模块的系统xml中,这样当订单项被创建时,它将从产品中复制该属性。 - Emi
根据网站的语言环境(我正在使用多语言商店),我需要显示指定的属性。我使用了你的第一个建议,但它只在我的订单中最后一项起作用。对于前几项,该属性并没有显示出来。 - user1597438
3个回答

23

这应该会更好用:

   $orderIncrementId = '100000010';
   $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
   $items = $order->getAllVisibleItems();
   foreach($items as $i):
      echo $i->getProductId();
   endforeach;

点击这里了解更多信息:http://www.magentocommerce.com/boards/viewthread/18629/


19

虽然 Electric Jesus 给出的答案可以工作,但存在在循环中加载产品的潜在性能问题。

正确的实现方式是首先获取订购产品的ID,然后一次性加载所有产品。假设您已经加载了订单:

$orderedItems = $order->getAllVisibleItems();
$orderedProductIds = [];

foreach ($orderedItems as $item) {
    $orderedProductIds[] = $item->getData('product_id');
}

$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection->addAttributeToSelect('*');
$productCollection->addIdFilter($orderedProductIds);

Magento 有集合的原因! - anshuman
我们需要在这个结尾调用$productCollection->load();吗? - ahnbizcad
这取决于您接下来将如何处理集合。 - user487772
1
当你尝试对集合进行任何操作(例如循环遍历),通常会隐式调用load()。你很少需要自己调用它。 - Doug McLean
1
我需要一个更好的解决方案。 - arqam

1
$_orders = $this->getOrders();
$orderitems = $_order->getAllVisibleItems();
foreach ($_orders as $_order): 
  $orderitems = $_order->getAllVisibleItems();
  foreach ($orderitems as $orderitem): 
    $product = $orderitem->getProduct(); 
    echo $product->getId();
  endforeach; 
endforeach;

我有同样的问题,这是我的解决方案


这是从目录加载产品数据的正确方法。 - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接