Làm cách nào để tạo cửa sổ bật lên Magento 2 Modal không thể đóng?


10

Tôi đang cố gắng tạo một cửa sổ bật lên phương thức không thể đóng được. Nó có một nút đưa bạn đến trang tiếp theo bằng cách nhấp vào nó, nhưng tôi không muốn người dùng có thể đóng nó.

Cửa sổ bật lên phương thức có thể được đóng theo 3 cách:

  1. Nhấp vào nút chéo / [X]ở góc trên bên phải
  2. Nhấn thoát
  3. Nhấp vào lớp phủ

Cho đến nay, đây là JS phương thức của tôi và tôi nghĩ rằng clickableOverlay: falsetôi đã giải quyết cái thứ ba:

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

CẬP NHẬT:

Tôi cũng đã cố gắng thiết lập phương thức theo một cách khác khi thử các giải pháp được cung cấp:

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

1
4. Sử dụng công cụ dành cho nhà phát triển để xóa phương thức đã chèn khỏi DOM
Kristof tại Fooman

@KristofatFooman, hahaha, Ok, tôi sẽ thêm vào văn bản phương thức: "Vui lòng nhấn F12, kiểm tra phương thức này và xóa nó khỏi DOM để đóng nó". Tôi nghĩ bạn đúng, khá thú vị, nhưng tôi sẽ chấp nhận rủi ro đó và không thực hiện bất kỳ biện pháp nào để ngăn chặn điều đó.
7ochem

Câu trả lời:


10

Tôi không thể ghi đè modal.closeModal()chức năng để hoạt động thông qua mixin và tôi cũng nghĩ rằng việc thực hiện thông qua mixin sẽ khiến nó ghi đè lên toàn bộ trang web trên tất cả các phương thức mà tôi không muốn. Tôi chỉ cần nó trên một phương thức này.

Tôi đã kết thúc bằng cách đơn giản loại bỏ bất kỳ kích hoạt sẽ gọi modal.closeModal(). Có một số tùy chọn phương thức khác mà bạn có thể sử dụng để đạt được điều đó:

  1. Tôi ẩn nút đóng khi mở phương thức với openedtùy chọn / sự kiện sẽ được kích hoạt ngay sau khi phương thức được mở
  2. Tôi đang ghi đè keyEventHandlers.escapeKeytùy chọn

Vì vậy, đây là mã cuối cùng của tôi:

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
Làm tốt lắm, đó chắc chắn là cách làm đúng đắn
Raphael tại Digital Pianism

7

Tôi nghĩ rằng sử dụng mixins trong trường hợp đó sẽ có liên quan.

Bạn có thể thử như sau:

Đầu tiên trong mô-đun của bạn, tạo như sau view/base/requirejs-config.js:

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

Sau đó tạo view/base/web/hook.js:

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

Với mixin này, bạn thay thế việc thực hiện closeModalphương thức bằng phương thức của riêng bạn. Trong trường hợp đó, trả về false sẽ tránh đóng phương thức.

Lưu ý bên: Tôi ghét bạn vì đã làm điều này. Các cửa sổ bật lên không thể xóa được nên bị cấm trên web.


3
Tôi đã làm chính xác điều đó, nhưng nó vẫn đóng cửa. Nếu tôi chạy cái này trong thiết bị đầu cuối của mình, tôi thấy rằng mixin IS đang hoạt động: jQuery.mage.modal.closeModalmang lại cho tôifunction() { return false; }
7ochem

1
@ 7ochem có lẽ return false;là không đủ. Thành thật mà nói, tôi không thoải mái lắm với JS. Tôi nghĩ bạn nên đọc bài viết này, nó có thể giúp bạn thu hẹp vấn đề hoặc tìm một cách khác có thể thực hiện: alanstorm.com/the-cantly-case-of-magento-2-mixins
Raphael tại Digital Pianism

3
Tôi đoán điều này cũng thay thế closeModal()trang web chức năng rộng, mà tôi không muốn. Tôi chỉ muốn áp dụng điều này cho phương thức duy nhất này
7ochem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.