דלגו לתוכן

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

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

דוגמאות קוד

עודכן 30.08.2026

הצורה זהה בכל שפה: POST של JSON עם שתי כותרות. רק לקוח ה‑HTTP והמרת הנתונים לפורמט השליחה (serialization) משתנים — שמות השדות, הקידומות, טיפוסי הערכים ובדיקות התקינות אינם תלויי שפה.

העמוד הזה הוא השער: כאן נמצאים הקטלוג, מוסכמת הטאבים והכללים שכל דוגמה מקיימת — ובנוסף, הצורה המינימלית של שלוש שכבות האינטגרציה בחמש שפות. כל דוגמה ארוכה — כזו שיש בה זרימה, החלטות ומקרי קצה — יושבת בעמוד משלה, כדי שאפשר יהיה לשלוח אליה קישור בתשובת תמיכה בלי לגלול.

הדוגמה השכבה האימות איפה הקוד רץ
שרת ביניים לטופס /functions/{appId}/getlead Application Id בלבד דפדפן וגם שרת שלכם
סנכרון יוצא עם עימוד /parse/classes/… API Key צד שרת בלבד
הרשמה לקורס /functions/{appId}/web2table Application Id בלבד דפדפן, או שרת ביניים
מצא‑או‑צור /parse/classes/… · /parse/batch API Key צד שרת בלבד
חיבור לקוח MCP https://mcp.mbapps.co.il/ API Key או OAuth 2.1 לקוח ה‑MCP שלכם

כל בלוק קוד באתר הזה מופיע בחמש שפות, בטאבים עם מפתח סנכרון משותף. המשמעות המעשית:

  • בוחרים שפה פעם אחת. הבחירה נשמרת — היא חלה על כל שאר הבלוקים באותו עמוד, וגם על עמודי הדוגמאות האחרים שתגלשו אליהם אחר כך.
  • חמש השפות קבועות: PHP · Python · Node.js · C# · JavaScript (דפדפן). זו אותה חמישייה בכל בלוק, גם כשאחת מהן היא “אל תעשו את זה כאן” — בשכבת ה‑REST, למשל, הטאב של הדפדפן מסביר למה הקריאה הזו אינה שייכת לדפדפן ומה כן עושים במקומה.
  • אין עמוד לכל שפה. התבנית זהה בכל השפות ורק לקוח ה‑HTTP משתנה; עמוד לכל שפה היה מכפיל את שטח התחזוקה פי חמש בשביל אותה הודעה בדיוק. עמוד אחד עם טאבים מסונכרנים נותן לקורא את השפה שלו, ולנו — מקור אמת אחד לתקן כשמשהו משתנה.

הכללים שכל דוגמה מקיימת

Section titled “הכללים שכל דוגמה מקיימת”

הדוגמאות באתר הזה אינן קטעים להמחשה. אלה שבעת הכללים שכולן עומדות בהם:

  1. הקוד רץ במלואו. אין // ... באמצע ואין “השלימו כאן” — מה שמופיע בבלוק הוא מה שצריך כדי שהקריאה תעבוד.
  2. טיפול שגיאות אמיתי. לא try / catch ריק: כל דוגמה מבדילה בין שגיאת נתונים (בשכבת הטפסים: 400 עם error של שדה חסר/לא תקין; ב‑REST: 400 עם code), דגל כבוי במערכת (400 עם … is Disabled), 5xx (תקלת שרת) ושגיאת רשת/timeout — כי כל אחת מהן דורשת תגובה אחרת מהמשתמש ומכם.
  3. בלי סודות בדפדפן. ה‑Application Id מופיע בקוד לקוח כי הוא מזהה ציבורי. API Key ו‑Master Key מגיעים תמיד ממשתנה סביבה או ממנהל סודות, בצד שרת בלבד. ראו אימות והרשאות.
  4. ערכי דמה מסומנים. כל מזהה בדוגמאות הוא ערך המצאה בפורמט הנכון (10 תווים), וכל מקום שדורש את הערך שלכם כתוב במפורש — ראו טבלת ערכי הדמה.
  5. limit מפורש תמיד. ברירות המחדל שונות בין השכבות (100 ב‑REST, 5 ב‑MCP), ותשובה קטומה נראית בדיוק כמו טבלה קטנה. ראו מגבלות.
  6. ערכים ריקים מוסרים מהגוף. מחרוזת ריקה אינה “אין ערך” — היא ערך ריק, והוא מתנהג אחרת בשאילתות. כל דוגמה מנקה את הגוף לפני השליחה.
  7. timeout על כל קריאה יוצאת. בקשה בלי timeout היא תהליך שנתקע, לא שגיאה שאפשר לטפל בה.

