Jak uruchomić aktualizację minicart po dodaniu do koszyka

10

Mam następującą klasę, której używam do testowania dodawania do koszyka w niestandardowy sposób;

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

To działa świetnie. Gdy przeglądasz koszyk, pokazuje mój przedmiot, wszystko wygląda fajnie w bazie danych itp. Jednak minikart nadal pokazuje, jakby w koszyku nie było żadnych przedmiotów.

Jeśli następnie dodam kolejny produkt do koszyka za pomocą przycisku „dodaj do koszyka” na stronach produktu lub list, dodaje on do koszyka i aktualizuje minikart, aby wyświetlał oba elementy.

Gdzie powoduje, że minikart sam się aktualizuje lub skąd minikart wie, że musi się odświeżyć?

Smartie
źródło

Odpowiedzi:

36

Dzięki za pomoc :)

Znalazłem sposób jego wyzwolenia, musisz skonfigurować sections.xmlwewnętrzny etc / frontend modułu, który mówi Magento, które sekcje należy zaktualizować dla danego wywołania Ajax. Oto przykład;

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

Po zakończeniu mojej rozmowy Ajax do [frontName]/[ActionPath]/[ActionName]Magento wykonuje kolejne połączenie do / customer / section / load, przekazując sekcje do załadowania.

Domyślnie żąda wiadomości, ale jeśli poprawnie skonfigurowałeś sekcje.xml, zobaczysz również nazwy sekcji, które tam zdefiniowałeś.

Smartie
źródło
@ smartic, Dobra informacja, mam stąd clew
Amit Bera
Proszę o pomoc z magento.stackexchange.com/questions/166641/...
Ankit Shah
Wspaniale, pracowałem nad aktualizacją innych bloków przez ajax i to mnie tam doprowadziło. Dziękujemy za opublikowanie Twojego rozwiązania.
Eirik
@Smartie jest jakiś sposób na aktualizację sekcji koszyka po pewnym wywołaniu interfejsu API Magento?
ND17
1
@Smartie W przypadku wielokrotnego dodawania produktów aktualizowana jest tylko ilość pierwszego produktu, a liczba pozostałych produktów nie jest wyświetlana w mini koszyku. Czy chcemy tutaj dodać coś więcej?
DEEP JOSHI
6

Nie jest to bezpośrednio związane z pytaniem, ale jeśli aktualizujesz koszyk za pomocą wywołań AJAX w normalnych require.jsplikach Magento , możesz wymagać Magento_Customer/js/customer-dataobiektu i poprosić minicart o odświeżenie również w ten sposób:

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

Źródło: https://github.com/magento/magento2/issues/5621

thaddeusmt
źródło
Zrobiłem to tutaj, szukając rozwiązania dla mojego niestandardowego wyglądu strony. Liczba moich mini-koszyków zawsze wynosiła 0, gdy wchodziłem na dowolną z niestandardowych stron. Skończyło się na tym, że musiałem biec, customerData.invalidate(sections);a potem Magento mógł zrobić resztę.
James Harrington
2

W sklepie, jeśli nurkujesz w źródle w obszarze 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>

Jak widać tutaj magento2 wykonuje komponenty wewnątrz znacznika skryptu i danych dynamicznego wiązania, aby zablokować minicart za pomocą knockoutJs

Odkryłem coś interesującego

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

Z układu kasy. Określa componentzawartość dla minicart, aby uzyskać dane Kontynuuj Magento_Checkout/js/view/minicart, zobaczysz

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
mrtuvn
źródło