יישמנו הוקס מותאמים אישית עבור Payload CMS ביותר מ-20 פרויקטים: מחנויות מסחר אלקטרוני ועד פורטלים ארגוניים. ולידטורים סטנדרטיים נכשלים כאשר בודקים מלאי דרך API חיצוני, יוצרים מספרי הזמנה ייחודיים, או שולחים התראות לטלגרם.
בפרויקט אחד, נדרשנו לחשב הנחה על סמך היסטוריית רכישות — דבר שדרש הוק beforeChange מורכב ששאל טבלה נפרדת. ללא הוק מותאם אישית, היינו צריכים לשנות את ליבת ה-CMS, דבר שאינו מקובל. התוצאה: ההנחה מחושבת תוך 200 אלפיות השנייה במקום 5 שניות באופן ידני.
הוקס מותאמים אישית משתלבים במחזור החיים של המסמך ללא שינוי קוד המקור של Payload. במשך יותר מ-5 שנים, כתבנו עשרות פתרונות כאלה, כל אחד דורש הבנה עמוקה של מחזור החיים של אוסף. בממוצע, הוק אחד חוסך 3–4 שעות עבודה ידנית בשבוע. כל הוק מוקלד בקפדנות ב-TypeScript ומכוסה בבדיקות.
כיצד הוקס מותאמים אישית פותרים משימות לוגיקה עסקית?
הוקס של Payload פועלים בשלבים שונים: beforeChange, afterChange, beforeRead, afterRead, beforeDelete, afterDelete. כל הוק מקבל נתונים, req ו-context. אנו משתמשים בהקלדת TypeScript קפדנית כדי למנוע שגיאות בזמן קומפילציה.
| סוג הוק | משימה | דוגמת שימוש |
|---|---|---|
beforeChange |
טרנספורמציית נתונים | יצירת orderNumber, הגדרת createdBy |
afterChange |
תופעות לוואי | שליחת אימייל, סנכרון עם CRM, ביטול מטמון |
beforeRead |
אבטחה | סינון נתונים לפי תפקיד משתמש |
afterRead |
העשרה | חישוב סכום ביניים מפריטים, אכלוס נתונים קשורים |
beforeDelete |
הגנה | מניעת מחיקת לקוח עם הזמנות פעילות |
אילו שגיאות טיפוסיות מתרחשות בעת פיתוח הוקס?
שגיאה לא מטופלת ב-beforeChange חוסמת שמירה, בעוד שב-afterChange היא עלולה להוביל לאובדן נתונים. אנו תמיד פועלים לפי התבנית: בהוקס ולידציה — throw new Error, בהוקס תופעות לוואי — רישום לוג + ניסיון חוזר. עבור פעולות ארוכות, אנו מציבים משימות בתור באמצעות Bull או Redis. הוק beforeRead יכול להסתיר שדות רגישים ממשתמשים לא מורשים. לדוגמה, מנהל רואה רק את ההזמנות שלו, בעוד מנהל מערכת רואה את כולן. זה מיושם על ידי סינון על req.user. לאחר afterDelete, אנו יכולים לכתוב לוג לאוסף נפרד לצורך ביקורת.
דוגמה לבדיקת מלאי נכונה:
const validateStock: CollectionBeforeChangeHook = async ({ data, req }) => {
for (const item of data.items) {
const { stock } = await externalApi.checkStock(item.product)
if (stock < item.quantity) {
throw new Error(`Недостаточно товара "${item.name}" на складе`)
}
}
return data
} מקרה בוחן: חנות מסחר אלקטרוני לאלקטרוניקה
נדרשנו ליצור מספרי הזמנה בפורמט ELEC-XXXXX (ללא שנה כדי למנוע התיישנות), לבדוק מלאי דרך API חיצוני, ולשלוח נתונים ל-1C. יישמנו שלושה הוקס:
- beforeChange — יצירת מספר וקריאה ל-API של המחסן. אם המלאי לא מספיק — החזרת שגיאה.
- afterChange — שליחת אימייל ללקוח ויצירת עסקה ב-CRM.
- afterChange — הוספת משימה לתור לסנכרון 1C (באמצעות Bull).
כל ההוקס מוקלדים, משתמשים ב-CollectionConfig. שגיאות מתועדות ב-Sentry. התוצאה: הזמנות מעובדות ללא עיכובים, עבודה ידנית בוטלה, וסנכרון 1C מתרחש כל דקה. הוקס מותאמים אישית פותרים משימות ולידציה פי 3 מהר יותר מהשיטות המובנות של Payload.
כיצד ליישם הוקס מותאמים אישית: שלב אחר שלב
- ניתוח דרישות: תיאור הלוגיקה העסקית, זיהוי השלבים הנדרשים (beforeChange, afterChange וכו').
- עיצוב: עיצוב סכמת נתונים ואינטראקציה עם שירותים חיצוניים.
- פיתוח: כתיבת קוד ההוק עם הקלדה וטיפול בשגיאות.
- בדיקות: כיסוי תרחישים קריטיים בבדיקות יחידה.
- פריסה: פריסה דרך CI/CD עם בדיקות אוטומטיות.
סקירת תהליך
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | יום אחד | מפרט הוק בהתחשב בלוגיקה עסקית |
| פיתוח | 2–3 ימים | קוד הוק עם בדיקות יחידה |
| בדיקות | יום אחד | אימות בסביבת staging |
| פריסה ותיעוד | 0.5 יום | מיזוג ל-main, תיאור כל הוק |
מה כלול בתוצרים
- קוד מקור של ההוקס עם הערות (TypeScript).
- בדיקות לתרחישים קריטיים (כיסוי של 80%+).
- תיעוד: תיאור כל הוק, מטרתו, קלט/פלט.
- גישה למאגר עם היסטוריית commits.
- תמיכה למשך שבועיים לאחר הפריסה.
לוחות זמנים וכיצד להזמין
זמן הפיתוח של הוקס עבור אוסף אחד הוא בין יום ל-3 ימים. העלות מחושבת באופן אישי לאחר ניתוח דרישות. אם אתה צריך ליישם הוקס מותאמים אישית ב-Payload CMS — צור קשר להערכת פרויקט. תאר את המשימה שלך, ואנו נציע פתרון אופטימלי. למידע נוסף על הוקס, ראה תיעוד רשמי של Payload. הזמן פיתוח הוקס מותאמים אישית למשימה שלך — אנו מבטיחים שקיפות ואיכות.