ערכי הדמה שחוזרים בכל הדוגמאות

Section titled “ערכי הדמה שחוזרים בכל הדוגמאות”
הערך בדוגמה מה הוא מאיפה לוקחים את שלכם
הדביקו-כאן / APP_ID Application Id Databases ← המערכת שלכם ← Settings. סביבות וגישה
MB_API_KEY (משתנה סביבה) API Key אותו מסך, טבלת API Keys ← Add KeySave. אימות
xK9mP2qRsT objectId של רשומה — בדיוק 10 תווים חוזר מהיצירה, או משאילתה
vOZLqOWnQf, aB3dEf9HiJ ערך Pointer (שורה בטבלת lookup) שליפה חד‑פעמית מטבלת ה‑lookup
0501234567 · israel@example.co.il פרטי איש קשר לדוגמה
Accounts · Sales · CourseRegistrations שמות מחלקות שלפו סכימה — שמות הטבלאות משתנים בין מערכות

שלושת הבלוקים הבאים הם הצורה המינימלית של כל שכבה — הקריאה הקטנה ביותר שעדיין שלמה. הזרימות המלאות נמצאות בעמודים הייעודיים.

PHP
<?php
const APP_ID = 'הדביקו-כאן';
function submitLead(array $form): array
{
$data = array_filter([
'Name' => $form['fullName'] ?? null,
'PhoneNumber' => $form['phone'] ?? null,
'Email' => $form['email'] ?? null,
], static fn ($v) => $v !== null && $v !== '');
if (empty($data['PhoneNumber']) && empty($data['Email'])) {
return ['ok' => false, 'error' => 'נדרש טלפון או אימייל'];
}
$ch = curl_init('https://api.mbapps.co.il/functions/' . APP_ID . '/getlead');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Parse-Application-Id: ' . APP_ID,
],
CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($body === false) return ['ok' => false, 'error' => 'שגיאת רשת'];
$json = json_decode($body, true) ?: [];
if ($status === 400) { // כל שגיאה עסקית חוזרת כ-400 — מסתעפים על הגוף
$err = $json['error'] ?? '';
if (str_contains($err, 'Disabled')) return ['ok' => false, 'error' => 'AcceptWebLeads כבוי במערכת'];
if (str_contains($err, 'missing')) return ['ok' => false, 'error' => 'טלפון או אימייל לא תקינים'];
return ['ok' => false, 'error' => "שגיאת שרת (400: $err)"]; // למשל "User function not found"
}
if ($status !== 200) return ['ok' => false, 'error' => "שגיאת שרת ($status)"];
// תשובת ההצלחה עטופה: { "result": { "success": true, "leadId": "..." } }
return ['ok' => true, 'leadId' => $json['result']['leadId'] ?? ''];
}

המשך: הטופס המלא עם מלכודת דבש, שרת ביניים, אימות CAPTCHA וחוזה תשובה אחיד — שרת ביניים לטופס. התיעוד של נקודת הקצה עצמה — getlead.

2 · web2table — רשומה מקושרת

Section titled “2 · web2table — רשומה מקושרת”

שלוש קבוצות שמות: מפתחות איתור בלי קידומת, שדות איש קשר ב‑account_, שדות טבלת היעד ב‑table_.

PHP
<?php
function submitSale(array $form): array
{
$data = array_filter([
'table' => 'Sales', // שם המחלקה המדויק — חובה
'phone' => $form['phone'] ?? null, // חובה, בלי קידומת
'email' => $form['email'] ?? null,
'account_Name' => $form['full_name'] ?? null,
'account_City' => $form['city'] ?? null,
'table_Name' => 'פנייה מדף נחיתה', // שדות Sales בתבנית vanilla: Name, Total, Comment…
'table_Total' => $form['amount'] ?? null,
'isExistsAccountCheck' => 'true', // בוליאני כמחרוזת
], static fn ($v) => $v !== null && $v !== '');
if (empty($data['phone'])) {
return ['ok' => false, 'error' => 'נדרש טלפון'];
}
$ch = curl_init('https://api.mbapps.co.il/functions/' . APP_ID . '/web2table');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Content-Type: application/json',
'X-Parse-Application-Id: ' . APP_ID],
CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
return $status === 200
? ['ok' => true] + json_decode($body, true) // { success, accountId, Id }
: ['ok' => false, 'status' => $status, 'raw' => $body];
}

