2011-11-28 18 views
11

utilizo este código:Magento: Obtener la cantidad en la compra de un producto determinado

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

Para obtener información sobre los productos en el carrito.

¿Cómo puedo obtener sólo la cantidad de un producto determinado (productId)

muchas gracias.

Respuesta

39

tl; dr: La respuesta a esta pregunta varía en complejidad en función del tipo de producto (configurable, simple, etc.).Esto puede determinar la forma en que configura su catálogo y establece una visibilidad simple del producto. Si todo lo que tienes en tu catálogo es artículos simples, esta tarea es muy fácil. También: vea editar al final.

Hay muchos escenarios a considerar. Por ejemplo, si agrega un elemento configurable al carro, el presupuesto tendrá dos elementos de cotización por opción: un artículo de cotización para el producto principal configurable que contendrá información de cantidad de opción y un artículo de cotización que proporcionará los datos de producto simples de la opción. Los artículos del paquete tendrán un artículo del paquete principal así como un artículo simple para cada opción del paquete.

Lo que esto se reduce a es que tiene que decidir cómo se representa la cantidad de cada tipo de producto para el usuario; por ejemplo, ¿desea representar el mismo modelo de camisa como una línea con todas las cantidades de tamaño, o desea separarlas para cada tamaño (siendo esta última la forma en que Magento las representa en las áreas de carrito/revisión).

recomiendo agregar productos al carro, a continuación, el uso de este en el frontend para ver los datos del artículo cita:

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

recomiendo el uso de una instalación con los datos de la muestra y la adición de diferentes cantidades de cada tipo de producto al carrito. Con base en esto + el resultado del código anterior, verás que tienes varios enfoques y errores a medida que avanzas. Los escenarios son de confusión cuando se tiene lo siguiente:

  • elementos configurables
    • Para cada opción, tendrá el producto configurable como un elemento y el simple producto del que se deriva la opción como un artículo. Si desea mostrar el recuento total por el padre configurable, que tendrá que contar el Cant configurable total en el bucle:

Código:

$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(); 
    } 
} 
  • elementos agrupados productos
    • simples que se añaden a la cita como parte de un elemento agrupado están separadas de elementos simples que se añaden individuo y otros grupos a los que pueden pertenecer.Si desea agregar estos, puede recorrer este modo:

Código:

$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 Artículos
    • Bundle artículos de cotización del producto están representados por uno artículo para el producto del paquete y artículos de producto simples separados para cada opción. Los elementos de productos simples tienen la información de cantidad almacenada en su contra. Los elementos simples tienen una ID de elemento principal que se remite al elemento de oferta del producto del paquete, al igual que los elementos hijos de los elementos de cotización configurables.

se puede ver que el manejo de todos los escenarios es engorroso. Desearía poder decirles que es más fácil hacerlo a través de modelos de recursos, pero el hecho es que en la base de datos, la tabla sales_flat_quote_item_option almacena información sobre cantidades en una columna de datos serializados, por lo que tendrá que llevar cosas a PHP para llegar a cualquier parte con ellos (lo cual se hace por usted a través del modelo de recursos).

Lo siento, esta es una respuesta tan larga, pero se puede ver que, en función de la configuración de su catálogo, está en una cuidadosa consideración y prueba para asegurarse de que tiene sus bases cubiertas.

EDIT:Al tratar de ser exhaustivo, que no se menciona que usted debe buscar en la tabla sales_flat_quote_item. Dependiendo de sus requisitos, puede usar fácilmente los datos para modelar de forma rápida, elegante y eficiente los datos que necesita para cumplir con sus requisitos de visualización.

0

usted podría intentar:

$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

consigo este error: Fatal error: Llamada a una getStoreId función miembro() en un objeto no en/app/código/core/Mage/Sales/Model/Mysql4/Quote/Item/Collection.php en la línea 67 – Bizboss

+0

Te encontrarás con problemas porque la cita va a esperar que se cargue un objeto de la tienda. Si está ejecutando este código "fuera" de Mage :: run(), use 'Mage :: getSingleton ('core/session', array ('name' => 'frontend')); – benmarks

0

Debe utilizar el método

setQUote 

cuando se llama a la colección. En caso de que se parece a esto

$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

Prueba esto:

// 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; 
Cuestiones relacionadas