Ich habe die folgende Klasse, die ich verwende, um das Hinzufügen zum Warenkorb auf benutzerdefinierte Weise zu testen.
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();
}
}
Das funktioniert super. Wenn Sie den Warenkorb anzeigen, wird mein Artikel angezeigt, in der Datenbank usw. sieht alles cool aus. Der Minicart zeigt jedoch weiterhin an, als ob sich keine Artikel im Warenkorb befinden.
Wenn ich dann ein anderes Produkt in den Warenkorb lege, indem ich auf der Produkt- oder Listenseite auf die Schaltfläche "In den Warenkorb" klicke, wird es dem Warenkorb hinzugefügt und der Minicart aktualisiert, um beide Artikel anzuzeigen.
Wo löst es den Minicart aus, sich selbst zu aktualisieren, oder woher weiß der Minicart, dass er aktualisiert werden muss?
Dies hängt nicht direkt mit der Frage zusammen. Wenn Sie jedoch den Warenkorb über AJAX-Aufrufe in normalen Magento-
require.js
Dateien aktualisieren , können Sie dasMagento_Customer/js/customer-data
Objekt anfordern und den Minicart auf diese Weise auffordern, ebenfalls zu aktualisieren:Quelle: https://github.com/magento/magento2/issues/5621
quelle
customerData.invalidate(sections);
und dann konnte Magento den Rest erledigen.Im Laden, wenn Sie in der Quelle im Minicart-Bereich tauchen
Wie Sie hier sehen können, führt magento2 Komponenten innerhalb des Skript-Tags aus und dynamische Bindungsdaten, um Minicart zu blockieren. Verwenden Sie knockoutJs
Etwas Interessantes entdecke ich
Aus dem Checkout-Layout. Es definiert einen
component
für Minicart-Inhalt zu getdata. Weiter sehen,Magento_Checkout/js/view/minicart
Sie werden sehenquelle