Magento 2 - Як отримати всі товари в кошику?


23

На сторінці оформлення замовлення ( chekout/cart) я хочу відредагувати місце призначення URL-адреси кнопки оформлення на основі позицій кошика ( link.phtml).

Як я можу отримати всі товари в кошику? Я хочу це зробити без використання API. Спасибі.

Відповіді:


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 порожній, коли потрапляю всередину блоку.
Bartosz Kubicki

Це завжди лише кошик поточного сеансу.
Фабіан Шменглер

А як отримати категорію товарів?
Рома Лытарь

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().
Giel Berkers

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.