דלגו לתוכן

או התחילו מנקודה בטוחה: אינדקס הכלים המלא · מפת הטבלאות המרכזיות

מערכת חדשה — 14 יום חינם

כלי סכימה — טבלאות ושדות

עודכן 31.08.2026

שלושה כלים מכסים את שכבת הסכימה: אחד קורא (Get-Schema) ושניים כותבים (Create-Table, Add-Field-to-Table). דף, טבלת תצוגה, דוח או חוק טופס מפנים לשמות שדות שחייבים להתקיים בסכימה לפני שמזכירים אותם; שדה שלא קיים אינו נכשל בקול, הוא פשוט לא מופיע.

מחזיר את מבנה הטבלאות והשדות. בלי className — כל הטבלאות; עם className — טבלה אחת.

הפרמטר טיפוס חובה המשמעות
className String שם המחלקה. בלי הפרמטר מוחזרת הסכימה של כל הטבלאות
tablesNameOnly Boolean true = רק שמות הטבלאות, בלי השדות
JSON
// טבלה אחת — זו הקריאה שתעשו בפועל
{ "className": "Accounts" }
// רק שמות הטבלאות — מיפוי מהיר של מערכת חדשה
{ "tablesNameOnly": true }

התשובה היא אובייקט שמפתחו שם המחלקה: { "Accounts": { "Name": "String", "StatusId": { "type": "Pointer", "targetClass": "AccountStatuses", "dictionary": "סטטוס" }, … } }. שדה פשוט מיוצג במחרוזת הטיפוס; שדה Pointer באובייקט עם type ו‑targetClass. שדה עם תווית נושא גם dictionary: התווית בעברית שנשמרה לו בטבלת _Dictionary (שם הטבלה ב‑tblName, השדה ב‑field, התווית ב‑value), וזו התווית שהמשתמש רואה בדפים ובבורר העמודות.

השדות שכל רשומה מקבלת אוטומטית, בכל טבלה: objectId (10 תווים), createdAt, updatedAt, createdBy (Pointer ל‑_User), updatedBy (Pointer ל‑_User) ו‑ACL.

הטריגרים אינם חלק מתשובת Get-Schema; גם לטבלה בודדת חוזרים השדות בלבד. את הגדרות האוטומציה קוראים ב‑Get-Triggers.

ה‑enum של הסכימה החיה, בשני כלי הכתיבה, מכיל עשרה טיפוסים בדיוק:

הטיפוס איך זה נראה בטופס מתי משתמשים
String <input type="text"> שמות, טקסט חופשי
Number <input type="number"> סכומים, דירוגים. סכום/ממוצע/מינימום/מקסימום בטבלאות ובדוחות עובדים רק על Number
Boolean תיבת סימון דגלים (Active, IsVIP)
Date בורר תאריך דד‑ליינים, אירועים
Array ווידג’ט רב‑ערכי תגיות, בחירה מרובה — ראו מוסכמת השם למטה
Object (אין ווידג’ט סטנדרטי) בלוקים מובנים. הימנעו בשדות שמשתמש נוגע בהם
Pointer <select class="select-pointer"> כל רשימה נפתחת וכל קשר בין טבלאות
File ווידג’ט העלאה קובץ ציבורי
PrivateFile ווידג’ט העלאה קובץ שדורש הרשאה להורדה
GeoPoint — מיקום. כמעט לא בשימוש במודולי ה‑CRM
  • שם שדה: /^[A-Za-z][A-Za-z0-9_]*$/, CamelCase — PhoneNumber, ContractEndDate.
  • שדה Pointer מסתיים ב‑Id — StatusId, OwnerId, AccountId. זו מוסכמת מוצר ולא דרישת שרת, וכל התיעוד וכל הכלים מניחים אותה.
  • שם טבלה: אותו regex, PascalCase, ברבים — Projects, SaleRows, ProjectStatuses.
  • שדה Array של Pointers: השם קובע את סוג הפריטים. המוסכמה שקוד הריצה מזהה היא array_<purpose>_Pointer_<TargetTable> — למשל array_languages_Pointer_Languages — והיא מרנדרת <select multiple> אמיתי בלי שורת JS אחת. תיאור הכלי מדגים גם את הצורה SalesId_Pointer_Sales. שדה Array בלי מוסכמת השם מתנהג כמערך אטום, בלי ווידג’ט.

