Answers:
我将分两部分回答这个问题:
的目的地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来获取当前报价,但是,如果您有客户ID,则可以使用这两个中的任何一个加载报价(我想这是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 />";
}
AllItems()
或getAllVisibleItems()
将从所有活动报价模型返回访问商店的任何人的所有购物车中的所有商品?还是我的购物车中只有一个(我敢打赌,我宁愿使用checkout会话对象并从中获取qutoe对象)?差异很重要,因为我想在块类中使用checkout会话,但实际上进入块内部时qutoe是空的。