scroll
חוויית העלאת קבצים משופרת עבור טפסי JetFormBuilder

חוויית העלאת קבצים משופרת עבור טפסי JetFormBuilder

שדרגו את שדה העלאת הקבצים בטופסי JetFormBuilder עם עיצוב מודרני, כפתורים אינטראקטיביים, בדיקת מגבלות קובץ ותוויות חכמות – קוד מוכן מתוך ערוץ YouTube של Heske Agency dev.
חוויית העלאת קבצים משופרת עבור טפסי JetFormBuilder

הקרדיט המלא לקוד הוא לערוץ היוטיוב Heske Agency dev ממליץ בחום לבדוק את הערוץ שלהם – יש שם טיפים מעולים למפתחים שעובדים עם JetEngine ו־JetFormBuilder.

Full credit for the code goes to the YouTube channel Heske Agency dev. I highly recommend checking out their channel – there are great tips there for developers working with JetEngine and JetFormBuilder.

אם אתם משתמשים בטפסי JetFormBuilder, אתם בטח יודעים שהשדה להעלאת קבצים עושה את העבודה – אבל העיצוב הבסיסי שלו? לא בדיוק מרגש.

רציתי שדה העלאה שנראה טוב, מתנהג כמו שצריך, ומרגיש חלק מחוויית המשתמש של האתר – אז התחלתי לחפש פתרון.

ואז מצאתי בדיוק את מה שחיפשתי בערוץ YouTube של Heske Agency dev – פתרון מעוצב, מוכן לעבודה, שמשדרג משמעותית את המראה וההתנהגות של שדה ההעלאה, בלי תוספים ובלי מאמץ.

מה הקוד עושה?

הקוד משלב CSS ליצירת מראה נקי ומודרני, עם JavaScript שמוסיף אינטראקטיביות והתנהגות חכמה:

  • עיצוב חדש עם מסגרת מקווקוות, רקע לבן, ריווחים נכונים ופינות מעוגלות.
  • כפתור העלאה ברור, מעוצב בצבע בולט עם אפקטים.
  • תווית שמציגה כמה קבצים הועלו בפועל.
  • בדיקת מגבלות קובץ: לא יותר מ־2 קבצים, ולא יותר מ־2 מגה לקובץ.
  • אפקטים של מעבר, התאפסות לאחר שליחה מוצלחת של הטופס.
  • התאמה מלאה גם לנייד.

הכול מבוסס על קוד HTML שאפשר להדביק ישירות בתוך ווידג’ט HTML בעמוד שמציג את הטופס שלכם. או דרך נוספת אם יש לכם כמה סוגי טפסים באתר, פשוט להתקין את תוסף WP Code ושם להכניס את הקוד והוא ישפיע על כל האתר ועל כל הטפסים שיש לכם.

