Magento 2 Thêm vào giỏ hàng lắng nghe sự kiện


10

Tôi đang cố gắng tìm giải pháp tốt để thực thi javascript tùy chỉnh khi sản phẩm được thêm thành công vào giỏ hàng. Cũng javascript tùy chỉnh này thông tin cần thiết về sản phẩm đã được thêm vào giỏ hàng ( sku, qty, price, name, vv)

Hiện tại tôi nghĩ ra cách sau để có được thông tin về các sản phẩm được thêm vào giỏ hàng:

  1. Viết lại $.mage.catalogAddToCart.prototype.enableAddToCartButton(đối với các sản phẩm được thêm vào giỏ hàng từ danh mục hoặc trang xem sản phẩm)
  2. Viết lại $.mage.dataPost.prototype.postData(đối với các sản phẩm được thêm vào giỏ hàng từ widget)

Để có được thông tin cần thiết tôi phải trang parse (fe để có được qty) và công suất tăng thêm infromation trang (fe để có được skuproduct id)

Tuy nhiên, giải pháp của tôi:

  • có hai điểm vào
  • trông không đẹp
  • không xử lý tình huống khi xác nhận thất bại vào phụ trợ
  • không cung cấp cho tôi tất cả các thông tin cần thiết một cách thuận tiện

Thật không may, tôi không thể tìm thấy bất kỳ điểm mở rộng phù hợp nào của minicart để giải quyết vấn đề của mình.

Mọi góp ý đều được đánh giá cao!


