Как отключить образец, как только он выбран в Magento2.2?


Я пытаюсь отключить образец, как только он будет выбран. Поэтому его не следует отменять...

Как это сделать в Magento2.2.x?

Author: 7ochem, 2018-04-09

3 answers

Мне удалось остановить выбор образца, переопределив часть ядра swatch-renderer.js . Я использую образцы цветов Amasty Pro, поэтому я внес изменения в swatch-renderer.js в этом модуле.

Я скопировал виджет...

_onclick: функция ($это, $виджет) {

И изменил этот раздел...

if ($this.hasClass('selected')) {
 // COMMENT OUT THE 3 LINES BELOW TO PREVENT TOGGLING OF CURRENT SWATCH SELECTION
    //$parent.removeAttr('option-selected').find('.selected').removeClass('selected');
    //$input.val('');
    //$label.text('');
} else {
    $parent.attr('option-selected', $this.attr('option-id')).find('.selected').removeClass('selected');
    $label.text($this.attr('option-label'));
    $input.val($this.attr('option-id'));
    $this.addClass('selected');
}
 2
Author: SilkSpin, 2018-04-24 11:29:19

Вы могли бы сделать это с помощью изменений в swatch-renderer.js. Добавление пары строк кода к событию _OnClick здесь, как показано ниже, отключит события указателя и снизит непрозрачность , чтобы пользователь знал, что он отключен:

    $this.parent().css("pointer-events","none");
    $this.parent().css("opacity","0.6");

Я бы предпочел сделать это с помощью миксина, который обертывает исходную функцию, чтобы сохранить все исходные функции из вызова, и добавляется только незначительная дополнительная функциональность.

Создайте микс, чтобы переопределить образец Визуализация

  1. Создайте новый файл JS, чтобы переопределить метод _OnClick по умолчанию в swatch-renderer.js. Вы можете поместить это в свою тему или модуль. Здесь я изложил это в рамках темы.

    define([
        'jquery',
        'mage/utils/wrapper'
    ], function ($, wrapper) {
        'use strict';
    
        return function(swatchRenderer){
    
            var OnClickWrapper = wrapper.wrap(swatchRenderer.prototype._OnClick, function(originalSwatchRenderer){
                var result = originalSwatchRenderer();
    
                /*Custom code start*/
                $(arguments[1][0]).parent().css({"pointer-events":"none","opacity":"0.6"});
                /*Custom code end*/
    
                return result;
            });
    
            swatchRenderer.prototype._OnClick = OnClickWrapper;
            return swatchRenderer;
        };
    });
    

App/design/frontend/ThemeVendor/ThemeName/Magento_Swatches/web/js/swatch-renderer-mixin.js

  1. Добавьте файл requirejs-config.js для инициализации нового файла mixin:

    var config = {
    config: {
        mixins: {
            'Magento_Swatches/js/swatch-renderer': {
                'Magento_Swatches/js/swatch-renderer-mixin': true
            }
        }
    }
    };
    

App/design/frontend/ThemeVendor/ThemeName/Magento_Swatches/requirejs-config.js

 1
Author: harri, 2018-04-10 08:28:59

\magento\app\code\Module\RewriteSwatches\etc\module.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Module_RewriteSwatches" setup_version="2.0.1">
</module>

\magento\app\code\Module\RewriteSwatches\view\frontend\requirejs-config.js

var config = {
config: {
    mixins: {
        'Magento_Swatches/js/swatch-renderer': {
            'Module_RewriteSwatches/js/swatch-renderer': true
        }
    }
}};

\magento\app\code\Module\RewriteSwatches\registration.php

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

\magento\app\code\Module\RewriteSwatches\view\frontend\web\js\swatch-renderer.js

    define([
    'jquery'
], function ($) {
    'use strict';
    return function (widget) {
        $.widget('mage.SwatchRenderer', widget, {

        /**
         * Event for swatch options
         *
         * @param {Object} $this
         * @param {Object} $widget
         * @param {String|undefined} eventName
         * @private
         */
        _OnClick: function ($this, $widget, eventName) {
            var $parent = $this.parents('.' + $widget.options.classes.attributeClass),
                $wrapper = $this.parents('.' + $widget.options.classes.attributeOptionsWrapper),
                $label = $parent.find('.' + $widget.options.classes.attributeSelectedOptionLabelClass),
                attributeId = $parent.attr('attribute-id'),
                $input = $parent.find('.' + $widget.options.classes.attributeInput);

            if ($widget.inProductList) {
                $input = $widget.productForm.find(
                    '.' + $widget.options.classes.attributeInput + '[name="super_attribute[' + attributeId + ']"]'
                );
            }

            if ($this.hasClass('disabled')) {
                return;
            }

            if ($this.hasClass('selected')) {
                //$parent.removeAttr('option-selected').find('.selected').removeClass('selected');
                //$input.val('');
                //$label.text('');
                //$this.attr('aria-checked', false);
            } else {
                $parent.attr('option-selected', $this.attr('option-id')).find('.selected').removeClass('selected');
                $label.text($this.attr('option-label'));
                $input.val($this.attr('option-id'));
                $input.attr('data-attr-name', this._getAttributeCodeById(attributeId));
                $this.addClass('selected');
                $widget._toggleCheckedAttributes($this, $wrapper);
            }

            $widget._Rebuild();

            if ($widget.element.parents($widget.options.selectorProduct)
                .find(this.options.selectorProductPrice).is(':data(mage-priceBox)')
            ) {
                $widget._UpdatePrice();
            }

            $(document).trigger('updateMsrpPriceBlock',
                [
                    parseInt($this.attr('index'), 10) + 1,
                    $widget.options.jsonConfig.optionPrices
                ]);

            $widget._loadMedia(eventName);
            $input.trigger('change');
        }
    });
    return $.mage.SwatchRenderer;
}
});
 0
Author: Magento Developer, 2019-10-10 11:53:36