Como criar um pop-up Magento 2 Modal que não pode ser fechado?

10

Estou tentando criar um pop-up modal que não pode ser fechado. Ele tem um botão que leva você para a próxima página clicando nele, mas não quero que os usuários possam fechá-lo.

O pop-up modal pode ser fechado de três maneiras:

  1. Clicando na cruz / [X]botão no canto superior direito
  2. Pressionando escape
  3. Clique na sobreposição

Até agora, este é o meu JS modal e acho clickableOverlay: falseque já resolvi o terceiro:

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

ATUALIZAR:

Também tentei configurar o modal de uma maneira diferente ao tentar as soluções fornecidas:

require(
    [ 'jquery', 'Magento_Ui/js/modal/modal' ],
    function($, modal) {
        modal({
            //options
        }, $("#popup"));
    }
);
7ochem
fonte
11
4. Use uma ferramenta de desenvolvedor para remover o modal inserido do DOM
Kristof em Fooman
@KristofatFooman, hahaha, ok, vou adicionar ao texto modal: "Por favor, pressione F12, inspecione este modal e remova-o do DOM para fechá-lo". Acho que você tem razão, é bem interessante, mas aceitarei esse risco e não implementarei nenhuma medida para evitá-lo.
7ochem 5/12

Respostas:

10

Eu não consegui uma substituição da modal.closeModal()função para trabalhar através de mixins e também acho que fazê-lo através de um mixin a substitui em todo o site em todos os modais, o que eu não quero. Eu só preciso disso neste modal.

Acabei removendo qualquer gatilho que chamaria modal.closeModal(). Existem algumas outras opções modais que você pode usar para conseguir isso:

  1. Escondo o botão Fechar ao abrir o modal com a openedopção / evento que será acionado logo após a abertura do modal
  2. Estou substituindo a keyEventHandlers.escapeKeyopção

Portanto, este é o meu código 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
fonte
11
Bom trabalho é definitivamente a maneira correta de fazê-lo
Raphael em Digital pianismo
7

Eu acho que usar mixins nesse caso seria relevante.

Você pode tentar o seguinte:

Primeiro no seu módulo, crie o seguinte view/base/requirejs-config.js:

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

Então crie view/base/web/hook.js:

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

Com esse mixin, você substitui a implementação do closeModalmétodo pelo seu próprio método. Nesse caso, retornar false evitaria fechar o modal.

Nota lateral: eu te odeio por fazer isso. Pop-ups não excluídos devem ser banidos da web.

Raphael na Digital Pianism
fonte
3
Eu fiz exatamente isso, mas ainda fecha. Se eu executar isso no meu terminal, vejo que o mixin está funcionando: jQuery.mage.modal.closeModalme dáfunction() { return false; }
7ochem
11
@ 7ochem talvez return false;não seja suficiente. Não sou super à vontade com JS para ser honesto. Eu acho que você deve ler este artigo pode ajudar a diminuir o problema ou encontrar outra maneira possível de fazê-lo: alanstorm.com/the-curious-case-of-magento-2-mixins
Raphael em Digital pianismo
3
Eu acho que isso também substitui todo o closeModal()site da função, o que eu não quero. Eu só quero aplicar isso a este modal único
7ochem 1/16/16