На странице оформления заказа ( chekout/cart
) я хочу изменить назначение ссылки кнопки оформления заказа на основе позиций корзины ( link.phtml
).
Как я могу получить все товары в корзине? Я хочу сделать это без использования API. Спасибо.
Я отвечу на вопрос в двух частях:
Пункт назначения в 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()
Загружает коллекцию элементов, затем возвращает массив всех элементов, которые не помечены как удаленные И не имеют родителя (т.е. вы получаете элементы для связанных и настраиваемых продуктов, но не связанные с ними дочерние элементы). Каждый элемент массива соответствует отображаемой строке на странице корзины.
Выберите то, что соответствует вашим потребностям лучше всего. В большинстве случаев последний метод - это то, что вам нужно.
AllItems()
илиgetAllVisibleItems()
будет возвращать все товары во всех корзинах любого посетителя магазина из всех активных моделей котировок? Или только один из моей корзины (держу пари, я бы предпочел использовать объект сеанса проверки и получить из него объект qutoe)? Разница важна, потому что я хотел использовать сеанс проверки в классе блока, но на самом деле qutoe пуст, когда попадаешь внутрь блока.Использование Magento \ Checkout \ Model \ Cart не рекомендуется.
Вы должны использовать сессию, чтобы получить цитату и ваши элементы корзины.
Я уверен, что Magento скоро добавит какой-нибудь репозиторий для сессии.
Насколько я могу сказать, вы не можете просто получить текущую цитату, используя Magento \ Quote \ Api \ CartRepositoryInterface или Magento \ Quote \ Api \ CartManagementInterface, однако, если у вас есть идентификатор клиента, вы можете использовать любой из этих двух для загрузите цитату (которую, я думаю, именно так Magento и хочет, чтобы вы сделали), и оттуда получите цитату / корзину товаров.
источник
Magento\Checkout\Model\Session::getQuote()
.источник
В новых версиях вы можете использовать API:
источник