จะสร้างป็อปอัพ Magento 2 Modal ที่ไม่สามารถปิดได้อย่างไร


10

ฉันกำลังพยายามสร้างป๊อปอัปที่ไม่สามารถปิดได้ มีปุ่มที่จะนำคุณไปยังหน้าถัดไปโดยคลิกที่ปุ่มนี้ แต่ฉันไม่ต้องการให้ผู้ใช้ปิดได้

ป๊อปอัป modal สามารถปิดได้ 3 วิธี:

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

UPDATE:

ฉันยังพยายามเซ็ตอัพ modal ในวิธีที่ต่างกันเมื่อลองใช้โซลูชันที่ให้มา:

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

1
4. ใช้เครื่องมือนักพัฒนาซอฟต์แวร์เพื่อลบคำกริยาที่แทรกไว้ออกจาก DOM
Kristof ที่ Fooman

@KristofatFooman, ฮ่าฮ่าฮ่าโอเคฉันจะเพิ่มข้อความโมดอล: "กรุณากด F12 ตรวจสอบคำกริยานี้และลบออกจาก DOM เพื่อปิด" ฉันคิดว่าคุณพูดถูกและน่าสนใจ แต่ฉันจะยอมรับความเสี่ยงนั้นและไม่ใช้มาตรการใด ๆ เพื่อป้องกันสิ่งนั้น
7ochem

คำตอบ:


10

ฉันไม่สามารถแทนที่modal.closeModal()ฟังก์ชั่นการทำงานผ่านทาง mixins และฉันคิดว่าการทำมันผ่านทาง mixin ทำให้มันแทนที่ผ่านเว็บไซต์ทั้งหมดในทุก modals ซึ่งฉันไม่ต้องการ ฉันต้องการมันเพียงหนึ่งใน modal นี้

ฉันสิ้นสุดขึ้นโดยเพียงแค่การเอาทริกเกอร์ใด ๆ modal.closeModal()ที่จะเรียก มีตัวเลือก modal อื่น ๆ ที่คุณสามารถใช้เพื่อให้บรรลุ:

  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"));
    }
);

1
งานที่ดีมันเป็นวิธีที่ถูกต้องแน่นอน
Raphael at 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;
    };
});

ด้วย mixin นี้คุณแทนที่การใช้งานของcloseModalวิธีด้วยวิธีของคุณเอง ในกรณีนั้นการคืนค่า false จะหลีกเลี่ยงการปิดคำกริยา

หมายเหตุด้านข้าง: ฉันเกลียดคุณที่ทำสิ่งนี้ ควรห้ามป๊อปอัปที่ไม่สามารถเปิดเว็บได้


3
ฉันทำอย่างนั้น แต่ก็ยังปิดอยู่ ถ้าฉันใช้สิ่งนี้ในเทอร์มินัลของฉันฉันเห็นว่า mixin IS ทำงาน: jQuery.mage.modal.closeModalให้ฉันfunction() { return false; }
7ochem

1
@ 7ochem อาจreturn false;ไม่เพียงพอ ฉันไม่สบายใจกับ JS ที่จะซื่อสัตย์ ฉันคิดว่าคุณควรอ่านบทความนี้มันอาจช่วยให้คุณ จำกัด ปัญหาหรือหาวิธีที่เป็นไปได้ในการทำเช่นนี้: alanstorm.com/the-curious-case-of-magento-2-mixins
Raphael ที่ Digital Pianism

3
ฉันเดาว่ามันจะแทนที่closeModal()ฟังก์ชั่นไวด์ไซต์ซึ่งฉันไม่ต้องการ ฉันต้องการใช้สิ่งนี้กับคำกริยาเดี่ยวนี้
7ochem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.