Widget işlevini mixins Magento 2.1.1 ile yeniden yazma


17

Sahibiz swatch-renderer.js

Bu dosyada bazı widget'lar var.

....
    $.widget('mage.SwatchRenderer', {
....

    /**
     * @private
     */
    _init: function () {
        if (this.options.jsonConfig !== '' && this.options.jsonSwatchConfig !== '') {
            this._sortAttributes();
            this._RenderControls();
        } else {
            console.log('SwatchRenderer: No input data received');
        }
    },

    /**
     * @private
     */
    _sortAttributes: function () {
        this.options.jsonConfig.attributes = _.sortBy(this.options.jsonConfig.attributes, function (attribute) {
            return attribute.position;
        });
    },

Bazı işlevlerini yeniden yazmak istiyorum.

Bunu yapmanın doğru yolu nedir?

Magento kütüphanesindeki açıklamalar artık gerçek değil, başka bir yaklaşım kullanan sınıflarla bağlantılı (place-order.js / place-order-mixin.js hakkında konuşuyorum). Ve açıklanan örnekler widget işlevlerinin nasıl yeniden yazıldığını bir şekilde açıklamaz.

Yanıtlar:


39

requirejs-config.js

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

/ yol / senin / mixin.js

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

    return function (widget) {

        $.widget('mage.SwatchRenderer', widget, {
            _Rebuild: function () {
                console.log('Hello from rebuild', arguments);
                return this._super();
            }
        });

        return $.mage.SwatchRenderer;
    }
});

3

Düzenleme: Cevabım mixins kullanmıyor. Bildiğim kadarıyla, mixins sadece yöntem yeniden yazma ve özellikleri için çalışır. Sizin durumunuzda, doğrudan bir yöntemin dışında çağırılan saf JS'dir.

Bunu bir modül üzerinden yapabilirsiniz.

İçinde Vendor/Module/view/frontend/requirejs-config.jsaşağıdakileri ekleyebilirsiniz:

var config = {
    map: {
        '*': {
            'Magento_Swatches/js/swatch-renderer':'Vendor_Module/js/swatch-renderer'
        }
    }
};

Ardından Vendor/Module/view/frontend/web/js/swatch-renderer.js, orijinal swatch-renderer.jsdosyayı kopyalayarak dosyayı oluşturabilir ve içeriğini ne yapmak istediğinize göre değiştirebilirsiniz.


Raphael , uzun süredir cevap vermediğim için üzgünüm. Boş zamanım yoktu. Başka bir deyişle, widget yöntemlerini yeniden yazmanın uygun bir yolu yok mu? Sadece tam yeniden yazma? Yani magento mevcut dosyayı güncellerse - yeniden yazmamızı güncellememiz gerekecek.
zhartaunik

@zhartaunik widget yöntemlerini mixins kullanarak yeniden yazmak tamamen mümkündür. Sizin durumunuzdaki sorun, renk örneği oluşturucu dosyasının herhangi bir yöntemi olmadığı, tek bir komut dosyası olmasıdır. Bu nedenle, mixins kullanamayız ve bu nedenle tam olarak yeniden yazmak zorundayız. AFAIK bunu yapmanın tek yolu
Raphael

@RaphaelatDigitalPianism Az önce tarif ettiğinizle aynı şeyi yapmaya çalışıyorum ama sürekli alıyorum Uncaught TypeError: base is not a constructor- neden herhangi bir fikir? Teşekkürler
Tom Burman

SwatchRendererGeçilen işlevin definesonunda olduğu için widget'ı mixin ile yeniden yazabilmelisiniz return $.mage.SwatchRenderer;. Aynı dosyada tanımlanan diğer widget'ı bilmiyorum SwatchRendererTooltip.
gizleyebilir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.