המשך: מקרה שימוש שלם עם Pointer מרשימה נפתחת, בחירה מרובה ותאריכים — הרשמה לקורס עם web2table. התיעוד של נקודת הקצה — web2table.

PHP
<?php
function fetchRecentLeads(int $limit = 100): array
{
$qs = http_build_query([
'where' => json_encode(['IsAccount' => false], JSON_UNESCAPED_UNICODE),
'keys' => 'Name,PhoneNumber,Email,createdAt',
'order' => '-createdAt',
'limit' => $limit, // תמיד מפורש — ברירת המחדל היא 100
]);
$ch = curl_init("https://api.mbapps.co.il/parse/classes/Accounts?$qs");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => [
'X-Parse-Application-Id: ' . getenv('MB_APP_ID'),
'X-Parse-API-Key: ' . getenv('MB_API_KEY'),
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 200) throw new RuntimeException("REST $status: $body");
return json_decode($body, true)['results'] ?? [];
}

אומת: הקריאה עם X-Parse-API-Key מחזירה 200 ואת השדות שב‑keys; ברירת המחדל בלי limit היא 100 שורות. אותו מפתח תחת X-Parse-Master-Key נדחה ב‑400 code 119 Permission denied.

מה שקורה בלי מפתח בכלל (App‑Id בלבד) תלוי ב‑CLP של הטבלה בטננט שלכם: טבלה עם הרשאות סגורות מחזירה את אותה שגיאה 400 code 119, וטבלה שההרשאה שלה נפתחה לציבור מחזירה 200 עם נתונים. בטננט הדמו, נכון ל‑30.08.2026, Accounts ו‑Sales מחזירות 200 בדיוק כך. אל תניחו שהיעדר מפתח חוסם — בדקו את ה‑CLP של הטבלה עצמה.

המשך: משיכה מלאה של טבלה עם עימוד עמיד וסמן המשך — סנכרון יוצא עם עימוד. הזרימה של חיפוש‑או‑יצירה ורשומה מקושרת — מצא‑או‑צור.

שלוש המלכודות שחוזרות בכל שפה

Section titled “שלוש המלכודות שחוזרות בכל שפה”
  1. Pointer בשכבת הטפסים = מחרוזת objectId חשופה בת 10 תווים, לא אובייקט Parse. בשכבת ה‑REST זה בדיוק הפוך — שם צריך {"__type":"Pointer","className":…,"objectId":…}. אותו שדה, שתי צורות. ראו סוגי נתונים.
  2. בוליאני בשכבת הטפסים: בשדות table_* מתקבלים גם מחרוזת "true" / "false" וגם בוליאני אמיתי (אומת: שניהם נשמרים כ‑Boolean). החריג הוא account_IsAccount, שמקבל רק בוליאני אמיתי — מחרוזת מפילה את כל הבקשה ב‑400 code 111 (באג web-forms-04). מספר בשדה בוליאני נדחה בכל מקרה.
  3. where ב‑REST = JSON שעובר URL‑encoding. השתמשו בכלי הקידוד של הספרייה (params=, URLSearchParams, --data-urlencode). שרשור ידני נכשל בשתי צורות שאומתו: רווח גולמי ב‑URL → 400 Bad Request (דף HTML מהשער, לא JSON); JSON שבור (למשל מפתח בלי מרכאות) → 500 {"code":1,"message":"Internal server error."} — שגיאת קלט שנראית כמו תקלת שרת (באג examples-02).

לא מצאתם את השפה שלכם? התבנית זהה: POST של JSON עם Content-Type: application/json ו‑X-Parse-Application-Id (ובשכבת ה‑REST — גם כותרת ההרשאה). מה שמשתנה הוא לקוח ה‑HTTP והמרת הנתונים לפורמט השליחה בלבד.

תרגמו מהדוגמה הקרובה ביותר לשפה שלכם — Go ו‑Rust מ‑Node.js, Ruby ו‑Kotlin מ‑Python, Java מ‑C#. ואז עברו על שלוש המלכודות לפני ההרצה הראשונה: הן חוצות שפה.