2011-11-28 78 views
11

我用這個代碼:Magento的:獲取在購物車的數量給定產品

// $items = Mage::getModel('checkout/cart')->getQuote()->getAllItems(); 
$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems(); 
  
foreach($items as $item) { 
    echo 'ID: '.$item->getProductId().'<br />'; 
    echo 'Name: '.$item->getName().'<br />'; 
    echo 'Sku: '.$item->getSku().'<br />'; 
    echo 'Quantity: '.$item->getQty().'<br />'; 
    echo 'Price: '.$item->getPrice().'<br />'; 
    echo "<br />"; 
} 

要獲取有關產品車的信息。

我怎樣才能只在一定的產品(productId參數)

非常感謝數量。

回答

39

TL;博士:根據產品類型(可配置的,簡單的,等等)的複雜性的這個問題的答案各不相同。這可能會推動您如何設置目錄並設置簡單的產品可視性。如果您的目錄中包含的內容都是簡單的項目,則此任務非常簡單。另請參閱:編輯結束。

有很多的方案以供參考。例如,如果您向購物車添加可配置項目,則報價將具有每個選項的兩個報價項目:可配置父級產品的一個報價項目,其中將包含選項數量信息和一個報價項目,以提供該選件的簡單產品數據。捆綁項目將具有父項捆綁項目以及每個捆綁選項的簡單項目。

什麼將此歸結爲是,你需要決定你如何表示每類產品的數量給用戶;例如,您是否想將襯衫的型號與所有尺寸數量的一個訂單項代表相同,或者您是否想要將每種尺寸的尺寸分開(後者是Magento如何在購物車/評論區域中呈現它們)。

我建議將您的產品加入購物車,然後在前臺使用該看報價項目數據:

<?php 

include 'app/Mage.php'; 
Mage::setIsDeveloperMode(true); 

Mage::app(); // Mage_Core_Model_App 

Mage::getSingleton('core/session', array('name'=>'frontend')); 

$quote = Mage::helper('checkout/cart')->getCart()->getQuote(); 

echo count($quote->getItemsCollection()); 
foreach ($quote->getItemsCollection() as $item){ 
    Zend_Debug::dump($item->debug()); 
} 

我建議使用與樣本數據的安裝並添加不同量的每種產品類型的到購物車。根據以上代碼的輸出結果,您會發現在循環時有幾種方法和陷阱。混雜的情況是,當你具備以下條件:

  • 配置項
    • 對於每個選項,您將有可配置的產品作爲項目單純的產品從該選項導出作爲一個項目。如果你想顯示由配置的父總數,你需要相符的總配置數量的循環:

代碼:

$configurables = array(); 

// ...then, inside your foreach 
if($item->getProductType() === 'configurable'){ 
    if(isset($configurables[$item->getProductId()])){ 
     //add to the other options' quantity 
     $configurables[$item->getProductId()] += $item->getQty(); 
    } 
    else { 
     $configurables[$item->getProductId()] = $item->getQty(); 
    } 
} 
  • 分組的項目 被加入到報價爲分組項目的一部分
    • 簡單的產品是從被加入個人的簡單物件分開以及他們可能屬於的其他團體。如果你想聚合這些,可以遍歷像這樣:

代碼:

$grouped = array(); 

// ...then, inside your foreach 
if($item->getProductType() === 'grouped' || $item->getProductType() === 'simple'){ 
    if(isset($grouped[$item->getProductId()])){ 
     //add to the other options' quantity 
     $grouped[$item->getProductId()] += $item->getQty(); 
    } 
    else { 
     $grouped[$item->getProductId()] = $item->getQty(); 
    } 
} 
  • 捆綁項目
    • 捆綁產品報價的項目是由一個代表項目捆綁產品和單獨的簡單產品項目爲每個選項。簡單的產品項目具有存儲的數量信息。簡單物品有一個父物品ID,它反映到捆綁產品報價物品,就像可配置產品報價物品的子物品一樣。

你可以看到,處理所有的場景很麻煩。我希望我可以告訴你,通過資源模型實現這一點更容易,但事實是,在數據庫中,sales_flat_quote_item_option表將數量信息存儲在一列序列化數據中,因此您需要將東西拉到PHP中以獲取任何位置與他們(這是通過資源模型爲您完成)。

對不起,這是一個很長的答案,但你可以看到,根據你的目錄設置,你需要進行一些仔細的考慮和測試,以確保你的基地已經覆蓋。

編輯:在嘗試是徹底的,我忘了,你應該看看sales_flat_quote_item表。根據您的要求,您可以輕鬆使用其中的數據快速,優雅且高效地建模您需要的數據以實現顯示要求。

0

你可以嘗試:

$quote = Mage::getSingleton('checkout/session')->getQuote(); 
$item = Mage::getModel('sales/quote_item')->getCollection() 
       ->addFieldToFilter('quote_id', $quote->getId()) 
       ->addFieldToFilter('product_id', $productId) 
       ->getFirstItem(); 
//to get the quantity: $item->getQty(); 
+0

我得到這個錯誤: 致命錯誤:調用一個成員函數getStoreId()一個非對象在/ app /代碼/核心/ Mage/Sales/Model/Mysql4/Quote/Item/Collection.php on line 67 – Bizboss

+0

你會遇到這方面的問題,因爲報價將期望加載商店對象。如果你在Mage :: run()外面運行這個代碼,可以使用Mage :: getSingleton('core/session',array('name'=>'frontend'));' – benmarks

0

調用集合時,應使用

setQUote 

方法。應該是這樣的

$quote = Mage::getModel('sales/quote')->load($quote_id); 
$salesQuoteItem = Mage::getModel('sales/quote_item')->getCollection() 
      ->setQuote($quote) 
      ->addFieldToFilter('quote_id', $quote_id) 
      ->addFieldToFilter('product_id', $data['product_id']) 
      ->getFirstItem(); 
3

試試這個:

// if you don't have the product object already... 
$_product = Mage::getModel('catalog/product')->load($productid); 

$_quote = Mage::getSingleton('checkout/session')->getQuote(); 
$_item = $_quote ? $_quote->getItemByProduct($_product) : false; 
$qty = $_item ? $_item->getQty() : 0; 
相關問題