טופס המשוב של ביטריקס שלך נפתח ב-BX.PopupWindow הסטנדרטי? כשמנסים להוסיף לוגיקה מרובת-שלבים או העלאות תמונות אסינכרוניות, מהר מאוד נתקלים במגבלות של הרינדור המובנה — ה-DOM נוצר מחדש בכל פתיחה, אירועים לא עוברים בירושה, והדיבאג הופך למשימה. מפתחים לעתים קרובות מנסים להרחיב את BX.PopupWindow באמצעות מניפולציות DOM של jQuery, אבל זה מוביל לקוד שביר ולקונפליקטים עם מטמון רכיבים.
אנחנו מומחים בפיתוח חלונות קופצים לביטריקס, עם ניסיון של למעלה מ-35 פרויקטים של חלונות מודאליים מותאמים אישית. הניסיון הרב שלנו והמתודולוגיה המוכחת מבטיחים חלונות מודאליים אמינים ובעלי ביצועים גבוהים העונים על צרכי העסק שלך. אנחנו מעדיפים גישה אחרת: אפליקציית Vue מבודדת שמותקנת בנקודת הקריאה ומנהלת את כל המצבים באופן ריאקטיבי. הניסיון המצטבר שלנו — למעלה מ-30 פרויקטים המשלבים Vue.js בביטריקס — מטפסים פשוטים ועד עגלות קניות מורכבות מרובות-שלבים. גישה זו מקצרת את זמן הפיתוח ב-40% ומפשטת את התחזוקה. הגישה שלנו מבטיחה חלונות מודאליים מותאמים אישית עם רכיבי Vue 3, טפסים ריאקטיביים ופיתוח חלונות קופצים שניתן להרחיב. הורדנו עלויות בעד 50% בהשוואה לשיטות jQuery המסורתיות.
כיצד פועלת הארכיטקטורה של חלון מודאלי Vue.js בביטריקס
האינטגרציה נבנית דרך נקודת הרכבה בתבנית הרכיב. במקום אתחול גלובלי של האפליקציה, אנחנו מרכיבים מופע מבודד על אלמנט ספציפי:
// local/templates/main/components/project/modal-form/template.php
<div id="vue-modal-root" data-form-id="<?= $arResult['FORM_ID'] ?>" data-endpoint="<?= $arResult['AJAX_URL'] ?>">
</div>
<script>
BX.ready(function() {
const { createApp } = Vue;
const app = createApp(ModalApp, {
formId: document.getElementById('vue-modal-root').dataset.formId,
endpoint: document.getElementById('vue-modal-root').dataset.ajaxEndpoint
});
app.mount('#vue-modal-root');
});
</script>נתונים מביטריקס מועברים דרך מאפייני data-* או דרך האובייקט הגלובלי window.BX_STATE שנוצר ב-result_modifier.php. אינטרפולציה ישירה של PHP בקוד JS אסורה — היא שוברת את מטמון הרכיבים. המבנה של רכיב המודאל של Vue כולל:
- ModalWrapper.vue — מעטפת עם שכבת-על, מנהלת z-index, חסימת גלילה, טיפול במקש Escape
- ModalContent.vue — slot לתוכן, אנימציות כניסה/יציאה באמצעות Transition
- ModalTrigger.vue — כפתור טריגר, פולט אירוע פתיחה באמצעות provide/inject או Pinia store
כדי לנהל את המצב של מספר מודאלים בעמוד אחד, אנחנו משתמשים ב-useModalStore על Pinia — מחסנית של מודאלים פתוחים כך שסגירת העליון לא סוגרת את זה שמתחתיו.
למה Vue.js עדיף על jQuery לחלונות מודאליים בביטריקס?
השוואה של פרמטרים מרכזיים:
| פרמטר | BX.PopupWindow + jQuery | Vue.js |
|---|---|---|
| מצב ריאקטיבי | לא (ידני דרך DOM) | כן (data, computed) |
| ולידציה של טפסים | ספרייה חיצונית | VeeValidate או computed |
| אנימציות | מחלקות CSS ידניות | Transition |
| מטמון רכיבים | עובד גרוע | עובד כרגיל (בידוד) |
| זמן פיתוח לטופס | 3-5 ימים | 1-2 ימים |
עברנו מ-jQuery ל-Vue בעשרות פרויקטים — ההבדל בביצועים ובזמן התחזוקה ברור.
אילו תרחישים טיפוסיים אנחנו פותרים?
טופס משוב עם ולידציה. השדות מאומתים באופן ריאקטיבי באמצעות VeeValidate. לאחר השליחה, נשלחת בקשת AJAX למטפל של ביטריקס דרך bitrix:form.result.new. התגובה מעובדת ברכיב — ללא טעינת עמוד מחדש.
עגלת קניות מודאלית. כשמשתמש מוסיף מוצר, המודאל מציג את מצב העגלה הנוכחי. הנתונים נשלפים דרך REST API של ביטריקס: /api/v1/sale/basket/ או בקר AJAX מותאם אישית על Bitrix\Main\Engine\Controller. הכמות מתעדכנת באופן ריאקטיבי.
גלריית תמונות / lightbox. רכיב ה-Vue מקבל מערך תמונות דרך מאפיין data-images או JSON שנטען מראש. אנחנו משתמשים במחוות החלקה באמצעות ספריית vue-use/useSwipe ובניווט מקלדת באמצעות onKeydown.
טפסים מרובי-שלבים. השלבים הם רכיבי Vue נפרדים, המצב נשמר ב-setup() של רכיב האב. פס התקדמות מגיב לשלב הנוכחי. כל הנתונים מצטברים ונשלחים בבקשה אחת בשלב האחרון.
מקרה מהפרקטיקה שלנו: טופס הגשת מועמדות מודאלי בעמוד קידום
אתר קידום ללקוח אחד: מספר כפתורי CTA בעמוד, כל אחד פותח את אותו טופס אבל עם utm_source שונה ושדה מלא מראש "איך שמעת עלינו?". הפתרון הסטנדרטי באמצעות BX.PopupWindow היה דורש מניפולציות DOM של JS בכל פתיחה. עשינו את זה אחרת: נקודת הרכבה אחת ב-

