Come creare un popup modale Magento 2 che non può essere chiuso?


10

Sto cercando di creare un popup modale che non può essere chiuso. Ha un pulsante che ti porta alla pagina successiva facendo clic su di esso, ma non voglio che gli utenti siano in grado di chiuderlo.

Il popup modale può essere chiuso in 3 modi:

  1. Facendo clic sulla croce / [X]pulsante nell'angolo in alto a destra
  2. Premendo Esc
  3. Fai clic sull'overlay

Finora questo è il mio JS modale e penso di clickableOverlay: falseaver già affrontato il terzo:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        $("#popup").modal({
            autoOpen: true,
            responsive: true,
            clickableOverlay: false,
            modalClass: 'modal-custom',
            title: 'Popup',
            buttons: [{
                text: $.mage.__('Take me back to the homepage'),
                class: 'action close-popup wide',
                click: function () {
                    window.location.href = '/';
                }
            }]
        });
    }
);

AGGIORNARE:

Ho anche provato a configurare il modale in modo diverso quando provavo le soluzioni fornite:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);

1
4. Utilizzare uno strumento di sviluppo per rimuovere il modale inserito dal DOM
Kristof a Fooman il

@KristofatFooman, hahaha, Ok, aggiungerò al testo modale: "Per favore, premi F12, ispeziona questo modale e rimuovilo dal DOM per chiuderlo". Penso che tu abbia ragione, piuttosto interessante, ma accetterò quel rischio e non implementerò alcuna misura per prevenirlo.
7

Risposte:


10

Non sono riuscito a ottenere una sostituzione della modal.closeModal()funzione per funzionare tramite i mixin e penso anche che farlo tramite un mixin lo faccia passare attraverso l'intero sito Web su tutti i modali, che non voglio. Ne ho solo bisogno su questo modale.

Ho finito semplicemente rimuovendo qualsiasi trigger che chiamerà modal.closeModal(). Ci sono alcune altre opzioni modali che puoi usare per raggiungere questo obiettivo:

  1. Nascondo il pulsante di chiusura all'apertura del modale con l' openedopzione / evento che verrà attivato subito dopo l' apertura del modale
  2. Sto ignorando l' keyEventHandlers.escapeKeyopzione

Quindi questo è il mio codice finale:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            autoOpen: true,
            responsive: true,
            clickableOverlay: false,
            modalClass: 'modal-custom',
            title: 'Popup',
            buttons: [{
                text: $.mage.__('Take me back to the homepage'),
                class: 'action close-popup wide',
                click: function () {
                    window.location.href = '/';
                }
            }],
            opened: function($Event) {
                $('.modal-header button.action-close', $Event.srcElement).hide();
            },
            keyEventHandlers: {
                escapeKey: function () { return; }
            }
        }, $("#popup"));
    }
);

1
Un buon lavoro è sicuramente il modo giusto di farlo
Raphael al Digital Pianism dal

7

Credo che l'uso dei mixin in quel caso sarebbe rilevante.

Puoi provare quanto segue:

Innanzitutto nel modulo, crea quanto segue view/base/requirejs-config.js:

var config = {
    'config':{
        'mixins': {
            'Magento_Ui/js/modal/modal': {
                'Vendor_Module/hook':true
            }
        }
    }
}; 

Quindi creare view/base/web/hook.js:

define([], function(){
    'use strict';    
    return function(targetModule){
        targetModule.closeModal = function(){
            return false;
        }
        return targetModule;
    };
});

Con questo mixin, sostituisci l'implementazione del closeModalmetodo con il tuo metodo. In tal caso, restituire false eviterebbe di chiudere il modale.

Nota a margine: ti odio per averlo fatto. I popup non chiudibili dovrebbero essere banditi dal Web.


3
L'ho fatto esattamente, ma comunque si chiude. Se jQuery.mage.modal.closeModalfunction() { return false; }
eseguo

1
@ 7ochem forse return false;non è abbastanza. A dire il vero non sono molto a mio agio con JS. Suppongo che dovresti leggere questo articolo che potrebbe aiutarti a restringere il problema o trovare un altro modo possibile per farlo: alanstorm.com/the-curious-case-of-magento-2-mixins
Raphael at Digital Pianism

3
Immagino che questo sostituisca anche la closeModal()funzione del sito, cosa che non voglio. Voglio solo applicare questo a questo singolo modale
7ochem
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.