Magento: получить количество в корзине для данного товара - PullRequest
11 голосов
/ 28 ноября 2011

Я использую этот код:

// $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)

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

Ответы [ 4 ]

40 голосов
/ 28 ноября 2011

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

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

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

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

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

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

3 голосов
/ 10 июля 2015

Попробуйте это:

// 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;
0 голосов
/ 06 февраля 2012

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

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();
0 голосов
/ 28 ноября 2011

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

$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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...