Magento 2 - Как получить все предметы в корзине?

23

На странице оформления заказа ( chekout/cart) я хочу изменить назначение ссылки кнопки оформления заказа на основе позиций корзины ( link.phtml).

Как я могу получить все товары в корзине? Я хочу сделать это без использования API. Спасибо.

lalokuyo
источник

Ответы:

26

Я отвечу на вопрос в двух частях:

I. Где вы должны изменить URL-адрес оформления заказа?

Пункт назначения в link.phtmlтом $block->getCheckoutUrl(). Вы не должны изменять шаблон, чтобы изменить функциональность, но Magento\Checkout\Block\Onepage\Linkвместо этого измените блок . Для этого создайте для него плагин с методом afterGetCheckoutUrl()изменения возвращаемого значения.

II. Как получить все товары в корзине?

Начиная с сервисные контракты в Magento_Checkout и Magento_Quote еще не предоставляют необходимые методы, поэтому мы используем модель корзины. В свой плагин вставьте это так:

public function __construct(\Magento\Checkout\Model\Cart $cart)
{
    $this->cart = $cart;
}

Теперь, когда у вас есть доступ к корзине, вы можете получить предметы несколькими способами, которые в основном такие же, как в Magento 1 :

  • $this->cart->getQuote()->getItemsCollection()

    Возвращает коллекцию элементов цитаты со всеми элементами, связанными с текущей цитатой.

  • $this->cart->getItems()

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

  • $this->cart->getQuote()->getAllItems()

    Загружает коллекцию элементов, затем возвращает массив всех элементов, которые не помечены как удаленные (т.е. были удалены в текущем запросе).

  • $this->cart->getQuote()->getAllVisibleItems()

    Загружает коллекцию элементов, затем возвращает массив всех элементов, которые не помечены как удаленные И не имеют родителя (т.е. вы получаете элементы для связанных и настраиваемых продуктов, но не связанные с ними дочерние элементы). Каждый элемент массива соответствует отображаемой строке на странице корзины.

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

Фабиан Шменглер
источник
используя модель и метод корзины, получить AllItems()или getAllVisibleItems()будет возвращать все товары во всех корзинах любого посетителя магазина из всех активных моделей котировок? Или только один из моей корзины (держу пари, я бы предпочел использовать объект сеанса проверки и получить из него объект qutoe)? Разница важна, потому что я хотел использовать сеанс проверки в классе блока, но на самом деле qutoe пуст, когда попадаешь внутрь блока.
Бартош Кубицки
Это всегда только корзина текущего сеанса.
Фабиан Шменглер
А как получить категорию товаров?
Рома Лытарь
21

Использование Magento \ Checkout \ Model \ Cart не рекомендуется.

Вы должны использовать сессию, чтобы получить цитату и ваши элементы корзины.

use Magento\Checkout\Model\Session;

public function __construct(
        ...
        Session $session
        ...
    ) {
        ...
        $this->_session = $session;
        ...
    }

public function yourFunction()
{
    $items = $this->_session->getQuote()->getAllVisibleItems();
}

Я уверен, что Magento скоро добавит какой-нибудь репозиторий для сессии.

Насколько я могу сказать, вы не можете просто получить текущую цитату, используя Magento \ Quote \ Api \ CartRepositoryInterface или Magento \ Quote \ Api \ CartManagementInterface, однако, если у вас есть идентификатор клиента, вы можете использовать любой из этих двух для загрузите цитату (которую, я думаю, именно так Magento и хочет, чтобы вы сделали), и оттуда получите цитату / корзину товаров.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
Фрэнк
источник
4
Я считаю, что правильный способ - использовать сессию оформления заказа сейчас Magento\Checkout\Model\Session::getQuote().
Гиль Беркерс
10
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); 

// retrieve quote items collection
$itemsCollection = $cart->getQuote()->getItemsCollection();

// get array of all items what can be display directly
$itemsVisible = $cart->getQuote()->getAllVisibleItems();

// retrieve quote items array
 $items = $cart->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 />";            
  }
Рахул Каточ
источник
А как получить категорию товаров?
Рома Лытарь
0

В новых версиях вы можете использовать API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
diazwatson
источник