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)

Большое спасибо.

Ответ 1

tl; dr: ответ на этот вопрос зависит от сложности, основанной на типе продукта (настраиваемый, простой и т.д.). Это может повлиять на то, как вы настраиваете свой каталог и устанавливаете простую видимость продукта. Если все, что у вас есть в вашем каталоге, это простые элементы, эта задача очень проста. Также: см. Редактирование в конце.

Существует множество сценариев. Например, если вы добавите настраиваемый элемент в корзину, в котировке будет два элемента котировки для каждого параметра: один элемент кавычки для настраиваемого родительского продукта, который будет содержать информацию о количестве опций и одну позицию котировки, которая предоставит опцию простые данные продукта. Элементы Bundle будут иметь элемент родительского пакета, а также простой элемент для каждой опции пакета.

Все это сводится к тому, что вам нужно решить, как вы представляете количество каждого типа продукта для пользователя; например, хотите ли вы представить ту же модель рубашки, что и одна позиция со всеми размерами, или вы хотите отделить их для каждого размера (последним является то, как 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());
}

Я рекомендую использовать установку с образцами данных и добавлять в корзину разные количества каждого типа продукта. Основываясь на этом + выводе из приведенного выше кода, вы увидите, что у вас есть несколько подходов и getchas при прохождении цикла. Сложные сценарии - это когда у вас есть следующее:

  • Настраиваемые элементы
    • Для каждого параметра у вас будет настраиваемый продукт как элемент и простой продукт, из которого этот параметр выведен как элемент. Если вы хотите отобразить общий счет с помощью настраиваемого родителя, вам нужно будет подсчитать общее количество настраиваемых чисел в цикле:

код:

$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();
    }
}
  • Элементы набора
    • Элементы котировки продуктов Bundle представлены одним элементом для продукта bundle и отдельными простыми элементами продукта для каждой опции. Простые элементы продукта содержат информацию о количестве, хранящуюся против них. Простые элементы имеют идентификатор родительского элемента, который ссылается на элемент котировки продукта пакета, точно так же, как и настраиваемые элементы товарных позиций товара.

Вы можете видеть, что обработка всех сценариев громоздка. Хотелось бы вам сказать, что это проще сделать с помощью моделей ресурсов, но дело в том, что в базе данных таблица sales_flat_quote_item_option хранит информацию о количестве в столбце сериализованных данных, поэтому вам нужно будет перевести что-то в PHP на где-нибудь с ними (что делается для вас через модель ресурсов).

Извините, это такой длинный ответ, но вы можете видеть, что, основываясь на вашей настройке каталога, вы должны тщательно изучить и проверить, чтобы убедиться, что у вас есть ваши базы.

РЕДАКТИРОВАТЬ: При попытке быть тщательным, я не упомянул, что вы должны заглянуть в таблицу sales_flat_quote_item. В зависимости от ваших требований вы можете легко использовать данные там, чтобы быстро, грациозно и эффективно моделировать данные, необходимые для достижения требований к отображению.

Ответ 2

Попробуйте следующее:

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

Ответ 3

вы можете попробовать:

$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();

Ответ 4

Вы должны использовать

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