Tôi đã gặp một tình huống tương tự. Tôi đã xem lại mã và logic Magento và không tìm thấy giải pháp nào. Vì vậy, Magento không hỗ trợ nó và có thể, nó có ý nghĩa vì bạn có thể thêm sản phẩm mà không cần yêu cầu Ajax. Nhưng, tôi phải có giải pháp cho nhiệm vụ của mình và tôi đã viết tệp sau (cart-update.js): yêu cầu (['jquery', 'gạch dưới', 'jquery / jquery-repositoryageapi'], hàm ($, _) { var Storage = $ .initNamespaceStorage ('mage-cache-Storage'). localStorage; $ (document) .on ('ajaxComplete', function (event, xhr, settings) {if (settings.url.match (/ customer \ / phần \ / load / i) && xhr.responseJSON && xhr.responseJ
Oleksiy

Bạn đã thử sử dụng mixins chưa? alanstorm.com/the-cantly-case-of-magento-2-mixins Cá nhân tôi thường sử dụng chúng. Cũng giống như phiên bản php của plugin. Nếu bạn gặp khó khăn hãy cho tôi biết và tôi có thể cung cấp một giải pháp.
Chris Anderson

@ChrisAnderson cảm ơn, nhưng thực sự giải pháp xấu xí hiện tại của tôi được mô tả trong câu hỏi được triển khai bằng mixins.
Sergii Ivashchenko

Câu trả lời:


1

Một giải pháp là viết một mixin cho danh mụcAddToCart ajaxSubmit. Thông thường dữ liệu bạn yêu cầu sẽ không có sẵn ở đây nhưng điều này có thể được khắc phục bằng cách sửa đổi thanh toán / giỏ hàng / thêm bộ điều khiển để trả về dữ liệu. Giải pháp đầy đủ bên dưới, hiện tại nó chỉ là javascript cảnh báo dữ liệu bạn cần khi thêm vào giỏ hàng thành công.

ứng dụng / mã / VendorName / ModuleName / đăng ký.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'VendorName_ModuleName',
    __DIR__
);

ứng dụng / mã / VendorName / ModuleName / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="VendorName_ModuleName" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Catalog"/>
            <module name="Magento_Checkout"/>
        </sequence>
    </module>
</config>

ứng dụng / mã / VendorName / ModuleName / etc / frontend / di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Checkout\Controller\Cart\Add" type="VendorName\ModuleName\Controller\Cart\Add"/>
</config>

ứng dụng / mã / VendorName / ModuleName / Trình điều khiển / Giỏ hàng / Add.php

<?php

namespace VendorName\ModuleName\Controller\Cart;

/**
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class Add extends \Magento\Checkout\Controller\Cart\Add
{
    /**
     * Add product to shopping cart action
     *
     * @return \Magento\Framework\Controller\Result\Redirect
     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
     */
    public function execute()
    {
        if (!$this->_formKeyValidator->validate($this->getRequest())) {
            return $this->resultRedirectFactory->create()->setPath('*/*/');
        }

        $params = $this->getRequest()->getParams();

        try {
            if (isset($params['qty'])) {
                $filter = new \Zend_Filter_LocalizedToNormalized(
                    ['locale' => $this->_objectManager->get(
                        \Magento\Framework\Locale\ResolverInterface::class
                    )->getLocale()]
                );
                $params['qty'] = $filter->filter($params['qty']);
            }

            $product = $this->_initProduct();
            $related = $this->getRequest()->getParam('related_product');

            /**
             * Check product availability
             */
            if (!$product) {
                return $this->goBack();
            }

            $this->cart->addProduct($product, $params);
            if (!empty($related)) {
                $this->cart->addProductsByIds(explode(',', $related));
            }

            $this->cart->save();

            /**
             * @todo remove wishlist observer \Magento\Wishlist\Observer\AddToCart
             */
            $this->_eventManager->dispatch(
                'checkout_cart_add_product_complete',
                ['product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse()]
            );

            if (!$this->_checkoutSession->getNoCartRedirect(true)) {
                if (!$this->cart->getQuote()->getHasError()) {
                    $message = __(
                        'You added %1 to your shopping cart.',
                        $product->getName()
                    );
                    $this->messageManager->addSuccessMessage($message);
                }
                return $this->goBack(null, $product, [
                    'sku' => $product->getSku(),
                    'name' => $product->getName(),
                    'price' => $product->getPrice(),
                    'qty' => isset($params['qty'])?$params['qty']:null
                ]);
            }
        } catch (\Magento\Framework\Exception\LocalizedException $e) {
            if ($this->_checkoutSession->getUseNotice(true)) {
                $this->messageManager->addNotice(
                    $this->_objectManager->get(\Magento\Framework\Escaper::class)->escapeHtml($e->getMessage())
                );
            } else {
                $messages = array_unique(explode("\n", $e->getMessage()));
                foreach ($messages as $message) {
                    $this->messageManager->addError(
                        $this->_objectManager->get(\Magento\Framework\Escaper::class)->escapeHtml($message)
                    );
                }
            }

            $url = $this->_checkoutSession->getRedirectUrl(true);

            if (!$url) {
                $cartUrl = $this->_objectManager->get(\Magento\Checkout\Helper\Cart::class)->getCartUrl();
                $url = $this->_redirect->getRedirectUrl($cartUrl);
            }

            return $this->goBack($url);
        } catch (\Exception $e) {
            $this->messageManager->addException($e, __('We can\'t add this item to your shopping cart right now.'));
            $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
            return $this->goBack();
        }
    }

    /**
     * Resolve response
     *
     * @param string $backUrl
     * @param \Magento\Catalog\Model\Product $product
     * @return $this|\Magento\Framework\Controller\Result\Redirect
     */
    protected function goBack($backUrl = null, $product = null, $result = [])
    {
        if (!$this->getRequest()->isAjax()) {
            return parent::_goBack($backUrl);
        }

        if ($backUrl || $backUrl = $this->getBackUrl()) {
            $result['backUrl'] = $backUrl;
        } else {
            if ($product && !$product->getIsSalable()) {
                $result['product'] = [
                    'statusText' => __('Out of stock')
                ];
            }
        }

        $this->getResponse()->representJson(
            $this->_objectManager->get(\Magento\Framework\Json\Helper\Data::class)->jsonEncode($result)
        );
    }
}

ứng dụng / mã / VendorName / ModuleName / view / frontend / allowjs-config.js

var config = {
    config: {
        mixins: {
            'Magento_Catalog/js/catalog-add-to-cart': {
                'VendorName_ModuleName/js/catalog-add-to-cart-mixin': true
            },
        }
    }
};

ứng dụng / mã / VendorName / ModuleName / view / frontend / web / js / catalog-add-to-cart-mixin.js

define([
    'jquery',
], function ($) {
    'use strict';

    return function (widget) {
        $.widget('mage.catalogAddToCart', widget, {
            /**
             * @param {String} form
             */
            ajaxSubmit: function (form) {
                var self = this;

                $(self.options.minicartSelector).trigger('contentLoading');
                self.disableAddToCartButton(form);

                $.ajax({
                    url: form.attr('action'),
                    data: form.serialize(),
                    type: 'post',
                    dataType: 'json',

                    /** @inheritdoc */
                    beforeSend: function () {
                        if (self.isLoaderEnabled()) {
                            $('body').trigger(self.options.processStart);
                        }
                    },

                    /** @inheritdoc */
                    success: function (res) {
                        alert(JSON.stringify(res));
                        var eventData, parameters;

                        $(document).trigger('ajax:addToCart', form.data().productSku);

                        if (self.isLoaderEnabled()) {
                            $('body').trigger(self.options.processStop);
                        }

                        if (res.backUrl) {
                            eventData = {
                                'form': form,
                                'redirectParameters': []
                            };
                            // trigger global event, so other modules will be able add parameters to redirect url
                            $('body').trigger('catalogCategoryAddToCartRedirect', eventData);

                            if (eventData.redirectParameters.length > 0) {
                                parameters = res.backUrl.split('#');
                                parameters.push(eventData.redirectParameters.join('&'));
                                res.backUrl = parameters.join('#');
                            }
                            window.location = res.backUrl;

                            return;
                        }

                        if (res.messages) {
                            $(self.options.messagesSelector).html(res.messages);
                        }

                        if (res.minicart) {
                            $(self.options.minicartSelector).replaceWith(res.minicart);
                            $(self.options.minicartSelector).trigger('contentUpdated');
                        }

                        if (res.product && res.product.statusText) {
                            $(self.options.productStatusSelector)
                                .removeClass('available')
                                .addClass('unavailable')
                                .find('span')
                                .html(res.product.statusText);
                        }
                        self.enableAddToCartButton(form);
                    }
                });
            }
        });

        return $.mage.catalogAddToCart;
    }
});

1

Khi một cái gì đó được thêm vào giỏ hàng, thông tin lưu trữ cục bộ sẽ được cập nhật và bạn có thể đăng ký loại trực tiếp có thể quan sát được trong cartphần dữ liệu khách hàng sẽ được thông báo khi nội dung thay đổi.

Đây là một ví dụ:

require(['Magento_Customer/js/customer-data'], function (customerData) {

    var cart = customerData.get('cart');
    var count = cart().summary_count;
    cart.subscribe(function () {
        if (cart().summary_count !== count) {
            count = cart().summary_count;
            // do something here
            console.log('Number of items in cart is now: ' + count);
        }
    });
});

Ngay cả với một "domReady!" trong khối yêu cầu, dường như chạy quá sớm với tư cách là giỏ hàng (). Summary_count luôn luôn 'không xác định'?
00-BBB

Đó là lý do tại sao bạn đăng ký vào giỏ hàng
Quinten
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.