Wie erstelle ich ein Magento 2 Modal-Popup, das nicht geschlossen werden kann?

10

Ich versuche ein modales Popup zu erstellen, das nicht geschlossen werden kann. Es hat eine Schaltfläche, mit der Sie durch Klicken auf die nächste Seite gelangen, aber ich möchte nicht, dass Benutzer sie schließen können.

Das modale Popup kann auf drei Arten geschlossen werden:

  1. Klicken Sie auf das Kreuz / die [X]Schaltfläche in der oberen rechten Ecke
  2. Escape drücken
  3. Klicken Sie auf die Überlagerung

Bisher ist dies mein modaler JS und ich denke, clickableOverlay: falseich habe bereits den dritten in Angriff genommen:

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

AKTUALISIEREN:

Ich habe auch versucht, das Modal anders einzurichten, als ich die bereitgestellten Lösungen ausprobiert habe:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);
7ochem
quelle
1
4. Entfernen Sie mit einem Entwicklertool das eingefügte Modal aus dem DOM
Kristof am 4.
@KristofatFooman, hahaha, Ok, ich werde dem Modaltext hinzufügen: "Bitte drücken Sie F12, überprüfen Sie dieses Modal und entfernen Sie es aus dem DOM, um es zu schließen." Ich denke, Sie haben Recht, ziemlich interessant, aber ich werde dieses Risiko akzeptieren und keine Maßnahmen ergreifen, um dieses zu verhindern.
7ochem

Antworten:

10

Ich konnte keine Überschreibung der modal.closeModal()Funktion über Mixins erhalten, und ich denke auch, dass eine Überschreibung der Funktion die gesamte Website auf allen Modals überschreibt, was ich nicht möchte. Ich brauche es nur auf diesem einen Modal.

Am Ende entfernte ich einfach jeden Auslöser, der aufruft modal.closeModal(). Es gibt einige andere modale Optionen, mit denen Sie dies erreichen können:

  1. Ich verstecke die Schaltfläche zum Schließen beim Öffnen des Modals mit der openedOption / dem Ereignis, die bzw. das direkt nach dem Öffnen des Modals ausgelöst wird
  2. Ich überschreibe die keyEventHandlers.escapeKeyOption

Das ist also mein letzter Code:

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
quelle
1
Gute Arbeit, es ist definitiv der richtige Weg
Raphael bei Digital Pianism
7

Ich halte die Verwendung von Mixins in diesem Fall für relevant.

Sie können Folgendes versuchen:

Erstellen Sie zunächst in Ihrem Modul Folgendes view/base/requirejs-config.js:

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

Dann erstellen Sie view/base/web/hook.js:

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

Mit diesem Mixin ersetzen Sie die Implementierung der closeModalMethode durch Ihre eigene Methode. In diesem Fall würde das Zurückgeben von false das Schließen des Modals vermeiden.

Randnotiz: Ich hasse dich dafür. Nicht verschließbare Popups sollten aus dem Internet verbannt werden.

Raphael beim digitalen Pianismus
quelle
3
Ich habe genau das getan, aber es schließt immer noch. Wenn ich dies in meinem Terminal laufen jQuery.mage.modal.closeModalfunction() { return false; }
lasse
1
@ 7ochem ist vielleicht return false;nicht genug. Ich fühle mich mit JS nicht besonders wohl, um ehrlich zu sein. Ich denke, Sie sollten diesen Artikel lesen, er kann Ihnen helfen, das Problem einzugrenzen
Raphael at Digital Pianism
3
Ich denke, dies ersetzt auch die closeModal()Funktion Site-weit, die ich nicht möchte. Ich möchte dies nur auf dieses einzelne Modal
anwenden