Widget JS: due widget personalizzati hanno esteso lo stesso genitore Widget Magento 2


10

condizione indispensabile

Ho 2 widget personalizzati che estendono lo stesso widget principale.

  • Widget principale: Magento_ConfigurableProduct/js/configurable
  • Primo widget personalizzato: Vendor_AModule/js/configurable
  • Secondo widget personalizzato: Vendor_BModule/js/configurable

Primo widget personalizzato require-config.js:

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

Primo widget personalizzato 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;
});

Secondo widget personalizzato require-config.js:

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

Secondo widget personalizzato 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;
});

I passaggi per riprodurre

Apro una pagina di frontend del prodotto configurabile.

Risultato atteso

Vedo entrambi Custom widget B is triggered!e Custom widget A is triggered!avviso.

Risultato attuale

Vedo solo Custom widget B is triggered!avviso.

Domanda

Come dovrebbe essere il codice per fare in modo che la pagina di frontend del prodotto configurabile visualizzi avvisi di entrambi i widget?

Risposte:


12

Magento 2 ha una caratteristica meno conosciuta chiamata a request-js mixinutile per estendere un modulo js da più posizioni.

Il tuo requirejs-config.jsdovrebbe essere simile:

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

Il file js sarebbe quindi:

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

Questo js restituisce una funzione che accetta il modulo target come argomento e restituisce la versione estesa. In questo modo è possibile estendere il widget in luoghi diversi senza eseguire l'override indesiderato.


Grande! Informazioni utili Grazie. Ho dimenticatomixin
Khoa TruongDinh

Vedo solo AWidgetnel tuo codice come applicare BWidget?
Rendy Eko Prastiyo

1
BWidgetsarebbe implementato come AWidget.
Aaron Allen

Grazie signore, ho implementato il tuo codice e funziona come dovrebbe.
Rendy Eko Prastiyo

@AaronAllen, +1 Nice info.
Rakesh Jesadiya,

2

Assicurarsi che il modulo personalizzato sia stato caricato dopo altri

<sequence> tag per garantire che i file necessari da altri componenti siano già caricati quando il componente viene caricato

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>

Possiamo fare il check-in app/etc/config.php. Il tuo modulo personalizzato dovrebbe essere "di livello inferiore" rispetto ad altri.

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

Possiamo rimuovere il modulo personalizzato dalla setup_moduletabella. Quindi, eseguire nuovamente il comando setup upgrade per riordinare la sequenza del modulo.

Dobbiamo assicurarci che il js personalizzato sia "di livello inferiore" rispetto ad altri requirejs-config.js.

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

Dichiarare il modulo B

Perché il widget A è stato "ignorato" già il widget Magento predefinito. Quindi, nel Modulo B, dobbiamo caricare il widget A e "sovrascriverlo" .

app / code / Venditore / BModule / view / frontend / requirejs-config.js

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

app / code / Venditore / 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;
});

Dopotutto, dobbiamo eseguire nuovamente la distribuzione del contenuto statico.

Possiamo leggere di più qui: https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/#using-_super-and-_superapply-to-access-parents


1
Grazie per la tua risposta. Ho implementato questo metodo un giorno fa e sì, ha funzionato. Ma poi, mi trovo in un problema in cui AModule deve essere indipendente da BModule, quindi quando disabilito AModule, BModule dovrebbe ancora funzionare, viceversa. Qui è dove la tua risposta purtroppo non può gestire questo problema.
Rendy Eko Prastiyo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.