Як викликати оновлення міні-карт після додавання в кошик


10

У мене є такий клас, який я використовую для тестування додавання до кошика у користувальницький спосіб;

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

Це чудово працює. Коли ви переглядаєте кошик, він показує мій товар, все виглядає круто в базі даних тощо. Однак міні-карт все ще показує, як ніби в кошику немає предметів.

Якщо я потім додаю інший продукт у кошик, натискаючи кнопку "додати в кошик" на продукт або на сторінках з переліком, він додає до кошика та оновлює міні-картку, щоб показати обидва елементи.

Де він запускає міні-картку, щоб оновити себе, чи як міні-карт знає, що потрібно оновити?

Відповіді:


36

Спасибі за вашу допомогу :)

Я знайшов, як його запустити, вам потрібно встановити sections.xmlвнутрішню частину etc / frontend вашого модуля, який повідомляє Magento, які розділи потрібно оновити для заданого виклику Ajax. Ось приклад;

<?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 [frontName]/[ActionPath]/[ActionName]Magento здійснює черговий дзвінок в / customer / section / load, передаючи секції для завантаження.

За замовчуванням він вимагає будь-яких повідомлень, але якщо ви правильно налаштували секції.xml, ви також побачите імена розділів, які ви вказали там.


@ smartic, Хороша інформація, звідси я потрапив
Amit Bera

Допоможіть, будь ласка, з magento.stackexchange.com/questions/166641/…
Ankit Shah

Дивовижно, я працював над оновленням інших блоків через ajax, і це мене привело туди. Дякуємо, що опублікували ваше рішення.
Ейрік

@Smartie Чи є спосіб оновити розділ кошика після деяких дзвінків magento api?
ND17

1
@Smartie Для декількох доданих продуктів, у міні-кошику не відображається лише кількість першого продукту, а кількість решти продуктів не відображається. Чи потрібно нам додати щось більше сюди?
DEEP JOSHI

6

Це не пов’язано безпосередньо з питанням, але якщо ви оновлюєте кошик за допомогою AJAX-дзвінків у звичайних require.jsфайлах Magento , ви можете вимагати Magento_Customer/js/customer-dataоб’єкт і попросити міні-карт оновити таким чином:

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

Джерело: https://github.com/magento/magento2/isissue/5621


Тому я зробив це, шукаючи рішення для мого користувацького page_layout. Мій міні-кошик завжди був 0, коли я перейшов на будь-яку з моїх користувацьких сторінок. Мені в кінцевому підсумку довелося бігати, customerData.invalidate(sections);і тоді Magento зміг зробити все інше.
Джеймс Харрінгтон

2

Якщо ви занурилися в джерело в районі міні-картки, ви можете перейти до магазину

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

Як ви бачите тут, magento2 виконує компоненти всередині тегу сценарію та динамічні дані прив'язки для блокування minicart використання knockoutJs

Щось цікаве я відкриваю

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

З макета замовлення. Він визначає componentвміст minicart для вмісту getdata. Продовжуйте бачити Magento_Checkout/js/view/minicart, що побачите

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.