יוצר טבלה חדשה. שדה Name מסוג String נוסף אוטומטית — אל תגדירו אותו שוב.

הפרמטר טיפוס חובה המשמעות
name String ✔ שם הטבלה. /^[A-Za-z][A-Za-z0-9_]*$/
fields Array<Object> מערך שדות. בלי הפרמטר — הטבלה נוצרת עם Name בלבד

אובייקט השדה (זהה בשני כלי הכתיבה):

המפתח טיפוס חובה המשמעות
name String ✔ שם השדה, באותו regex
type Enum ✔ אחד מעשרת הטיפוסים למעלה
label String התווית בעברית — “to put in the html”. זה מה שהמשתמש רואה
targetClass String ל‑Pointer המחלקה שאליה השדה מצביע
JSON
{
"name": "Suppliers",
"fields": [
{ "name": "SupplierCode", "type": "String", "label": "קוד ספק" },
{ "name": "Rating", "type": "Number", "label": "דירוג (1-5)" },
{ "name": "Active", "type": "Boolean", "label": "ספק פעיל" },
{ "name": "JoinDate", "type": "Date", "label": "תאריך הצטרפות" },
{ "name": "StatusId", "type": "Pointer", "targetClass": "SupplierStatuses", "label": "סטטוס" },
{ "name": "AccountId", "type": "Pointer", "targetClass": "Accounts", "label": "לקוח" },
{ "name": "OwnerId", "type": "Pointer", "targetClass": "_User", "label": "אחראי" }
]
}

targetClass אינו נבדק מול הסכימה. Pointer ל‑SupplierStatuses ייווצר גם אם הטבלה עדיין לא קיימת: הכלי יחזיר success, והרשימה הנפתחת תישאר ריקה עד שתיצרו אותה. לכן סדר העבודה מתחיל בטבלאות ה‑lookup.

למה דרך הכלי ולא כתיבת סכימה גולמית

Section titled “למה דרך הכלי ולא כתיבת סכימה גולמית”

אפשר ליצור טבלה גם ב‑POST /parse/schemas/<Class> עם Master Key. זו לא אותה פעולה.

מה שקורה דרך הכלי דרך REST גולמי
הטבלה והשדות נוצרים ✔ ✔
התווית בעברית נכתבת ל‑_Dictionary ✔ (מהפרמטר label) ✖ — השדה יופיע בשמו האנגלי בכל דף ובכל בורר עמודות
הרשאות טבלה (CLP) מוגדרות ✔ ✖ — הטבלה נולדת עם CLP ריק
ACL לרשומות שנוצרות לפי המסלול שיצר את הרשומה ✖ — רשומות שנוצרו ב‑REST נולדות בלי ACL, ומשתמשים מחוברים עלולים לא לראות אותן

שתי השכבות שה‑REST מדלג עליהן הן שכבות מוצר, לא שכבות Parse.

מוסיף שדות לטבלה קיימת, ויודע ליצור טבלת lookup חדשה ולזרוע בה ערכים באותה קריאה.

הפרמטר טיפוס חובה המשמעות
table String ✔ הטבלה שמרחיבים
fields Array<Object> ✔ אותו אובייקט שדה כמו ב‑Create-Table
newTableName String שם טבלת lookup חדשה שתיווצר עבור שדה ה‑Pointer
newTableValues Array<String> ערכי Name לזריעה בטבלה החדשה

הוספה פשוטה:

JSON
{
"table": "Accounts",
"fields": [
{ "name": "Website", "type": "String", "label": "אתר אינטרנט" },
{ "name": "FoundedYear", "type": "Number", "label": "שנת הקמה" }
]
}

דפוס הרשימה הנפתחת בקריאה אחת

