Как создать модальное всплывающее окно Magento 2, которое нельзя закрыть?

10

Я пытаюсь создать модальное всплывающее окно, которое не может быть закрыто. У него есть кнопка, по которой вы переходите на следующую страницу, но я не хочу, чтобы пользователи могли ее закрывать.

Модальное всплывающее окно можно закрыть тремя способами:

  1. Нажав на крестик / [X]кнопку в правом верхнем углу
  2. Нажатие побега
  3. Нажмите на оверлей

Пока что это мой модальный JS, и я думаю, clickableOverlay: falseчто уже занялся третьим:

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

ОБНОВИТЬ:

Я также пытался настроить модал по-другому, когда пробовал предоставленные решения:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);
7ochem
источник
1
4. Используйте инструмент разработчика, чтобы удалить вставленный модал из DOM
Кристоф на Fooman
@KristofatFooman, хахаха, хорошо, я добавлю к модальному тексту: «Пожалуйста, нажмите F12, осмотрите этот модал и удалите его из DOM, чтобы закрыть его». Я думаю, что вы правы, довольно интересный, но я приму этот риск и не предприму никаких мер, чтобы предотвратить этот.
7очг

Ответы:

10

Я не мог заставить переопределение modal.closeModal()функции работать через миксины, и я также думаю, что при использовании миксина она переопределяет весь веб-сайт на всех модальных моделях, что мне не нужно. Мне нужно только это на этом модале.

В итоге я просто удалил любой триггер, который будет вызывать modal.closeModal(). Есть несколько других модальных опций, которые вы можете использовать для достижения этой цели:

  1. Я скрываю кнопку закрытия при открытии модала с openedпараметром / событием, которое будет запущено сразу после открытия модала
  2. Я переопределяю keyEventHandlers.escapeKeyвариант

Итак, это мой последний код:

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
источник
1
Хорошая работа, это определенно верный способ сделать это
Рафаэль на Digital Pianism
7

Я считаю, что использование миксинов в этом случае будет уместным.

Вы можете попробовать следующее:

Сначала в вашем модуле создайте следующее view/base/requirejs-config.js:

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

Затем создайте view/base/web/hook.js:

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

С этим миксином вы заменяете реализацию closeModalметода своим собственным методом. В этом случае возвращение false позволит избежать закрытия модального режима.

Примечание: я ненавижу тебя за это. Не закрываемые всплывающие окна должны быть запрещены в Интернете.

Рафаэль в цифровом пианизме
источник
3
Я сделал именно это, но все равно он закрывается. Если я запускаю это в своем терминале, я вижу, что миксин работает: jQuery.mage.modal.closeModalдает мнеfunction() { return false; }
7ochem
1
@ 7очем может return false;и не достаточно. Честно говоря, я не очень вежлив с JS. Я считаю, что вы должны прочитать эту статью, это может помочь вам сузить проблему или найти другой возможный способ сделать это: alanstorm.com/the-curious-case-of-magento-2-mixins
Рафаэль в Digital Pianism
3
Я думаю, это также заменяет closeModal()функцию сайта в целом, что я не хочу. Я только хочу применить это к этому единственному
модалу