JS Widget: iki özel Widget aynı ana Widget Magento 2 genişletilmiş


10

ön koşul

Aynı ana widget'ı genişleten 2 özel widget'ım var.

  • Üst widget: Magento_ConfigurableProduct/js/configurable
  • İlk Özel Widget: Vendor_AModule/js/configurable
  • İkinci Özel Widget: Vendor_BModule/js/configurable

İlk Özel Widget require-config.js:

var config = {
    map: {
        '*': {
            configurable: 'Vendor_AModule/js/configurable'
        }
    }
};

İlk Özel Widget JS:

define([
    'jquery',
    'mage/translate',
    'Magento_ConfigurableProduct/js/configurable'
], function ($) {
    $.widget('vendor.configurable_awidget', $.mage.configurable, {
        /**
         * {@inheritDoc}
         */
        _configureElement: function (element) {
            this._super(element);
            alert('Custom widget A is triggered!');
        }
    });

    return $.vendor.configurable_awidget;
});

İkinci Özel Widget require-config.js:

var config = {
    map: {
        '*': {
            configurable: 'Vendor_BModule/js/configurable'
        }
    }
};

İkinci Özel Widget JS:

define([
    'jquery',
    'mage/translate',
    'Magento_ConfigurableProduct/js/configurable'
], function ($) {
    $.widget('vendor.configurable_bwidget', $.mage.configurable, {
        /**
         * {@inheritDoc}
         */
        _configureElement: function (element) {
            this._super(element);
            alert('Custom widget B is triggered!');
        }
    });

    return $.vendor.configurable_bwidget;
});

Yeniden oluşturma adımları

Yapılandırılabilir bir ürün kullanıcı arabirimi sayfası açıyorum.

Beklenen Sonuç

İkisini de görüyorum Custom widget B is triggered!ve Custom widget A is triggered!uyanıkım.

Gerçek sonuç

Sadece Custom widget B is triggered!uyarı görüyorum .

Soru

Yapılandırılabilir ürün kullanıcı arabirimi sayfasının her iki pencere öğesinin uyarılarını görüntülemesini sağlamak için kod nasıl olmalıdır?

Yanıtlar:


12

Magento 2, bir mixinjs modülünü birden çok yerden genişletmek için yararlı olan, requir-js adı verilen daha az bilinen bir özelliğe sahiptir .

Şöyle requirejs-config.jsgörünmelisiniz:

var config = {
    'config': {
        'mixins': {
            'Magento_ConfigurableProduct/js/configurable': {
                'Vendor_AModule/js/configurable': true
            }
        }
    }
};

Sonra js dosyası:

define([
    'jquery',
    'mage/translate'
], function ($) {

    return function (widget) {
        $.widget('vendor.configurable_awidget', widget, {
            /**
             * {@inheritDoc}
             */
            _configureElement: function (element) {
                this._super(element);
                alert('Custom widget A is triggered!');
            }
        });
        return $.vendor.configurable_awidget;
    };
});

Bu js, hedef modülü bağımsız değişken olarak alan ve genişletilmiş sürümü döndüren bir işlev döndürür. Bu şekilde widget'ı istenmeyen geçersiz kılmalar olmadan farklı yerlerde genişletebilirsiniz.


Harika! Faydalı bilgiler. Teşekkür. Unuttummixin
Khoa TruongDinh

Sadece AWidgetkodunuzda görebiliyorum , nasıl başvurulur BWidget?
Rendy Eko Prastiyo

1
BWidgetile aynı şekilde uygulanır AWidget.
Aaron Allen

Teşekkür ederim efendim, kodunuzu uyguladım ve ne yapması gerektiği gibi çalışıyor.
Rendy Eko Prastiyo

@AaronAllen, +1 Güzel bilgi.
Rakesh Jesadiya

2

Özel Modül'ün diğerlerinden sonra yüklendiğinden emin olun

<sequence> bileşeniniz yüklendiğinde diğer bileşenlerden gereken dosyaların zaten yüklendiğinden emin olmak için etiketi

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="Vendor_BModule" setup_version="1.0.1">
        <sequence>
            <module name="Vendor_AModule"/>
        </sequence>
    </module>
</config>

Check in yapabiliriz app/etc/config.php. Özel modülünüz diğerlerinden "daha düşük düzey" olmalıdır.

<?php
return array (
  'modules' => 
  array (
    ......
    'Magento_ConfigurableProduct' => 1,
    ......
    'Vendor_AModule' => 1,
    ......
    'Vendor_BModule' => 1,
    ......
  ),
);

Özel modülü setup_moduletablodan kaldırabiliriz . Ardından, modül sırasını yeniden sıralamak için kurulum yükseltme komutunu yeniden çalıştırın.

Özel j'lerin diğerlerinden daha "düşük seviye" olduğundan emin olmamız gerekir requirejs-config.js.

pub / static / _requirejs / kullanıcı arayüzü / Magento / parlaklık / tr / requirejs-config.js

(function(require){

    ......

    (function() {

        var config = {
            map: {
                '*': {
                    configurable: 'Magento_ConfigurableProduct/js/configurable'
                }
            }
        };
        require.config(config);
    })();

    ......



    (function() {
        var config = {
            map: {
                '*': {
                    configurable: 'Vendor_AModule/js/configurable'
                }
            }
        };
        require.config(config);
    })();

    .....

    (function() {
        var config = {
            map: {
                '*': {
                    configurable : 'Vendor_BModule/js/configurable'
                }
            }
        };
        require.config(config);
    })();

    ......

})(require);

Modül B'yi beyan edin

A widget'ı "geçersiz kılınmış" olduğundan, varsayılan Magento widget'ı zaten. Bu nedenle, Modül B'de A widget'ını yüklememiz ve "geçersiz kılmamız" gerekir .

Uygulama / kod / satıcı / BModule / görünüşüdür / ön / requirejs-config.js

var config = {
    map: {
        '*': {
            configurable : 'Vendor_BModule/js/configurable'
        }
    }
};

Uygulama / kod / satıcı / BModule / görünüşüdür / ön / ağ / js / configurable.js

define([
    'jquery',
    'mage/translate',
    'Vendor_AModule/js/configurable' // Module A widget
], function ($) {
    $.widget('vendor.configurable_bwidget', $.vendor.configurable_awidget, {
        /**
         * {@inheritDoc}
         */
        _configureElement: function (element) {
            this._super(element);
            alert('Custom widget B is triggered!');
        }
    });

    return $.vendor.configurable_bwidget;
});

Sonuçta, statik içerik dağıtımını tekrar çalıştırmamız gerekiyor.

Daha fazla bilgiyi buradan okuyabiliriz: https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/#using-_super-and-_superapply-to-access-parents


1
Cevabınız için teşekkürler. Bu yöntemi bir gün önce uyguladım ve evet, işe yaradı. Ama sonra kendimi AModule'un BModule'den bağımsız olması gereken bir problemde buluyorum, böylece AModule'yi devre dışı bıraktığımda BModule hala çalışmalı, tersi. Yanıtınız maalesef bu sorunu çözemiyor.
Rendy Eko Prastiyo
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.