Как вызвать обновление мини-карты после добавления в корзину


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, передавая разделы для загрузки.

По умолчанию он запрашивает любые сообщения, но если вы правильно настроили файл section.xml, вы также увидите имена разделов, которые вы там определили.


@ smartic, Хорошая информация, которую я получил отсюда
Амит Бера

Пожалуйста, помогите с magento.stackexchange.com/questions/166641/…
Анкит Шах,

Круто, я работал над обновлением других блоков через 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/issues/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 выполняет компоненты внутри тега script и динамически связывает данные, чтобы заблокировать minicart, используя knockoutJs

Что-то интересное я узнаю

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

Из оформления заказа. Определите componentдля мини-карт-контента для получения данных 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.