Section titled “דפוס הרשימה הנפתחת בקריאה אחת”
JSON
// יוצר את TaskCategories עם 5 רשומות, ומוסיף Tasks.CategoryId שמצביע אליה
{
"table": "Tasks",
"fields": [
{ "name": "CategoryId", "type": "Pointer", "targetClass": "TaskCategories", "label": "קטגוריה" }
],
"newTableName": "TaskCategories",
"newTableValues": ["פיתוח", "תמיכה", "מכירות", "שיווק", "אחר"]
}

targetClass בתוך fields ו‑newTableName חייבים להיות אותו שם. הכלי מבצע כאן שלוש פעולות: יוצר טבלה, זורע בה רשומות, ומחבר אליה שדה Pointer.

כל dropdown ב‑MyBusiness הוא טבלה נפרדת ועוד שדה Pointer, לעולם לא רשימת ערכים סטטית.

  1. טבלת הערכים — רשומה אחת לכל אפשרות; השדה Name הוא הטקסט המוצג. שדות נוספים מקובלים: Color (מחרוזת hex, לתגיות סטטוס ולעיצוב מותנה), Order (Number, למיון) ו‑Active (Boolean).
  2. שדה ה‑Pointer על הטבלה הראשית — SaleStatusId שמצביע ל‑SaleStatuses.
  • הוספה, שינוי שם או סידור מחדש של אפשרויות = עריכת רשומות בטבלת הערכים. רשומות קיימות ממשיכות להצביע לאותו objectId, ולכן שינוי שם של אפשרות לא שובר היסטוריה.
  • ערך Pointer בפעולת נתונים הוא תמיד האובייקט המלא: {"__type":"Pointer","className":"SaleStatuses","objectId":"zrP1MSVBoq"}. ראו סוגי נתונים.
  • ב‑targetClass של משתמש הערך הוא _User, ושדות ה‑_User הם באותיות קטנות: name, email, phone.
  • רשימות נפתחות מדורגות (סוג ← תת‑סוג) אינן נבנות בחוקי טופס אלא במנגנון האב/בן המובנה — subclassDepend ב‑Edit-Page.
הפעולה MCP ממשק הניהול REST עם Master Key
הוספת שדה ✔ Add-Field-to-Table ✔ ✔ PUT /parse/schemas/<Class>
שינוי שם שדה ✖ ✖ ✖ — מגבלת Parse. הפתרון: שדה חדש + העברת נתונים
שינוי טיפוס שדה ✖ ✖ ✖ — אותה מגבלה
מחיקת שדה ✖ ✔ ✔ {"fields":{"FieldName":{"__op":"Delete"}}} — מוחק את העמודה ואת הנתונים
מחיקת טבלה ✖ ✔ ✔ DELETE /parse/schemas/<Class> (רק כשהיא ריקה)
עדכון התווית ב‑_Dictionary ✖ — ה‑label נכתב פעם אחת, ביצירה ✔ —
הסרת שדה מדף (נשאר ב‑DB) ✔ Edit-Page ✔ —

שינויי סכימה הם גלובליים ומיידיים. אין מחזור טיוטה/פרסום בשכבת הנתונים, בניגוד לדפים שיש להם גרסאות.

  1. Get-Schema על הטבלאות הקשורות — לאמת יעדי Pointer ולמנוע התנגשות שמות.
  2. טבלאות lookup קודם (<Entity>Statuses עם Name ו‑Color), אחר כך הטבלה הראשית, ואז טבלאות הבן — כל בן מקבל Pointer חזרה לאב.
  3. label בעברית על כל שדה בזמן היצירה — זה הרגע הזול היחיד.
  4. Set-Table-Permissions — CLP מבוסס תפקידים על כל טבלה חדשה.
  5. זריעת ערכי ה‑lookup (Create-Many) לפני שבונים דפים.
  6. אימות: Get-Schema על הטבלה החדשה מראה את השדות; Get-Table-Permissions (הפרמטר שלו הוא table, לא tableName) מראה מפתחות role:; Count-Data מחזיר את הרשומות שנזרעו.

ומכאן לדפים: Create-Form-Page ← Edit-Page ← Create-Table-View-Page ← חוקי טופס.