Alışveriş sepetine ekledikten sonra bir miniart güncellemesi nasıl tetiklenir


10

Ben özel bir şekilde sepeti ekleyerek test etmek için kullanıyorum aşağıdaki sınıf var;

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();
    }
}

Harika çalışıyor. Sepeti gördüğünüzde öğemi gösteriyor, tüm veritabanında vb. Görünüyor. Ancak, minicart hala sepette hiç öğe yokmuş gibi görünüyor.

Ürün veya liste sayfalarındaki "sepete ekle" düğmesini kullanarak sepete başka bir ürün eklersem, sepete ekler ve her iki öğeyi de göstermek için mini bölümü günceller.

Miniartın kendini güncellemesi için nereden tetikliyor veya miniart yenilenmesi gerektiğini nasıl biliyor?

Yanıtlar:


36

Yardımın için teşekkürler :)

Nasıl tetikleyeceğini buldum sections.xml, modülünüzün Magento'ya belirli bir Ajax çağrısı için hangi bölümleri güncelleyeceğini söyleyen bir iç / ön uç ayarlamanız gerekiyor . İşte bir örnek;

<?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>

Ajax çağrı [frontName]/[ActionPath]/[ActionName]Magento bittikten sonra yüklemek için bölümleri geçen / customer / section / load başka bir çağrı yapar.

Varsayılan olarak herhangi bir ileti ister, ancak section.xml dosyanızı doğru şekilde ayarladıysanız, burada tanımladığınız bölüm adlarını da görürsünüz.


@ smartic, İyi bilgi, buradan clew aldım
Amit Bera


Harika, ajax ile diğer blokları güncelleme üzerinde çalışıyordu ve bu beni oraya var. Çözümünüzü gönderdiğiniz için teşekkür ederiz.
Eirik

@Smartie, bazı magento api çağrısından sonra alışveriş sepeti bölümünü güncellemenin herhangi bir yolu var mı?
ND17

1
@Smartie Birden fazla ekleme ürünü için, sadece ilk ürün miktarını güncelliyor ve geri kalan ürün sayısı mini arabada gösterilmiyor. Buraya daha fazla bir şey eklemek istiyor muyuz?
DEEP JOSHI

6

Bu doğrudan soru ile ilgili değildir, ancak normal Magento require.jsdosyalarındaki AJAX çağrıları aracılığıyla sepeti güncelliyorsanız , Magento_Customer/js/customer-datanesneyi isteyebilir ve miniarttan bu şekilde yenilenmesini isteyebilirsiniz:

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

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


Bu yüzden burada benim özel page_layout için bir çözüm arıyor yaptı. Özel sayfalarımdan birine gittiğimde mini araba sayım her zaman 0 idi. Koşmak zorunda kaldım customerData.invalidate(sections);ve sonra Magento gerisini halledebildi.
James Harrington

2

Miniart alanında kaynağa dalarsanız mağazada

<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>

Burada gördüğünüz gibi, magento2, minicart kullanım knockoutJ'lerini engellemek için kod etiketi ve dinamik bağlama verileri içinde bileşenleri yürütür

Keşfettiğim ilginç şeyler

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

Checkout düzeninden. Bu tanımlamak componentiçin bir minicart-içerik tanımlamak Devam görmek Magento_Checkout/js/view/minicartgöreceksiniz

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.