回答:
この質問には2つの部分で回答します。
の宛先は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がある場合は、これら2つのいずれかを使用して見積もりを読み込み(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()
返しますか?または、カートから1つだけ(チェックアウトセッションオブジェクトを使用して、そこからqutoeオブジェクトを取得する方がいいと思います)?ブロッククラスでチェックアウトセッションを使用したかったため、違いは重要ですが、実際にはブロック内に入るとqutoeは空になります。