2011-11-28 15 views
11

używam tego kodu:Magento: Uzyskaj ilości w koszyku dla danego produktu

// $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 />"; 
} 

Aby uzyskać informacje na temat produktów w koszyku.

Jak mogę uzyskać tylko ilość dla danego produktu (ProductID)

dzięki.

Odpowiedz

39

tl; dr: Odpowiedź na to pytanie zależy od złożoności w zależności od rodzaju produktu (konfigurowalny, prosty, etc.).Może to wpłynąć na sposób konfiguracji katalogu i ustawić prostą widoczność produktu. Jeśli wszystko, co masz w swoim katalogu, to proste elementy, to zadanie jest bardzo proste. Ponadto: patrz edytuj na końcu.

Istnieje wiele scenariuszy do rozważenia. Na przykład, jeśli dodasz do koszyka element konfigurowalny, wycena będzie zawierała dwa elementy wyceny dla każdej opcji: jeden element cudzysłowu dla konfigurowalnego produktu nadrzędnego, który będzie zawierał informacje o ilości opcji i jeden element wyceny, który zapewni proste dane produktu opcji. Elementy pakietu będą miały element pakietu nadrzędnego, a także prosty element dla każdej opcji pakietu.

Sprowadza się to do tego, że musisz zdecydować, w jaki sposób reprezentujesz ilość każdego rodzaju produktu dla użytkownika; na przykład, czy chcesz reprezentować ten sam model koszuli co jeden element zamówienia o dowolnej wielkości, czy też chcesz je rozdzielić dla każdego rozmiaru (ten ostatni jest tym, w jaki sposób Magento renderuje je w obszarach koszyka/recenzji).

Polecam dodać produkty do koszyka, a następnie za pomocą tego w frontend, aby zobaczyć dane artykuł Cytat:

<?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()); 
} 

Polecam stosując zainstalować z przykładowych danych i dodając różne ilości każdego rodzaju produktu do koszyka. Na podstawie tego + wyjście z powyższego kodu zobaczysz, że masz kilka podejść i pułapek w miarę przechodzenia. Zakłócający scenariusze gdy masz następujące elementy:

  • KONFIGUROWANE
    • Dla każdej opcji, będziesz miał konfigurowalny produkt jako elementu i prosty produkt, z którego wywodzi się opcja jako przedmiot. Jeśli chcesz wyświetlić całkowitą liczbę przez konfigurowalnego rodzica, musisz się zgadzać całkowitą konfigurowalny Ilość w pętli:

kod:

$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(); 
    } 
} 
  • Zgrupowane przedmioty
    • Proste produkty, które są dodawane do oferty w ramach zgrupowanego przedmiotu, są oddzielone od prostych pozycji dodawanych indywidualnie ly i inne grupy, do których mogą należeć.Jeśli chcesz agregować te możesz pętli tak:

Kod:

$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(); 
    } 
} 
  • Bundle przedmioty
    • Bundle pozycji produkt ofertowe są reprezentowane przez jednego produkt dla produktu pakowanego i oddzielić proste produkty dla każdej opcji. Proste produkty mają zapisane informacje ilościowe. Proste elementy mają nadrzędny identyfikator produktu, który powraca z powrotem do elementu oferty produktu pakietowego, tak jak robią to przedmioty z konfigurowalnym produktem z ofertą towarów.

Widać, że obsługa wszystkich scenariuszy jest kłopotliwe. Chciałbym móc powiedzieć, że łatwiej jest to zrobić za pomocą modeli zasobów, ale faktem jest, że w bazie danych tabela sales_flat_quote_item_option przechowuje informacje o ilości w kolumnie zserializowanych danych, więc musisz przeciągnąć rzeczy do PHP, aby uzyskać wszędzie z nimi (co jest zrobione dla ciebie poprzez model zasobów).

Przykro nam, że jest to tak długa odpowiedź, ale możesz zobaczyć, że w oparciu o konfigurację katalogu, musisz dokładnie rozważyć i przetestować, aby upewnić się, że masz pod ręką swoje bazy.

EDIT:Starając się być dokładny, nie udało mi się wspomnieć, że należy spojrzeć do tabeli sales_flat_quote_item. W zależności od wymagań można z łatwością korzystać z danych w nim, aby szybko, z wdziękiem i wydajnie modelować dane potrzebne do osiągnięcia wymagań wyświetlania.

0

można spróbować:

$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

otrzymuję ten błąd: fatal error: Zadzwoń do getStoreId funkcji członka() w sposób wolny od obiektu w/app/code/core/Mage/Sales/Model/Mysql4/Quote/Item/Collection.php on line 67 – Bizboss

+0

Będziesz mieć problemy z tym, ponieważ oferta będzie oczekiwać, że obiekt sklepu zostanie załadowany. Jeśli używasz tego kodu "na zewnątrz" Mage :: run(), użyj 'Mage :: getSingleton ('core/session', array ('name' => 'frontend'));' – benmarks

0

należy użyć metody

setQUote 

Dzwoniąc kolekcji. Powinien wyglądać tak

$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

Spróbuj tego:

// 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; 
Powiązane problemy