JS Widget: dwa niestandardowe widżety rozszerzone tego samego rodzica Widget Magento 2

10

Warunek wstępny

Mam 2 niestandardowe widżety rozszerzające ten sam widżet nadrzędny.

  • Widżet nadrzędny: Magento_ConfigurableProduct/js/configurable
  • Pierwszy niestandardowy widget: Vendor_AModule/js/configurable
  • Drugi niestandardowy widget: Vendor_BModule/js/configurable

Pierwszy niestandardowy widget require-config.js:

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

Pierwszy niestandardowy 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;
});

Drugi niestandardowy widget require-config.js:

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

Drugi niestandardowy 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;
});

kroki ku reprodukcji

Otwieram konfigurowalną stronę frontonu produktu.

Spodziewany wynik

Widzę oba Custom widget B is triggered!i Custom widget A is triggered!czujny.

Aktualny rezultat

Widzę tylko Custom widget B is triggered!alarm.

Pytanie

Jak powinien wyglądać kod, aby konfigurowalna strona nakładki produktu wyświetlała ostrzeżenia o obu widżetach?

Rendy Eko Prastiyo
źródło

Odpowiedzi:

12

Magento 2 ma mniej znaną funkcję o nazwie wymagania-js, mixinktóra jest przydatna do rozszerzania modułu js z wielu miejsc.

Twój requirejs-config.jspowinien wyglądać następująco:

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

Plik js byłby wtedy:

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

Ten js zwraca funkcję, która przyjmuje moduł docelowy jako argument i zwraca wersję rozszerzoną. W ten sposób możesz rozszerzyć widget w różne miejsca bez niepożądanego przesłonięcia.

Aaron Allen
źródło
Świetny! Przydatne informacje. Dzięki. Zapomniałemmixin
Khoa TruongDinh
Widzę tylko AWidgetw twoim kodzie, jak się zgłosić BWidget?
Rendy Eko Prastiyo
1
BWidgetbyłoby zaimplementowane tak samo jak AWidget.
Aaron Allen
Dziękuję, zaimplementowałem twój kod i działa on tak, jak powinien.
Rendy Eko Prastiyo
@AaronAllen, +1 Ładne informacje.
Rakesh Jesadiya
2

Upewnij się, że moduł niestandardowy został załadowany po innych

<sequence> znacznik, aby upewnić się, że potrzebne pliki z innych komponentów są już ładowane podczas ładowania komponentu

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>

Możemy się zameldować app/etc/config.php. Twój moduł niestandardowy powinien być „niższy poziom” niż inne.

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

Możemy usunąć niestandardowy moduł z setup_moduletabeli. Następnie ponownie uruchom polecenie setup upgrade, aby ponownie zamówić sekwencję modułów.

Musimy upewnić się, że niestandardowy plik js jest „niższy poziom” niż inne w requirejs-config.js.

pub / static / _requirejs / frontend / Magento / luma / en_US / Requjs-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);

Zadeklaruj moduł B

Ponieważ widżet A został już „zastąpiony” domyślnym widżetem Magento. Tak więc w module B musimy załadować widżet A i „go przesłonić” .

app / code / Vendor / BModule / view / frontend / Requjs-config.js

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

app / code / Vendor / BModule / view / frontend / web / 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;
});

W końcu musimy ponownie uruchomić wdrażanie zawartości statycznej.

Możemy przeczytać więcej tutaj: https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/#using-_super-and-_superapply-to-access-parents

Khoa TruongDinh
źródło
1
Dzięki za odpowiedź. Wdrożyłem tę metodę kiedyś i tak, zadziałało. Ale potem mam problem, w którym AModuł musi być niezależny od BModułu, więc kiedy wyłączę AModuł, BModuł powinien nadal działać, i na odwrót. Oto twoja odpowiedź niestety nie poradzi sobie z tym problemem.
Rendy Eko Prastiyo