Cách kích hoạt cập nhật minicart sau khi thêm vào giỏ hàng


10

Tôi có lớp sau tôi đang sử dụng để kiểm tra thêm vào giỏ hàng theo cách tùy chỉnh;

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

Điều này làm việc tuyệt vời. Khi bạn xem giỏ hàng, nó hiển thị mục của tôi, tất cả trông rất tuyệt trong cơ sở dữ liệu, v.v. Tuy nhiên, minicart vẫn hiển thị như thể không có mục nào trong giỏ.

Nếu sau đó tôi thêm một sản phẩm khác vào giỏ hàng bằng cách sử dụng nút "thêm vào giỏ hàng" trên trang sản phẩm hoặc danh sách thì nó sẽ thêm vào giỏ hàng và cập nhật minicart để hiển thị cả hai mục.

Nó kích hoạt minicart ở đâu để tự cập nhật hoặc làm thế nào để minicart biết nó cần làm mới?

Câu trả lời:


36

Cảm ơn bạn đã giúp đỡ :)

Tôi đã tìm thấy cách kích hoạt nó, bạn cần thiết lập sections.xmlbên trong vv / frontend của mô-đun để báo cho Magento biết phần nào sẽ cập nhật cho một cuộc gọi Ajax cụ thể. Đây là một ví dụ;

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

Sau khi cuộc gọi Ajax của tôi kết thúc với [frontName]/[ActionPath]/[ActionName]Magento, hãy thực hiện một cuộc gọi khác đến / khách hàng / phần / tải qua các phần để tải.

Theo mặc định, nó yêu cầu bất kỳ thông báo nào nhưng nếu bạn đã thiết lập chính xác các phần của bạn thì bạn cũng sẽ thấy các tên phần bạn đã xác định trong đó.


@ smartic, Thông tin tốt tôi đã nhận được từ đây
Amit Bera


Tuyệt vời, tôi đã làm việc để cập nhật các khối khác thông qua ajax và điều này đã đưa tôi đến đó. Cảm ơn đã đưa ra giải pháp của bạn.
Eirik

@Smartie có cách nào để cập nhật phần giỏ hàng sau một số cuộc gọi api magento không?
ND17

1
@Smartie Đối với nhiều sản phẩm thêm, nó chỉ cập nhật số lượng sản phẩm đầu tiên và số lượng sản phẩm còn lại không được hiển thị trong giỏ hàng nhỏ. Chúng tôi không cần thêm bất cứ điều gì ở đây?
DEEP JOSHI

6

Điều này không liên quan trực tiếp đến câu hỏi, nhưng nếu bạn đang cập nhật giỏ hàng thông qua các cuộc gọi AJAX trong require.jscác tệp Magento bình thường , bạn cũng có thể yêu cầu Magento_Customer/js/customer-datađối tượng và yêu cầu minicart làm mới theo cách này:

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

Nguồn: https://github.com/magento/magento2/issues/5621


Vì vậy, tôi đã làm cho nó ở đây để tìm kiếm một giải pháp cho page_layout tùy chỉnh của tôi. Số lượng giỏ hàng nhỏ của tôi luôn là 0 bất cứ khi nào tôi đi đến bất kỳ trang tùy chỉnh nào của mình. Cuối cùng tôi phải chạy customerData.invalidate(sections);và sau đó Magento đã có thể làm phần còn lại.
James Harrington

2

Trong cửa hàng nếu bạn lặn trong nguồn trong khu vực 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>

Như bạn có thể thấy ở đây magento2 thực thi các thành phần bên trong thẻ script và dữ liệu liên kết động để chặn minicart sử dụng knockoutJs

Đôi khi thú vị tôi khám phá

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

Từ cách bố trí Checkout. Nó xác định componentnội dung cho minicart cho getdata Tiếp tục xem Magento_Checkout/js/view/minicartbạn sẽ thấy

.....
$('[data-block="minicart"]').on('contentLoading', function(event) {
      addToCartCalls++;
      self.isLoading(true);
});
.....
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.