Ответы:
Я отвечу на вопрос в двух частях:
Пункт назначения в 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 пуст, когда попадаешь внутрь блока.