<style>
    /* עיצוב מותאם לשדה העלאת קבצים */
    .jet-form-builder__field-wrap.jet-form-builder-file-upload {
        background: #ffffff !important;
        border: 1px dashed #D3D3D3 !important;
        padding: 20px !important;
        text-align: center;
        position: relative;
        margin-bottom: 20px;
        display: flex;
        flex-direction: column;
        align-items: center;
        border-radius: 10px !important;
    }
    
    /* עיצוב לתמונה שהועלתה */
    .jet-form-builder-file-upload__file img {
        display: block;
        width: 100%;
        height: 100% !important;
        padding: 0;
        margin: 0;
        -o-object-fit: cover;
        object-fit: cover;
        -o-object-position: center center;
        object-position: center center;
        border-radius: 6px !important;
        box-shadow: 0 0 30px -8px rgba(0, 0, 0, 0.24) !important;
    }
    
    /* עיצוב לאזור התוכן של הקובץ */
    .jet-form-builder-file-upload__content {
        min-height: auto !important;
    }
    
    /* עיצוב לכפתור "בחר קובץ" ולתווית מצב העלאה */
    .addfile {
        padding: 10px 20px;
        background-color: #DF2537 !important;
        color: #ffffff !important;
        border: none !important;
        font-size: 16px;
        font-weight: 600;
        cursor: pointer;
        border-radius: 6px;
        margin-top: 10px;
        transition: opacity 0.3s ease, transform 0.3s ease;
    }
    
    .addfile:hover {
        background-color: #000000 !important;
        color: #ffffff !important;
    }
    
    /* תווית מצב העלאה */
    .labeladdfile {
        padding: 6px 12px;
        background-color: transparent;
        color: #000000 !important;
        font-size: 12px;
        font-weight: 400;
        display: block;
        margin-top: 10px;
        border-radius: 6px;
        transition: opacity 0.3s ease, transform 0.3s ease;
    }
    
    /* עיצוב בעת שיש קבצים */
    .files-uploaded {
        background-color: #09b872 !important; 
        padding: 6px 12px;
        color: #ffffff !important;
        border-radius: 6px;
    }
    
    /* הסתרת קלט הקובץ */
    .jet-form-builder-file-upload__input {
        display: none;
    }
    
    /* התאמה למסכים קטנים */
    @media (max-width: 767px), (max-width: 1024px) {
        .addfile, .labeladdfile {
            padding: 8px 16px;
            font-size: 12px;
        }
    }
    </style>
    
    <script>
    document.addEventListener('DOMContentLoaded', function() {
        const { addAction } = window.JetPlugins.hooks;
    
        addAction('jet.fb.input.makeReactive', 'set-upload-labels', function(input) {
            if (!input?.nodes?.length || !input.nodes[0].classList.contains('jet-form-builder-file-upload__input')) {
                return;
            }
    
            const $ = jQuery;
            const upload = $(input.nodes[0]);
            const fields = $(input.nodes[0].closest('.jet-form-builder-file-upload__fields'));
    
            if (!fields.find('.addfile').length) {
                fields.append(`<input type="button" class="addfile" value="בחירת קובץ"/>`);
                fields.append(`<div class="labeladdfile">בחירת קובץ</div>`);
            }
    
            const labelAdd = fields.find('.labeladdfile');
            const buttonAdd = fields.find('.addfile');
    
            upload.css('display', 'none');
    
            buttonAdd.click(function() {
                upload.trigger('click');
            });
    
            function updateFileLabel() {
                const fileCount = upload[0].files.length;
                if (fileCount > 0) {
                    buttonAdd.val('קובץ הועלה');
                    labelAdd.html(`הועלו (${fileCount}) קבצים`);
                    labelAdd.addClass('files-uploaded');
                    buttonAdd.css({ opacity: 1, transform: 'scale(1)' });
                    labelAdd.css({ opacity: 1, transform: 'scale(1)' });
                } else {
                    resetFileLabel();
                }
            }
    
            function resetFileLabel() {
                buttonAdd.css({ opacity: 0, transform: 'scale(0.9)' });
                labelAdd.css({ opacity: 0, transform: 'scale(0.9)' });
    
                setTimeout(() => {
                    buttonAdd.val('בחירת קובץ');
                    labelAdd.html('בחירת קובץ');
                    labelAdd.removeClass('files-uploaded');
                    buttonAdd.css({ opacity: 1, transform: 'scale(1)' });
                    labelAdd.css({ opacity: 1, transform: 'scale(1)' });
                    $('.jet-form-builder-file-upload__file').remove();
                }, 300);
            }
    
            upload.on('change', updateFileLabel);
    
            // כפתור הסרה של קובץ
            $(document).on('click', '.jet-form-builder-file-upload__file-remove', function() {
                setTimeout(() => {
                    if ($('.jet-form-builder-file-upload__file').length === 0) {
                        resetFileLabel();
                    }
                    if ($('.jet-form-builder-file-upload__file').length > 0) {
                        buttonAdd.val('קובץ הועלה');
                        labelAdd.html(`הועלו (${ $('.jet-form-builder-file-upload__file').length }) קבצים`);
                        labelAdd.addClass('files-uploaded');
                        buttonAdd.css({ opacity: 1, transform: 'scale(1)' });
                        labelAdd.css({ opacity: 1, transform: 'scale(1)' });
                    }
                }, 100);
            });
    
            // התנהגות לאחר שליחה מוצלחת של הטופס
            const successMessageObserver = new MutationObserver((mutationsList) => {
                for (let mutation of mutationsList) {
                    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                        const successMessage = $(mutation.addedNodes).find('.jet-form-builder-message--success');
                        if (successMessage.length > 0) {
                            resetFileLabel();
                        }
                    }
                }
            });
    
            const formContainer = $('.jet-form-builder')[0];
            if (formContainer) {
                successMessageObserver.observe(formContainer, { childList: true, subtree: true });
            }
    
            function resetFileInput() {
                upload.val('');
                resetFileLabel();
                input.value.set([]);
            }
    
            /*
             * == בדיקת קבצים לפי מגבלות גודל וכמות ==
             */
            function validateFiles(files) {
                const maxFileSize = 2 * 1024 * 1024; // 2 מגה
                const maxFileCount = 2;              // מקסימום 2 קבצים
                let valid = true;
    
                if (files.length > maxFileCount) {
                    valid = false;
                } else {
                    Array.from(files).forEach(file => {
                        if (file.size > maxFileSize) {
                            valid = false;
                        }
                    });
                }
                return valid;
            }
    
            // הצגת שגיאה אם הקבצים לא תקינים
            function showErrorMessage() {
                const errorMessage = $('.jet-form-builder-row.field-has-error .error-message').text().trim();
                if (errorMessage) {
                    alert(errorMessage);
                    resetFileInput();
                    setTimeout(() => {
                        window.location.reload();
                    }, 700);
                }
            }
    
            // בדיקת תקינות הקבצים בעת בחירה
            upload.on('change', function() {
                const files = upload[0].files;
                if (!validateFiles(files)) {
                    showErrorMessage();
                }
            });
        });
    });
    </script>

