Cara memicu pembaruan minicart setelah menambahkan ke troli


10

Saya memiliki kelas berikut yang saya gunakan untuk menguji menambahkan ke troli dengan cara kustom;

use Magento\Framework\App\Action;
use Magento\Checkout\Model\Cart;

class Add extends Action\Action
{
    protected $cart;

    public function __construct(
        Action\Context $context,
        Cart $cart
    ){
        $this->cart = $cart;
        parent::__construct($context);
    }

    public function execute()
    {
        $this->cart->addProductsByIds([1])
            ->save();
    }
}

Ini sangat bagus. Ketika Anda melihat keranjang itu menunjukkan barang saya, semua terlihat keren di database dll. Namun, minicart masih menunjukkan seolah-olah tidak ada barang di keranjang.

Jika saya kemudian menambahkan produk lain ke troli menggunakan tombol "tambahkan ke troli" pada produk atau daftar halaman itu menambah ke troli dan memperbarui minicart untuk menampilkan kedua item.

Di mana itu memicu minicart untuk memperbarui sendiri atau bagaimana minicart tahu perlu memperbarui?

Jawaban:


36

Terima kasih atas bantuan Anda :)

Saya telah menemukan cara memicunya, Anda perlu mengatur bagian sections.xmldalam dll / frontend modul Anda yang memberitahu Magento bagian mana yang harus diperbarui untuk panggilan Ajax yang diberikan. Berikut ini sebuah contoh;

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="[frontName]/[ActionPath]/[ActionName]">
        <section name="cart"/>
    </action>
</config>

Setelah panggilan Ajax saya selesai ke [frontName]/[ActionPath]/[ActionName]Magento melakukan panggilan lain ke / pelanggan / bagian / memuat melewati bagian untuk memuat.

Secara default ia meminta pesan apa pun tetapi jika Anda telah mengatur bagian Anda. Xml dengan benar Anda juga akan melihat nama bagian yang telah Anda tetapkan di sana juga.


@ smartic, Informasi bagus yang saya dapat dari sini
Amit Bera


Hebat, saya sedang bekerja memperbarui blok lain melalui ajax dan ini membuat saya di sana. Terima kasih telah memposting solusi Anda.
Eirik

@Smartie apakah ada cara untuk memperbarui bagian kereta setelah beberapa panggilan api magento?
ND17

1
@Smartie Untuk beberapa produk tambahan, hanya memperbarui kuantitas produk pertama dan jumlah produk lainnya tidak ditampilkan dalam mini cart. Apakah kita harus menambahkan sesuatu di sini?
DEEP JOSHI

6

Ini tidak terkait langsung dengan pertanyaan, tetapi jika Anda memperbarui keranjang melalui panggilan AJAX dalam require.jsfile Magento normal , Anda dapat meminta Magento_Customer/js/customer-dataobjek dan meminta minicart untuk menyegarkan dengan cara ini, juga:

<script>
    require([
        'Magento_Customer/js/customer-data'
    ], function (customerData) {
        var sections = ['cart'];
        customerData.invalidate(sections);
        customerData.reload(sections, true);
    });
</script>

Sumber: https://github.com/magento/magento2/issues/5621


Jadi saya membuatnya di sini mencari solusi untuk page_layout khusus saya. Jumlah kereta mini saya selalu 0 setiap kali saya mengunjungi halaman kustom saya. Saya akhirnya harus lari customerData.invalidate(sections);dan kemudian Magento bisa melakukan sisanya.
James Harrington

2

Di etalase jika Anda menyelam di sumber di area minicart

<div data-block="minicart" class="minicart-wrapper">
  <a class="action showcart" 
   data-bind="scope: 'minicart_content'">
     ... 
  </a>

   <script type="text/x-magento-init">
   {
    "[data-block='minicart']": {
        "Magento_Ui/js/core/app": {"components":{....}
     }
   }
</script>
</div>

Seperti yang Anda lihat di sini, magento2 menjalankan komponen di dalam tag skrip dan data ikatan dinamis untuk memblokir minicart menggunakan knockoutJs

Sesuatu yang menarik saya temukan

\vendor\magento\module-checkout\view\frontend\layout\default.xml

Dari tata letak Checkout. Ini menentukan componentuntuk minicart-konten untuk mendapatkan data Lanjutkan melihat Magento_Checkout/js/view/minicartAnda akan melihat

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.