Comment créer une popup Modal Magento 2 qui ne peut pas être fermée?

10

J'essaie de créer une fenêtre contextuelle modale qui ne peut pas être fermée. Il a un bouton qui vous amène à la page suivante en cliquant dessus, mais je ne veux pas que les utilisateurs puissent le fermer.

Le popup modal peut être fermé de 3 manières:

  1. Cliquer sur la croix / le [X]bouton dans le coin supérieur droit
  2. En appuyant sur échapper
  3. Cliquez sur la superposition

Jusqu'à présent, c'est mon JS modal et je pense clickableOverlay: falseque j'ai déjà abordé le 3ème:

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 = '/';
                }
            }]
        });
    }
);

MISE À JOUR:

J'ai également essayé de configurer le modal d'une manière différente en essayant les solutions fournies:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);
7ochem
la source
1
4. Utilisez un outil de développement pour supprimer le modal inséré du DOM
Kristof at Fooman
@KristofatFooman, hahaha, ok, je vais ajouter au texte modal: "Veuillez appuyer sur F12, inspecter ce modal et le supprimer du DOM pour le fermer". Je pense que vous avez raison, très intéressant, mais je vais accepter ce risque et ne pas mettre en œuvre de mesures pour l'empêcher.
7ochem

Réponses:

10

Je ne pouvais pas obtenir un remplacement de la modal.closeModal()fonction pour travailler via des mixins et je pense également que le faire via un mixin le fait passer par tout le site Web sur tous les modaux, ce que je ne veux pas. Je n'en ai besoin que sur ce seul modal.

J'ai fini par supprimer simplement tout déclencheur qui appellera modal.closeModal(). Il existe d'autres options modales que vous pouvez utiliser pour y parvenir:

  1. Je cache le bouton de fermeture à l'ouverture du modal avec l' openedoption / événement qui sera déclenché juste après l'ouverture du modal
  2. Je remplace l' keyEventHandlers.escapeKeyoption

Voici donc mon code final:

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"));
    }
);
7ochem
la source
1
Bon travail, c'est certainement la bonne façon de le faire
Raphael au Digital Pianism
7

Je pense que l'utilisation de mixins dans ce cas serait pertinente.

Vous pouvez essayer ce qui suit:

Tout d'abord dans votre module, créez ce qui suit view/base/requirejs-config.js:

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

Créez ensuite view/base/web/hook.js:

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

Avec ce mixin, vous remplacez l'implémentation de la closeModalméthode par votre propre méthode. Dans ce cas, renvoyer false éviterait de fermer le modal.

Note latérale: Je vous déteste pour avoir fait ça. Les popups non fermables doivent être bannis du Web.

Raphael chez Digital Pianism
la source
3
J'ai fait exactement ça, mais ça se ferme quand même. Si je lance ceci dans mon terminal, je vois que le mixin fonctionne: jQuery.mage.modal.closeModalme donnefunction() { return false; }
7ochem
1
@ 7ochem return false;n'est peut - être pas suffisant. Pour être honnête, je ne suis pas très à l'aise avec JS. Je pense que vous devriez lire cet article, il peut vous aider à affiner le problème ou à trouver une autre façon de le faire: alanstorm.com/the-curious-case-of-magento-2-mixins
Raphael at Digital Pianism
3
Je suppose que cela remplace également la closeModal()fonction à l'échelle du site, ce que je ne veux pas. Je veux seulement l'appliquer à ce modal unique
7ochem