Відповіді:
Я відповім на питання в двох частинах:
В пункт призначення link.phtml
є $block->getCheckoutUrl()
. Ви не повинні змінювати шаблон, щоб змінити функціональність, але Magento\Checkout\Block\Onepage\Link
замість цього змінити блок . Для цього створіть для нього плагін методом afterGetCheckoutUrl()
зміни повернутого значення.
Станом на magento-2.0 договори на обслуговування в 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()
Завантажує колекцію елементів, потім повертає масив усіх елементів, які не позначені як видалені І не мають батьківського (тобто ви отримуєте елементи для пакетних та настроюваних продуктів, але не пов'язаних з ними дітей). Кожен елемент масиву відповідає відображеному рядку на сторінці кошика.
Виберіть те, що найкраще відповідає вашим потребам. У більшості випадків останній метод - це те, що вам потрібно.
Використання 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)
Magento\Checkout\Model\Session::getQuote()
.
$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 />";
}
У нових версіях ви можете використовувати API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
AllItems()
чиgetAllVisibleItems()
повернете всі товари у візках будь-кого, хто відвідує магазин, з усіх моделей активних котирувань? Або лише один із мого кошика (я ставлю на це ставку, я б скоріше скористався об'єктом сеансу оформлення замовлення і отримав від нього об’єкт qutoe)? Різниця важлива, тому що я хотів використовувати сеанс оформлення замовлення в блоковому класі, але насправді qutoe порожній, коли потрапляю всередину блоку.