Magento 2 - วิธีรับสินค้าทั้งหมดในตะกร้า


23

ที่หน้าชำระเงิน ( chekout/cart) ฉันต้องการแก้ไข URL ปลายทางของปุ่มชำระเงินตามรายการในรถเข็น ( link.phtml)

ฉันจะรับสินค้าทั้งหมดในตะกร้าได้อย่างไร ฉันต้องการทำสิ่งนี้โดยไม่ใช้ API ขอบคุณ

คำตอบ:


26

ฉันจะตอบคำถามในสองส่วน:

I. คุณควรเปลี่ยน URL การชำระเงินที่ไหน

ปลายทางในมีlink.phtml $block->getCheckoutUrl()คุณไม่ควรเปลี่ยนแม่แบบเพื่อเปลี่ยนฟังก์ชั่น แต่เปลี่ยนบล็อกMagento\Checkout\Block\Onepage\Linkแทน เมื่อต้องการทำเช่นนั้นสร้างปลั๊กอินสำหรับมันด้วยวิธีafterGetCheckoutUrl()การเปลี่ยนค่าส่งคืน

ครั้งที่สอง วิธีรับสินค้าทั้งหมดในตะกร้า

ในฐานะของสัญญาการให้บริการใน 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 ว่างเปล่าเมื่อเข้าไปในบล็อก
Bartosz Kubicki

มันเป็นเพียงรถเข็นของเซสชันปัจจุบันเท่านั้น
เฟเบียน Schmengler

และวิธีรับหมวดหมู่ของสินค้า
РомаЛытарь

21

เลิกใช้ 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)

4
Magento\Checkout\Model\Session::getQuote()ผมเชื่อว่าวิธีการที่เหมาะสมคือการใช้เซสชั่นการชำระเงินในขณะนี้
Giel Berkers

10
$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 />";            
  }

และวิธีรับหมวดหมู่ของสินค้า
РомаЛытарь

0

ในเวอร์ชันที่ใหม่กว่าคุณสามารถใช้ API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.