הקרדיט המלא לפתרון שייך ל־Heske Agency dev, והסרטון שבו מצאתי את ההסבר המלא נמצא כאן. ממליץ בחום לבדוק את הערוץ שלהם – יש שם טיפים מעולים למפתחים שעובדים עם JetEngine ו־JetFormBuilder.

0 0 votes
דירוג מאמר
Subscribe
Notify of
guest
0 הערות
Inline Feedbacks
View all comments
מדריכים ומאמרים קשורים
eliko.web.studio
איך מאפשרים למשתמשים אורחים להעלות קבצים בטופסי JetFormBuilder? הקוד הרשמי עובד רק לשדה אחד, אבל כשיש יותר – מתחילות הבעיות. במאמר הזה תמצאו קוד משופר לפתרון מלא, כולל תמיכה בכמה שדות מדיה בטופס אחד.
eliko.web.studio
רוצים להוסיף כפתור להעתקת קישור העמוד בלחיצה אחת – בלי תוספים ובלי קוד מסובך? במדריך הזה תלמדו איך לעשות את זה באלמנטור בצורה פשוטה ויעילה.
eliko.web.studio
מניעת העתקת תוכן באתר היא חיונית להגנה על זכויות יוצרים ושיפור אבטחת המידע. במדריך זה, נסביר כיצד ניתן לחסום העתקת טקסט ותמונות באתר באמצעות קוד PHP ו-JavaScript. נלמד כיצד למנוע קליק ימני, חסימת Inspect Element, הגבלת קיצורי מקלדת ועוד – הכל תוך שמירה על חוויית משתמש טובה.
eliko.web.studio
ניתן לשפר את חוויית המשתמש בעמוד התשלום באמצעות התאמת שדות: הסרה, שינוי והוספה. במדריך זה נלמד כיצד ליישם שינויים אלו בקלות בעזרת קוד PHP.
eliko.web.studio
רוצים למנוע ספאם באתר מבלי לפגוע בעיצוב? גלו כיצד להסתיר את סמל Google reCAPTCHA עם קוד CSS פשוט. הפתרון שישאיר את האתר שלכם מוגן ונקי תוך שמירה על עיצוב מושלם.
eliko.web.studio
ב-WooCommerce, כפתור “מעבר לסל הקניות” שמופיע לאחר הוספת מוצר לעגלה בדפי ארכיון יכול לעיתים לפגוע בחוויית המשתמש ובעיצוב האתר

תודה שאישרת את הצעת המחיר!

לא צויין כתובת מייל

סך תשלום ראשון (מקדמה) 30% מסכום העסקה הינו:

בפרוייקטים של עיצוב גרפי או/ו פרוייקטים שלא עולים מעל לסכום של 2000₪, התשלום לא יתחלק לפעימות אלא התשלום יושלם בפעימה ראשונה או יתחלק לשתי פעימות על פי הסיכום בטלפון או בהודעות

העברה בנקאית

בנק – ONE ZERO (18)
סניף – ראשי (001)
חשבון – 202003116
ע"ש – אליהו כהן

תשלום באפליקציות

bit/PayBox
במספר טלפון 0503528688