ที่หน้าชำระเงิน ( chekout/cart
) ฉันต้องการแก้ไข URL ปลายทางของปุ่มชำระเงินตามรายการในรถเข็น ( link.phtml
)
ฉันจะรับสินค้าทั้งหมดในตะกร้าได้อย่างไร ฉันต้องการทำสิ่งนี้โดยไม่ใช้ API ขอบคุณ
ที่หน้าชำระเงิน ( chekout/cart
) ฉันต้องการแก้ไข URL ปลายทางของปุ่มชำระเงินตามรายการในรถเข็น ( 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()
โหลดคอลเล็กชันไอเท็มจากนั้นส่งคืนอาร์เรย์ของไอเท็มทั้งหมดที่ไม่ได้ทำเครื่องหมายว่าถูกลบและไม่มีพาเรนต์ (เช่นคุณได้รับไอเท็มสำหรับผลิตภัณฑ์ที่รวมและกำหนดค่าได้ แต่ไม่ใช่ลูกที่เกี่ยวข้อง) แต่ละรายการอาร์เรย์สอดคล้องกับแถวที่แสดงในหน้ารถเข็น
เลือกสิ่งที่เหมาะกับความต้องการของคุณที่สุด ในกรณีส่วนใหญ่วิธีสุดท้ายคือสิ่งที่คุณต้องการ
เลิกใช้ 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 ลูกค้าคุณสามารถใช้ทั้งสองอย่างเพื่อ โหลดใบเสนอราคา (ซึ่งฉันคิดว่าเป็นวิธีที่วีโอไอพีต้องการให้คุณทำ) และจากนั้นรับรายการราคา / รถเข็น
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 ว่างเปล่าเมื่อเข้าไปในบล็อก