FormInput_* (חתימות)

רפרנס מלא לכל מחלקות FormInput_* בליבה (api/core/libraries/forms): בנאי, אפשרויות, מה נשמר בעמודה ובאיזה פורמט, חוזה get_results, מתודות הבסיס ודוגמת קוד לכל מחלקה.

⏱ 25 דק' קריאה 4467 מילים ערוך דף זה ב-GitHub

הדף הזה הוא הרפרנס לכל שדות הטפסים של הליבה. הוא מפרט לכל מחלקה את הבנאי, את המאפיינים הציבוריים עם ברירות המחדל, את הערך שנשמר בעמודה ואת הפורמט שלו. הסבר על בניית טופס שלם (AJAXForm, קבוצות, שמירה) נמצא במדריך הטפסים; כאן רק החתימות.

המחלקות נטענות אוטומטית מ-api/core/libraries/forms/ (בפריסה: system/libraries/forms/). רוב המחלקות יושבות ב-FormInputs.php ובקבצים עם שמות לא אחידים (formInput_drop.php, FormInputs_FA.php, FormInputs_InpCheckbox.php ועוד), וכולן נקראות FormInput_<שם>.

הדוגמה הבסיסית#

כל שדה נבנה עם שם העמודה, מקבל אפשרויות כמאפיינים, ונדחף לטופס עם push. השמירה כולה היא save() של הטופס.

$frmForm = new AJAXForm("frmCronCategory");
$frmForm->table = "cron_categories";
$frmForm->tpl = "groups";

if (isset($_GET["id"])) {
    $frmForm->update_mode((int)$_GET["id"]);
}

$name = new FormInput_Text("name");
$name->title = "שם התיקייה";
$name->Must();
$frmForm->push($name);

$is_active = new FormInput_Switch("is_active");
$is_active->title = "פעיל";
$frmForm->push($is_active);

if (!$frmForm->IsFormSent()) return $frmForm->get_html();
return $frmForm->save();

חוזה השמירה#

Form::MakeSave() עובר על כל השדות לפי סדר ההוספה וקורא ל-get_results($id) של כל שדה שהדגל autoResults שלו דלוק. הערך המוחזר קובע מה קורה:

ערך מוחזרמשמעות
"ERROR"הוולידציה נכשלה. השמירה נעצרת, הטופס מסומן כלא נשלח (UnSend), ועל השדה נרשמת error_msg ("שדה חובה: ..." כש-must, אחרת "ערך לא תקין: ...")
מערך [עמודה => ערך]הזוגות נכתבים לשאילתה דרך set_var($עמודה, $ערך, $input->table). שדה יכול להחזיר כמה עמודות (למשל LatLng)
null, "" או []לא נשמר כלום. כך שדות תצוגה, שדות שכבר טיפלו בעצמם בטבלה אחרת, וסיסמה ריקה

כללים נוספים:

  • save_to_db = false: הערך המוחזר מתעלם. השדה עדיין רץ (ויכול לכתוב לטבלה אחרת בעצמו) אבל שום עמודה בשורת הטופס לא נכתבת. זה המצב של Gallery, SEO (במצב טבלה), PushManager ו-RePassword.
  • requireID = true: בהוספת רשומה חדשה השדה מדלג בסבב הראשון ורץ בסבב שני, אחרי ה-INSERT, עם ה-id החדש. הערכים שלו נכתבים ב-UPDATE נוסף. אם הוא מחזיר "ERROR" בסבב השני, השורה שנוספה נמחקת. בעריכה (update_mode) השדה רץ בסבב הרגיל. כל שדה שצריך את ה-id של הרשומה (קבצים לפי id, גלריות, טבלאות קשר) חייב אותו.
  • table: "conf" (ברירת מחדל, העמודה בטבלה הראשית) או "content" (העמודה בטבלת התוכן הרב-לשונית). בעריכת שפה שאינה שפת ברירת המחדל שדות conf לא נדחפים לטופס כלל.
  • forceValue: כשהוא true, הערך שהוגדר ב-value לא נדרס בערך השמור ב-DB בעריכה. בלעדיו, MakeSave ממלא את value מהשורה השמורה.
  • perms: אם הוגדר מאפיין perms על השדה, push מוסיף אותו רק למי שיש לו את ההרשאה.
שמירה דרך MCP

כשהבקשה מגיעה עם הכותרת AI-Form-Insert (כלי MCP וסוכני AI), MakeSave קורא קודם ל-mcp_write($value) של כל שדה שנשלח, וערך null שחוזר משדה הופך למחרוזת ריקה כדי שלא ייכשל INSERT על עמודת NOT NULL. ב-update, שדה שלא נשלח בכלל משאיר את הערך השמור (mcp_skip_absent).

מחלקת הבסיס FormInput#

FormInput extends bgl_controller. כל השדות יורשים ממנה. הבנאי: __construct($strName), כש-$strName הוא גם שם העמודה וגם שם שדה ה-POST.

מאפיינים#

מאפייןברירת מחדלמשמעות
nameשם הבנאישם העמודה ושם שדה ה-POST
title""התווית המוצגת
value""ערך התחלתי (בעריכה נדרס בערך השמור, אלא אם forceValue)
table"conf""conf" או "content"
placeholder""טקסט רמז
style""מחרוזת style על האלמנט
className""מחלקת CSS על האלמנט
trClass""מחלקת CSS על שורת השדה
group""המפתח של הקבוצה ($form->groups) שבה השדה מוצג בתבנית groups
oneTDfalseהצגה בעמודה אחת (בלי תווית נפרדת)
mustfalseשדה חובה. מוגדר דרך Must()
must_allow_ignorefalseחובה שמוותרים עליו בצד השרת (get_results הבסיסי לא מחזיר "ERROR")
validate_functions[]שמות פונקציות JS לוולידציה בצד הלקוח
validate_url""כתובת לוולידציה ב-AJAX. נשלח POST {value} ומצופה {result, msg}
validate_urlOnpressfalseלהפעיל את validate_url בכל הקשה
error_msg""הודעת השגיאה שנרשמה בשמירה שנכשלה
alertStringNULLהודעת שגיאה מותאמת. ברירת המחדל: "נא למלא את השדה: "</td></tr><tr><td><code>save_to_db</code></td><td><code>true</code></td><td>האם הערך המוחזר נכתב לעמודה</td></tr><tr><td><code>autoResults</code></td><td><code>true</code></td><td>האם <code>MakeSave</code> קורא ל-<code>get_results</code> אוטומטית</td></tr><tr><td><code>forceValue</code></td><td><code>false</code></td><td>ראו "חוזה השמירה"</td></tr><tr><td><code>requireID</code></td><td><code>false</code></td><td>ראו "חוזה השמירה"</td></tr><tr><td><code>has_effects</code></td><td><code>true</code></td><td>האם השדה משתתף בתבנית הטופס <code>effects</code> (אנימציית כניסה). שדות שמציירים בעצמם (עורכים, קבצים, <code>Select</code>) מכבים אותו</td></tr><tr><td><code>has_results</code></td><td><code>false</code></td><td>מטמון פנימי של התוצאה, בשימוש <code>drop</code> ו-<code>AJAXFile</code>: קריאה שנייה ל-<code>get_results</code> מחזירה אותה תוצאה בלי להעלות שוב</td></tr><tr><td><code>numbers</code></td><td><code>0</code></td><td>עם <code>1</code>, שדות <code>Text</code> מקבלים את מחלקת ה-CSS <code>numeric</code></td></tr><tr><td><code>db_id</code></td><td><code>""</code></td><td>ה-id של הרשומה. נקבע ב-<code>get_results</code></td></tr><tr><td><code>formName</code></td><td><code>""</code></td><td>נקבע על ידי <code>Form::push</code></td></tr><tr><td><code>ObjClassName</code></td><td><code>""</code></td><td>שם המחלקה (פנימי)</td></tr><tr><td><code>DataFromDB</code></td><td><code>false</code></td><td>פנימי</td></tr><tr><td><code>ai_allow</code>, <code>ai_disabled_explicitly</code>, <code>ai_fields</code>, <code>ai_prompt</code>, <code>ai_num_words</code>, <code>ai_settings</code></td><td><code>false</code>, <code>false</code>, <code>[]</code>, <code>false</code>, <code>false</code>, <code>[]</code></td><td>מצב כפתור ה-AI של השדה. מוגדרים דרך <code>ai()</code> ו-<code>ai_disable()</code></td></tr></tbody></table></div> <h3 id="מתודות">מתודות<a class="anchor" href="#מתודות" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>חתימה</th><th>החזרה</th><th>הערה</th></tr></thead><tbody><tr><td><code>__construct($strName)</code></td><td></td><td></td></tr><tr><td><code>get_html()</code></td><td></td><td>ברירת המחדל ריקה. כל מחלקה מממשת</td></tr><tr><td><code>get_results($id)</code></td><td><code>"ERROR"</code>, מערך <code>[name => value]</code> או מערך ריק</td><td>קובע <code>db_id</code>. מחזיר מערך ריק אם <code>mcp_skip_absent($id)</code>. מחזיר <code>"ERROR"</code> אם <code>must</code> ו-<code>!must_allow_ignore</code> והערך ב-POST ריק. אחרת <code>[name => $_POST[name] ?? ""]</code></td></tr><tr><td><code>get_results_string()</code></td><td><code>string</code></td><td>קורא ל-<code>get_results(0)</code> ומחזיר את הערך של העמודה עצמה (<code>""</code> אם אין תוצאה). <code>SEO</code> משתמש בו לאיסוף תת-שדות</td></tr><tr><td><code>Must($allow_ignore = false)</code></td><td></td><td>מסמן את השדה כחובה. עם <code>true</code> הוולידציה נשארת בצד הלקוח בלבד</td></tr><tr><td><code>CheckData()</code></td><td><code>bool</code></td><td>בדיקת נתונים בצד השרת. ל-<code>Email</code> בודקת פורמט אימייל</td></tr><tr><td><code>GetAlertString()</code></td><td><code>string</code></td><td><code>alertString</code> או "נא למלא את השדה: title", בלי תגיות HTML ועם escape למרכאות</td></tr><tr><td><code>GetCheckDataJS()</code></td><td><code>string</code></td><td>קוד ה-JS של הוולידציה (חובה, <code>validate_url</code>)</td></tr><tr><td><code>add_validate_function($name)</code></td><td></td><td>מוסיף ל-<code>validate_functions</code></td></tr><tr><td><code>ForceResults($str)</code></td><td></td><td>כותב את <code>$_POST[name]</code>, כך ש-<code>get_results</code> יראה ערך שלא הגיע מהמשתמש</td></tr><tr><td><code>set_value($value)</code></td><td></td><td>קובע <code>value</code></td></tr><tr><td><code>set_name($value)</code></td><td></td><td>קובע <code>name</code></td></tr><tr><td><code>api_selector()</code></td><td><code>string</code></td><td>ביטוי jQuery שמאתר את השדה (<code>form#<form> *[name='<name>']</code>), לשימוש ממשק ה-API של הטפסים</td></tr><tr><td><code>mcp_write($value)</code></td><td>הערך המומר</td><td>המרת ערך שהגיע מ-MCP לפורמט ה-POST של השדה. ברירת מחדל: הערך כמות שהוא</td></tr><tr><td><code>mcp_list($value)</code></td><td><code>array</code></td><td>מנרמל מערך, אובייקט, מחרוזת JSON, <code>"a,b"</code> או <code>"|1||2|"</code> למערך ערכים ייחודיים (מחרוזות)</td></tr><tr><td><code>mcp_skip_absent($id)</code></td><td><code>bool</code></td><td><code>true</code> כשיש <code>$id</code> (עדכון), השדה לא ב-<code>$_POST</code>, והכותרת <code>AI-Form-Insert</code> קיימת</td></tr><tr><td><code>api_get()</code>, <code>api_set()</code></td><td></td><td>קריאה וכתיבה של ערך השדה בממשק ה-API של הטפסים</td></tr><tr><td><code>api_schema()</code></td><td><code>array</code></td><td>תיאור השדה ל-MCP: <code>{label, required, writable, input:{value:{type:'string', maxlength?, minlength?}}}</code></td></tr><tr><td><code>ai(array $m_settings = [])</code></td><td></td><td>מפעיל כפתור AI על השדה. ראו למטה</td></tr><tr><td><code>ai_disable()</code></td><td></td><td>מכבה את כפתור ה-AI באופן מפורש</td></tr></tbody></table></div> <p>ברירות המחדל של <code>ai()</code>: <code>fields</code> ו-<code>prompt</code> ריקים, <code>num_words false</code>, <code>versions 1</code>, <code>suggestions</code> (<code>shorter</code>, <code>longer</code>, <code>detailed</code>, <code>simple</code>, <code>clickbait</code> דולקים; <code>formal</code>, <code>casual</code>, <code>seo</code> כבויים), <code>allow_edit_prompt true</code>, <code>show_preview true</code>, <code>model ""</code>, <code>provider ""</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$title</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Text</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"title"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$title</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"כותרת"</span><span class="token punctuation">;</span> <span class="token variable">$title</span><span class="token operator">-></span><span class="token function">Must</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$title</span><span class="token operator">-></span><span class="token function">ai</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"num_words"</span> <span class="token operator">=></span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"suggestions"</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"seo"</span> <span class="token operator">=></span> <span class="token constant boolean">true</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$title</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <div class="callout note" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg><div><div class="callout-title">הערה</div><div class="callout-body"><p>הסבר על ה-AI בטפסים נמצא ב<a href="ai-in-forms.html">AI בטפסים</a>.</p></div></div></div> <h2 id="שדות-טקסט">שדות טקסט<a class="anchor" href="#שדות-טקסט" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_text">FormInput_Text<a class="anchor" href="#forminput_text" aria-label="קישור לכותרת">#</a></h3> <p>שדה טקסט שורה אחת. שומר מחרוזת (<code>get_results</code> הבסיסי).</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>maxlength</code></td><td><code>false</code></td><td>מגבלת אורך</td></tr><tr><td><code>dir</code></td><td><code>""</code></td><td><code>ltr</code>, <code>rtl</code> או <code>auto</code>. מוסיף <code>direction</code> ו-<code>text-align</code></td></tr></tbody></table></div> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$url</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Text</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"url"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$url</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"URL להרצה"</span><span class="token punctuation">;</span> <span class="token variable">$url</span><span class="token operator">-></span><span class="token property">dir</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"ltr"</span><span class="token punctuation">;</span> <span class="token variable">$url</span><span class="token operator">-></span><span class="token property">placeholder</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"cron_payments/daily"</span><span class="token punctuation">;</span> <span class="token variable">$url</span><span class="token operator">-></span><span class="token function">Must</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_textarea">FormInput_Textarea<a class="anchor" href="#forminput_textarea" aria-label="קישור לכותרת">#</a></h3> <p>אזור טקסט (30 עמודות, 5 שורות). שומר מחרוזת.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>maxlength</code></td><td></td><td>מגבלת אורך</td></tr><tr><td><code>minlength</code></td><td></td><td>מגבלת מינימום</td></tr></tbody></table></div> <p>כשאחד מהם מוגדר נטען מונה תווים.</p> <h3 id="forminput_hidden">FormInput_Hidden<a class="anchor" href="#forminput_hidden" aria-label="קישור לכותרת">#</a></h3> <p>שדה מוסתר. מאפיין <code>maxlength</code>. שומר מחרוזת. ב-<code>api_schema</code> הוא <code>writable: false</code>, כך ש-MCP לא יכתוב אליו.</p> <h3 id="forminput_var">FormInput_Var<a class="anchor" href="#forminput_var" aria-label="קישור לכותרת">#</a></h3> <p>לא מציג כלום. <code>get_results</code> מחזיר <code>[name => value]</code>: ערך קבוע שנכתב ל-DB בכל שמירה.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$status</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Var</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"status"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$status</span><span class="token operator">-></span><span class="token property">value</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"new"</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$status</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_label-ו-forminput_html">FormInput_Label ו-FormInput_HTML<a class="anchor" href="#forminput_label-ו-forminput_html" aria-label="קישור לכותרת">#</a></h3> <p>שדות תצוגה בלבד (<code>oneTD = true</code>). מציגים את <code>value</code> כמות שהוא, ו-<code>get_results</code> מחזיר <code>""</code>: לא נשמר כלום.</p> <h3 id="forminput_valuelabel">FormInput_ValueLabel<a class="anchor" href="#forminput_valuelabel" aria-label="קישור לכותרת">#</a></h3> <p>מציג את <code>value</code> ב-<code>span</code> בתוך שורת שדה רגילה (<code>has_effects = false</code>). לא נשמר כלום, ו-<code>api_schema</code> שלו <code>writable: false</code>.</p> <h3 id="forminput_email">FormInput_Email<a class="anchor" href="#forminput_email" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את הבסיס ומוסיף <code>input_type</code> (ברירת מחדל <code>"text"</code>). ולידציית אימייל ב-JS, ו-<code>CheckData()</code> בודק עם <code>IsValidEmailAddress</code>. שומר מחרוזת.</p> <h3 id="forminput_url">FormInput_URL<a class="anchor" href="#forminput_url" aria-label="קישור לכותרת">#</a></h3> <p>מאפיין <code>maxlength</code>. הערך נשמר עם <code>http://</code> מוסר ומוסף מחדש, אלא אם מכיל <code>https://</code>. מחזיר <code>"ERROR"</code> כש-<code>must</code> והערך ריק.</p> <h3 id="forminput_phone">FormInput_Phone<a class="anchor" href="#forminput_phone" aria-label="קישור לכותרת">#</a></h3> <p>שדה טלפון. ולידציית JS: מתחיל ב-<code>0</code> ובאורך 9 עד 10 ספרות. שומר מחרוזת, בלי בדיקה בצד השרת.</p> <h3 id="forminput_fa">FormInput_FA<a class="anchor" href="#forminput_fa" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Text</code>. בורר אייקון FontAwesome. שומר HTML מהצורה <code><i class='fa <class>'></i></code>, או SVG גולמי או טקסט. ערך שמתחיל ב-<code>b64:</code> מפוענח קודם מ-base64. מחזיר <code>"ERROR"</code> כש-<code>must</code> והערך ריק.</p> <div class="callout note" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg><div><div class="callout-title">הערה</div><div class="callout-body"><p>האייקון נשמר כ-HTML. כשמציגים אותו ב-Vue, אל תשימו עליו <code>v-if</code> או <code>v-for</code> (ראו <a href="admin-vue-panels.html">ממשק Vue</a>).</p></div></div></div> <h3 id="forminput_latlng">FormInput_LatLng<a class="anchor" href="#forminput_latlng" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Text</code>. מאפיין <code>second_field</code> (<code>false</code>). נשלח כ-<code><name>_lat</code> ו-<code><name>_lng</code>. שומר <code>"lat,lng"</code> בעמודה אחת, או, כש-<code>second_field</code> מוגדר, את קו הרוחב ב-<code>name</code> ואת קו האורך בעמודה <code>second_field</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$loc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_LatLng</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"location"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$loc</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"מיקום"</span><span class="token punctuation">;</span> <span class="token variable">$loc</span><span class="token operator">-></span><span class="token property">second_field</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"lng"</span><span class="token punctuation">;</span> <span class="token comment">// lat בעמודה location, lng בעמודה lng</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$loc</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h2 id="שדות-מספר">שדות מספר<a class="anchor" href="#שדות-מספר" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_number">FormInput_Number<a class="anchor" href="#forminput_number" aria-label="קישור לכותרת">#</a></h3> <p>שדה טקסט עם מחלקת <code>numeric</code>, שומר מחרוזת (<code>get_results</code> הבסיסי). אין בדיקה בצד השרת שהערך באמת מספר.</p> <h3 id="forminput_numberinp">FormInput_NumberInp<a class="anchor" href="#forminput_numberinp" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>max</code></td><td></td><td>ערך מקסימלי</td></tr><tr><td><code>min</code></td><td></td><td>ערך מינימלי</td></tr><tr><td><code>is_null</code></td><td><code>false</code></td><td>שדה ריק נשמר כ-<code>NULL</code></td></tr></tbody></table></div> <p>טוען <code>assets/inputs/NumberInp.js</code> ו-<code>NumberInp.css</code>. <code>get_results</code> מחזיר <code>"ERROR"</code> כש-<code>must</code> והערך ריק. עם <code>is_null</code> ושדה ריק נשמרת המחרוזת <code>"NULL"</code> (ש-DB מתרגם ל-SQL <code>NULL</code>). ב-HTML ערך שאינו מספר שלם מוצג כ-<code>0</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$price</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_NumberInp</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"price"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$price</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"מחיר"</span><span class="token punctuation">;</span> <span class="token variable">$price</span><span class="token operator">-></span><span class="token property">min</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$price</span><span class="token operator">-></span><span class="token property">is_null</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$price</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_minutes">FormInput_minutes<a class="anchor" href="#forminput_minutes" aria-label="קישור לכותרת">#</a></h3> <p>הזנת זמן <code>HH:MM</code>. נשמר <strong>מספר שלם של דקות</strong> (<code>שעות*60 + דקות</code>), לא שניות. ערך ריק מחזיר <code>""</code> (לא נשמר). המתודה <code>hoursToSecods($hour)</code> קרויה בטעות "שניות" אבל מחזירה דקות.</p> <h2 id="שדות-בחירה">שדות בחירה<a class="anchor" href="#שדות-בחירה" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_select">FormInput_Select<a class="anchor" href="#forminput_select" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>options</code></td><td><code>[]</code></td><td><code>[מפתח => ["title" => טקסט, "selected" => bool]]</code></td></tr><tr><td><code>size</code></td><td><code>"1"</code></td><td></td></tr><tr><td><code>selectedID</code></td><td></td><td>המפתח הנבחר</td></tr><tr><td><code>has_effects</code></td><td><code>false</code></td><td></td></tr></tbody></table></div> <div class="table-wrap"><table><thead><tr><th>חתימה</th><th>הערה</th></tr></thead><tbody><tr><td><code>set_var($key, $val)</code></td><td>קובע <code>options[$key]["title"] = $val</code></td></tr><tr><td><code>set($key, $val)</code></td><td>כינוי ל-<code>set_var</code></td></tr></tbody></table></div> <p>שומר את <strong>המפתח</strong> שנבחר כמחרוזת. ב-<code>api_schema</code> הוא <code>select</code> עם רשימת האפשרויות.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$group_id</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Select</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"group_id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$group_id</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"קבוצה"</span><span class="token punctuation">;</span> <span class="token variable">$group_id</span><span class="token operator">-></span><span class="token property">options</span><span class="token punctuation">[</span><span class="token string double-quoted-string">""</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"title"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"ללא קבוצה"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$group_id</span><span class="token operator">-></span><span class="token function">set_var</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"מנהלים"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$group_id</span><span class="token operator">-></span><span class="token function">set_var</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"עורכים"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$group_id</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_selectdb">FormInput_SelectDB<a class="anchor" href="#forminput_selectdb" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Select</code> ומקבל את האפשרויות משאילתה.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>query</code></td><td></td><td>אובייקט <code>DB::query(...)</code></td></tr><tr><td><code>queryVal</code></td><td><code>"name"</code></td><td>העמודה שמוצגת</td></tr><tr><td><code>queryKey</code></td><td><code>"id"</code></td><td>העמודה שנשמרת</td></tr></tbody></table></div> <p>אפשר להוסיף אפשרות ריקה לפני כן ב-<code>options[""]</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$category_id</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_SelectDB</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"category_id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$category_id</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"תיקייה"</span><span class="token punctuation">;</span> <span class="token variable">$category_id</span><span class="token operator">-></span><span class="token property">options</span><span class="token punctuation">[</span><span class="token string double-quoted-string">""</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"title"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"ללא תיקייה"</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$category_id</span><span class="token operator">-></span><span class="token property">query</span> <span class="token operator">=</span> <span class="token class-name static-context">DB</span><span class="token operator">::</span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"cron_categories"</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"name ASC"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$category_id</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_multiselect">FormInput_MultiSelect<a class="anchor" href="#forminput_multiselect" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Select</code>. מאפיינים: <code>query</code>, <code>queryVal</code>, <code>queryKey</code>, <code>size</code> (<code>1</code>), <code>label</code>, <code>placeholder</code>. נשלח כ-<code>name[]</code>. נשמר בפורמט הרשימה של הליבה: <code>|v1||v2|</code> (מחרוזת ריקה כשאין בחירה), ומפורק עם <code>MISC::bgl_explode</code>. <code>mcp_write</code> משתמש ב-<code>mcp_list</code>.</p> <h3 id="forminput_inpcheckbox">FormInput_InpCheckbox<a class="anchor" href="#forminput_inpcheckbox" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Select</code>. אוסף תיבות סימון מתוך שאילתה. מאפיינים: <code>query</code>, <code>queryVal</code> (<code>"name"</code>), <code>queryKey</code> (<code>"id"</code>). נשמר <code>|v||v|</code>, כמו <code>MultiSelect</code>. <code>mcp_write</code> משתמש ב-<code>mcp_list</code>.</p> <h3 id="forminput_radio-ו-forminput_radiodb">FormInput_Radio ו-FormInput_RadioDB<a class="anchor" href="#forminput_radio-ו-forminput_radiodb" aria-label="קישור לכותרת">#</a></h3> <p><code>Radio</code> מרחיב את <code>Select</code> ושומר את המפתח הנבחר. <code>RadioDB</code> מוסיף את <code>query</code>, <code>queryVal</code>, <code>queryKey</code> כמו <code>SelectDB</code>.</p> <h3 id="forminput_autocompletedb">FormInput_AutocompleteDB<a class="anchor" href="#forminput_autocompletedb" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>SelectDB</code> ומציג חיפוש תוך כדי הקלדה. מאפיינים: <code>sessID</code>, <code>has_effects</code> (<code>true</code>), <code>url</code> (ברירת מחדל <code>system/Tools/AutocompleteDB?token=</code>). השאילתה נשמרת ב-SESSION תחת <code>ac_<sessID></code>, והשדה שומר את המפתח.</p> <h3 id="forminput_mgz_autocompletedb">FormInput_MGZ_AutoCompleteDB<a class="anchor" href="#forminput_mgz_autocompletedb" aria-label="קישור לכותרת">#</a></h3> <p>בחירה בודדת עם Select2, עם אפשרות יצירת ערך חדש.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>maxlength</code></td><td></td><td></td></tr><tr><td><code>min</code></td><td><code>1</code></td><td></td></tr><tr><td><code>url</code></td><td></td><td>כתובת החיפוש</td></tr><tr><td><code>queryKey</code></td><td><code>"id"</code></td><td></td></tr><tr><td><code>queryVal</code></td><td><code>"name"</code></td><td></td></tr><tr><td><code>allow_insert</code></td><td><code>true</code></td><td>מותר ליצור רשומה חדשה מטקסט חופשי</td></tr><tr><td><code>query</code></td><td><code>false</code></td><td>חובה בפועל, מגדיר את הטבלה</td></tr></tbody></table></div> <p>מה שנשמר הוא ה-id. מספר שלם חיובי נשמר כמות שהוא. טקסט מחפשים לפי <code>queryVal</code> ב-<code>query->table</code>, ואם לא נמצא ו-<code>allow_insert</code> דלוק נוצרת שורה (<code>DB::update(table)->set_var(queryVal, val)->insert()</code>, ואז <code>cache_engine::remove(table)</code>). אחרת נשמר <code>""</code>. הגרסה <code>MGZ_AutoCompleteDBOLD</code> היא מימוש ישן (vcomplete), לא לשימוש בקוד חדש.</p> <h3 id="forminput_tags">FormInput_Tags<a class="anchor" href="#forminput_tags" aria-label="קישור לכותרת">#</a></h3> <p>תגיות עם חיפוש ויצירה. נשלח מערך JSON של שמות תגיות.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>maxlength</code></td><td></td><td></td></tr><tr><td><code>min</code></td><td><code>1</code></td><td>נאכף רק כש-<code>must</code></td></tr><tr><td><code>url</code></td><td></td><td>כתובת החיפוש</td></tr><tr><td><code>queryKey</code></td><td><code>"id"</code></td><td></td></tr><tr><td><code>queryVal</code></td><td><code>"name"</code></td><td></td></tr><tr><td><code>allow_insert</code></td><td><code>true</code></td><td>יצירת תגית חדשה</td></tr><tr><td><code>query</code></td><td><code>false</code></td><td>טבלת התגיות. בלעדיה נשמר הטקסט עצמו</td></tr><tr><td><code>rel_table</code></td><td><code>false</code></td><td>טבלת קשר (ללא <code>CRM_</code>)</td></tr><tr><td><code>rel_item_key</code></td><td><code>"item_id"</code></td><td>עמודת הרשומה בטבלת הקשר</td></tr><tr><td><code>rel_tag_key</code></td><td><code>"tag_id"</code></td><td>עמודת התגית בטבלת הקשר</td></tr><tr><td><code>rel_more_fields</code></td><td><code>[]</code></td><td>מערך <code>[עמודה => ערך]</code> שנכתב בכל שורת קשר חדשה</td></tr></tbody></table></div> <p>עם <code>query</code> נשמר <code>|id||id|</code> בעמודה. עם <code>rel_table</code> השדה גם <strong>מוחק</strong> את שורות הרשומה בטבלת הקשר (<code>DELETE FROM CRM_<rel_table> WHERE <rel_item_key> = (int)$id</code>) וכותב מחדש שורה לכל תגית. <code>mcp_write</code> מחזיר JSON של שמות ופותר מזהים מספריים לשמות. <code>api_schema</code> מסוג <code>tags</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$allow_ip</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Tags</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"allow_ip"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$allow_ip</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"כתובות IP מורשות"</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$allow_ip</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">טבלת קשר ברשומה חדשה</div><div class="callout-body"><code>rel_table</code> צריך את ה-id של הרשומה. ברשומה חדשה הגדירו <code>$tags->requireID = true</code>, אחרת השדה רץ לפני ה-<code>INSERT</code> ללא id.</p></div></div></div> <h2 id="תיבות-סימון-ומתגים">תיבות סימון ומתגים<a class="anchor" href="#תיבות-סימון-ומתגים" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_checkbox">FormInput_Checkbox<a class="anchor" href="#forminput_checkbox" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th></tr></thead><tbody><tr><td><code>oneTD</code></td><td><code>true</code></td></tr><tr><td><code>trClass</code></td><td><code>"checkbox"</code></td></tr></tbody></table></div> <p>נשמר <code>"1"</code> או <code>"0"</code>. כולל שדה מוסתר <code>hidd_<name></code> כדי שגם תיבה לא מסומנת תישלח. המתודה <code>IsCheckd()</code> מחזירה אם התיבה מסומנת. <code>api_schema</code> מסוג <code>boolean</code>.</p> <h3 id="forminput_newcheckbox">FormInput_NewCheckbox<a class="anchor" href="#forminput_newcheckbox" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Checkbox</code>. מוסיף <code>label</code> ומציג בפריסת שתי עמודות (<code>oneTD = false</code>). שומר <code>"1"</code> או <code>"0"</code>.</p> <h3 id="forminput_switch">FormInput_Switch<a class="anchor" href="#forminput_switch" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Checkbox</code>. מציג מתג הפעלה, שומר <code>"1"</code> או <code>"0"</code>. כדי להציג מתג דלוק בטופס חדש: <code>$sw->value = true</code> כשאין <code>id</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$is_active</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Switch</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"is_active"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$is_active</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"פעיל"</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token variable">$is_active</span><span class="token operator">-></span><span class="token property">value</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$is_active</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h2 id="תאריכים-ושעות">תאריכים ושעות<a class="anchor" href="#תאריכים-ושעות" aria-label="קישור לכותרת">#</a></h2> <div class="table-wrap"><table><thead><tr><th>מחלקה</th><th>ממשק</th><th>מה נשמר</th></tr></thead><tbody><tr><td><code>Calendar</code></td><td>flatpickr (נטען מ-CDN), פורמט <code>d/m/Y</code>, עברית</td><td><code>Y-m-d H:i:00</code>. <code>""</code> אם לא נבחר חודש</td></tr><tr><td><code>Date</code></td><td>לוח שנה ישן עם חלון קופץ</td><td><code>Y-m-d H:i:s</code> כש-<code>datetime</code> (ברירת מחדל), אחרת timestamp גולמי</td></tr><tr><td><code>DateAndTime</code></td><td>כמו <code>Date</code> עם <code>withMinutes = true</code> וטווח שנים מהשנה הנוכחית ועד חמש קדימה</td><td><code>Y-m-d H:i:s</code></td></tr><tr><td><code>DateSimple</code></td><td>שלוש רשימות: שנה (1930 עד השנה הנוכחית), חודש, יום</td><td>תאריך. תאריך ריק נשמר <code>""</code></td></tr><tr><td><code>Time</code></td><td>בורר <code>HH:MM</code></td><td><code>date('H:i', strtotime(post))</code></td></tr><tr><td><code>minutes</code></td><td>בורר <code>HH:MM</code></td><td>מספר דקות (ראו למעלה)</td></tr></tbody></table></div> <h3 id="forminput_calendar">FormInput_Calendar<a class="anchor" href="#forminput_calendar" aria-label="קישור לכותרת">#</a></h3> <p>המומלץ לשימוש חדש. נשלח כ-<code><name>_year</code>, <code><name>_month</code>, <code><name>_day</code> (וכש-<code>withMinutes</code> גם <code><name>_time</code> בפורמט <code>H:i</code>).</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>withMinutes</code></td><td></td><td>להוסיף בחירת שעה</td></tr><tr><td><code>forceDate</code></td><td></td><td>תאריך קבוע שמוצג</td></tr><tr><td><code>datetime</code></td><td><code>true</code></td><td></td></tr><tr><td><code>minDate</code>, <code>maxDate</code>, <code>onSelectFunc</code></td><td><code>null</code></td><td><strong>לא בשימוש בקוד</strong>, אין להסתמך עליהם</td></tr></tbody></table></div> <p><code>mcp_write</code> מפרק <code>d/m/Y [H:i]</code> או כל מחרוזת ש-<code>strtotime</code> מבינה לשדות המשנה. <code>ForceResults($str)</code> קובע את <code>forceDate</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$start</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Calendar</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"start_date"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$start</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"תאריך התחלה"</span><span class="token punctuation">;</span> <span class="token variable">$start</span><span class="token operator">-></span><span class="token property">withMinutes</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$start</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_date-dateandtime-datesimple">FormInput_Date, DateAndTime, DateSimple<a class="anchor" href="#forminput_date-dateandtime-datesimple" aria-label="קישור לכותרת">#</a></h3> <p><code>Date</code>: המאפיינים <code>withMinutes</code> (<code>false</code>), <code>forceDate</code> (<code>null</code>), <code>datetime</code> (<code>true</code>). הערך נשלח בשדה מוסתר כ-timestamp, ועם <code>withMinutes</code> נוספים <code><name>_hour</code> ו-<code><name>_min</code>. <code>DateSimple</code> מוסיף <code>forceVal</code> שנקבע דרך <code>ForceValue($str)</code>.</p> <h2 id="קבצים-ותמונות">קבצים ותמונות<a class="anchor" href="#קבצים-ותמונות" aria-label="קישור לכותרת">#</a></h2> <p>כל שדות הקבצים יורשים מ-<code>AJAXFile</code>, שמעלה את הקובץ בנפרד (AJAX) ושומר ב-DB את ה-<strong>id של הקובץ בטבלת storage</strong> (מספר שלם). ניקוי הקובץ שולח את המחרוזת <code>"NULL"</code>, שמאפסת את העמודה. הסבר על שכבת האחסון ב-<a href="storage.html">אחסון קבצים</a>.</p> <h3 id="forminput_ajaxfile">FormInput_AJAXFile<a class="anchor" href="#forminput_ajaxfile" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>types</code></td><td></td><td>סוגי קבצים מותרים</td></tr><tr><td><code>dir</code></td><td></td><td>תיקיית היעד (נשלחת כ-<code>path</code>)</td></tr><tr><td><code>Width</code>, <code>Height</code></td><td></td><td>מידות להמרה</td></tr><tr><td><code>img_max_width</code>, <code>img_max_height</code></td><td></td><td>הגבלת מידות מקסימליות</td></tr><tr><td><code>img_convert</code></td><td><code>""</code></td><td>פורמט להמרה</td></tr><tr><td><code>image_background_color</code></td><td><code>"#FFFFFF"</code></td><td>רקע להמרה</td></tr><tr><td><code>image_ratio_fill</code></td><td><code>false</code></td><td>מילוי ביחס</td></tr><tr><td><code>storage_object_type</code>, <code>storage_object_id</code></td><td></td><td>שיוך הקובץ לאובייקט</td></tr><tr><td><code>str_upload_text</code></td><td>מחרוזת <code>_UPLOAD_FILE_</code></td><td>טקסט כפתור ההעלאה</td></tr><tr><td><code>str_remove_text</code></td><td>מחרוזת <code>_REMOVE_FILE_</code></td><td>טקסט כפתור המחיקה</td></tr><tr><td><code>process_func</code></td><td><code>NULL</code></td><td><code>fn(\Verot\Upload\Upload $handle, $db_id)</code>, מופעל על הקובץ לפני השמירה. <code>$db_id</code> משמעותי רק עם <code>requireID = true</code></td></tr><tr><td><code>remote</code></td><td><code>NULL</code></td><td>יעד אחסון מרוחק</td></tr><tr><td><code>has_effects</code></td><td><code>false</code></td><td></td></tr></tbody></table></div> <p>ההעלאה נחתמת בטוקן <code>MISC::encode(name|json(Width,Height,img_convert,image_background_color,image_ratio_fill))</code>, כך שלא ניתן לשנות את הפרמטרים מהדפדפן. הקובץ נוסף ב-<code>storage->Add</code> עם <code>path</code>, <code>clear => true</code>, <code>remote</code> (אם הוגדר), <code>name</code>, <code>object_type</code>, <code>object_id</code> ומגבלות <code>img_max_*</code>.</p> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">שימו לב</div><div class="callout-body"><p>בשגיאת העלאה השדה מבצע <code>die("UPLOAD ERROR")</code>, כלומר הטופס מת באמצע ולא מחזיר <code>"ERROR"</code> מסודר.</p></div></div></div> <h3 id="forminput_drop">FormInput_drop<a class="anchor" href="#forminput_drop" aria-label="קישור לכותרת">#</a></h3> <p>אזור גרירה והעלאה, הבחירה המומלצת לתמונות וקבצים. מרחיב את <code>AJAXFile</code> ומוסיף:</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>require_copyrights</code></td><td><code>false</code></td><td>חובה למלא קרדיט</td></tr><tr><td><code>allow_edit_copyrights</code></td><td><code>false</code></td><td>לאפשר עריכת קרדיט</td></tr><tr><td><code>require_description</code></td><td><code>false</code></td><td>חובה למלא תיאור</td></tr><tr><td><code>allow_edit_description</code></td><td><code>false</code></td><td>לאפשר עריכת תיאור</td></tr><tr><td><code>uid</code></td><td></td><td>מזהה ייחודי של האלמנט</td></tr><tr><td><code>ai_image_enabled</code></td><td><code>false</code></td><td>מופעל אוטומטית כש-<code>FORM::$allow_ai</code> ושירות <code>wizzoai</code> פעיל</td></tr><tr><td><code>ai_image_settings</code></td><td><code>[]</code></td><td></td></tr><tr><td><code>suggest_ai</code></td><td><code>false</code></td><td></td></tr></tbody></table></div> <p><code>ai_image(array $settings)</code> מפעיל יצירת תמונה ב-AI. ברירות המחדל: <code>quick_button true</code>, <code>advanced_button true</code>, <code>context_fields []</code>, <code>default_prompt ""</code>, <code>image_size "wide"</code>, <code>model ""</code>, <code>provider ""</code>.</p> <p><code>get_results</code> מקבל את הקובץ באחת משלוש דרכים: <code>_edit</code> (העלאה זמנית), <code>_sid</code> מספרי (קובץ קיים ב-storage, ובמקרה כזה גם מעדכן את העמודות <code>copyrights</code> ו-<code>description</code> של שורת ה-storage מ-<code>_edit_copyrights</code> ו-<code>_edit_description</code>), או <code>_sid</code> שמכיל <code>base64</code> (<code>STORAGE::addFromBase64</code>, עם <code>_realName</code> ו-<code>_ext</code>). <code>_removePrev == "remove"</code> מחזיר <code>"NULL"</code>. <code>api_schema</code> מגדיר את המפתחות <code>sid</code>, <code>url</code>, <code>credits</code>, <code>description</code>.</p> <p>המחלקות <code>FormInput_drop_file</code>, <code>FormInput_drop_file_gallery</code>, <code>FormInput_Image</code>, <code>FormInput_StorageFile</code> ו-<code>FormInput_ImageEditor</code> הן תת-מחלקות ריקות של <code>drop</code> עם אותה התנהגות בדיוק, שקיימות לתאימות לאחור.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$image</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_drop</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"image"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$image</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"תמונה"</span><span class="token punctuation">;</span> <span class="token variable">$image</span><span class="token operator">-></span><span class="token property">dir</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"media/pages"</span><span class="token punctuation">;</span> <span class="token variable">$image</span><span class="token operator">-></span><span class="token property">Width</span> <span class="token operator">=</span> <span class="token number">1200</span><span class="token punctuation">;</span> <span class="token variable">$image</span><span class="token operator">-></span><span class="token property">require_copyrights</span> <span class="token operator">=</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_file">FormInput_File<a class="anchor" href="#forminput_file" aria-label="קישור לכותרת">#</a></h3> <p>העלאה ישנה ללא AJAX. <code>requireID = true</code> ו-<code>has_effects = false</code>. מאפיינים: <code>types</code>, <code>dir</code>. שומר את סיומת הקובץ ומעתיק אותו ל-<code><dir>/<id>.<ext></code>. מתודת עזר: <code>GetFileData()</code>.</p> <div class="callout danger" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="m15 9-6 6M9 9l6 6"/></svg><div><div class="callout-title">FormInput_File שבור כש-types מוגדר</div><div class="callout-body"><p>המימוש משתמש ב-<code>eregi</code>, שהוסרה ב-PHP 7. הגדרת <code>types</code> גורמת ל-fatal error. השתמשו ב-<code>FormInput_drop</code>.</p></div></div></div> <h3 id="forminput_gallery">FormInput_Gallery<a class="anchor" href="#forminput_gallery" aria-label="קישור לכותרת">#</a></h3> <p>גלריית תמונות. מרחיב את <code>AJAXFile</code>.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th></tr></thead><tbody><tr><td><code>save_to_db</code></td><td><code>false</code></td></tr><tr><td><code>requireID</code></td><td><code>true</code></td></tr><tr><td><code>editURL</code></td><td><code>false</code></td></tr></tbody></table></div> <p>התמונות הן שורות <code>storage</code> (<code>object_type</code>, <code>object_id</code>, <code>ord</code>). פריט חדש מקושר זמנית עם <code>object_id = -1</code> ומוצמד לרשומה בשמירה לפי <code><name>_ids</code>. הפעולות (מחיקה, עדכון) עוברות דרך <code>system/Tools/GalleryActions</code> עם טוקן. טוען jQuery UI ו-jquery.form מ-CDN. <code>get_results</code> מחזיר <code>null</code>.</p> <h3 id="forminput_vgallery">FormInput_VGallery<a class="anchor" href="#forminput_vgallery" aria-label="קישור לכותרת">#</a></h3> <p>גרסה מודרנית של <code>Gallery</code> (תמונה ממוזערת 300x270, מיון בגרירה). אותם ערכי ברירת מחדל (<code>save_to_db false</code>, <code>requireID true</code>, <code>editURL false</code>). בשמירה קורא את <code><name>_ids</code> ואת <code><name>_order</code> (מחשב מחדש את <code>ord</code>). פעולות עם טוקן: <code>remove</code>, <code>update_details</code>, <code>updateName</code>, <code>set_order</code>, <code>download</code>.</p> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">ערכי _ids בשאילתה</div><div class="callout-body"><p>ב-<code>Gallery</code> וב-<code>VGallery</code> ערכי <code><name>_ids</code> נכנסים ל-SQL בלי המרה למספר שלם. הערכים מגיעים מהדפדפן של משתמש מחובר באדמין, אבל כדאי להמיר ל-<code>(int)</code> בתוך המחלקה כשנוגעים בה.</p></div></div></div> <h2 id="עורכי-טקסט-עשיר">עורכי טקסט עשיר<a class="anchor" href="#עורכי-טקסט-עשיר" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_htmleditor">FormInput_HTMLEditor<a class="anchor" href="#forminput_htmleditor" aria-label="קישור לכותרת">#</a></h3> <p>עורך HTML.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th></tr></thead><tbody><tr><td><code>width</code></td><td></td></tr><tr><td><code>height</code></td><td><code>400</code></td></tr><tr><td><code>has_effects</code></td><td><code>false</code></td></tr></tbody></table></div> <p>שם שדה ה-POST הוא <code>name</code> ועוד מזהה ייחודי (<code>time()</code>, נשלח גם כ-<code><name>_unique</code>). <code>get_results</code> מחזיר <code>"ERROR"</code> כש-<code>must</code> והערך ריק, ושומר HTML. <code>api_schema</code> מסוג <code>html</code>. <code>FormInput_MiniEditor</code> ו-<code>FormInput_text_editor</code> יורשים ממנו ומציירים גרסה קטנה (<code>MISC::create_editor_mini</code>) וגרסה חדשה (<code>MISC::create_editor_new</code>) של העורך.</p> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">שימו לב</div><div class="callout-body"><p>ה-HTML נשמר כמו שהוא. בתצוגה בצד האתר הוא חייב לעבור סינון לפי <a href="csrf-xss-sqli.html">מודל האבטחה</a>, במיוחד אם הכתיבה פתוחה לא רק למנהלים.</p></div></div></div> <h3 id="forminput_wz_editor">FormInput_WZ_Editor<a class="anchor" href="#forminput_wz_editor" aria-label="קישור לכותרת">#</a></h3> <p>מרחיב את <code>Text</code>. עורך ה-WZ החדש.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>height</code></td><td><code>400</code></td><td></td></tr><tr><td><code>editorOptions</code></td><td><code>[]</code></td><td>אפשרויות מועברות לעורך</td></tr><tr><td><code>plugins</code></td><td>קבוצות כלים ברירת מחדל</td><td></td></tr></tbody></table></div> <p>העלאת קבצים מהעורך עוברת ל-<code>{admin}/storage/wz_editor_upload</code>. אם השדה לא נשלח בכלל: <code>"ERROR"</code> כש-<code>must</code>, אחרת לא נשמר כלום. אחרת ההתנהגות הבסיסית, וה-HTML נשמר.</p> <h2 id="סיסמאות-ואבטחה">סיסמאות ואבטחה<a class="anchor" href="#סיסמאות-ואבטחה" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_password">FormInput_Password<a class="anchor" href="#forminput_password" aria-label="קישור לכותרת">#</a></h3> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>encryption</code></td><td><code>"md5"</code></td><td><code>md5</code>, <code>bcrypt</code> (הספרייה <code>bcrypt</code>), <code>encode</code> (<code>MISC::encode</code>), או שם כל פונקציה (נקראת עם <code>call_user_func</code>)</td></tr><tr><td><code>strong</code></td><td><code>false</code></td><td>דורש סיסמה חזקה</td></tr></tbody></table></div> <p>סיסמה ריקה, או המחרוזת <code>"null"</code>, לא נשמרת (עריכה בלי החלפת סיסמה). המתודה <code>isPasswordStrong($password)</code> דורשת לפחות 8 תווים, אות גדולה, אות קטנה, ספרה ותו מיוחד.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$password</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Password</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"password"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$password</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"סיסמה"</span><span class="token punctuation">;</span> <span class="token variable">$password</span><span class="token operator">-></span><span class="token property">encryption</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"bcrypt"</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <div class="callout danger" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="m15 9-6 6M9 9l6 6"/></svg><div><div class="callout-title">strong אינו שמיש</div><div class="callout-body"><p>עם <code>strong = true</code> ו-<code>get_html</code>, המימוש מפנה למשתנה <code>$password</code> שלא הוגדר (שגיאה ב-PHP 8), ובסיסמה חלשה <code>get_results</code> מחזיר <code>false</code> ולא <code>"ERROR"</code>. ה-JS גם מניח שמזהה הטופס הוא <code>frmAdmins</code>. אל תסתמכו עליו מחוץ ל-<code>Admins</code>.</p></div></div></div> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">md5 כברירת מחדל</div><div class="callout-body"><p>ברירת המחדל <code>md5</code> חלשה לאחסון סיסמאות. הגדירו <code>encryption = "bcrypt"</code> בכל שימוש חדש. ראו גם <a href="security-model.html">מודל האבטחה</a>.</p></div></div></div> <h3 id="forminput_repassword">FormInput_RePassword<a class="anchor" href="#forminput_repassword" aria-label="קישור לכותרת">#</a></h3> <p>אימות סיסמה. בנאי: <code>__construct($strInpName, $inpPassword)</code>, כש-<code>$inpPassword</code> הוא אובייקט ה-<code>FormInput_Password</code> של אותו טופס. <code>save_to_db = false</code>. מחזיר <code>"ERROR"</code> כשהערכים לא זהים (או כשהערך הוא <code>"null"</code>), אחרת <code>""</code>.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$password</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_Password</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"password"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$re</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_RePassword</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"repassword"</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$re</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"אימות סיסמה"</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$re</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_seccode">FormInput_SecCode<a class="anchor" href="#forminput_seccode" aria-label="קישור לכותרת">#</a></h3> <p>תמונת אבטחה מ-<code>system/Tools/securityPic</code>. מחזיר <code>"ERROR"</code> על קוד שגוי ואינו שומר כלום. הקוד נגזר מ-<code>substr(hexdec(md5(UA . site_url . random_num . "F j")), 2, 6)</code>.</p> <h2 id="צבע-קישורים-ו-seo">צבע, קישורים ו-SEO<a class="anchor" href="#צבע-קישורים-ו-seo" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_color">FormInput_Color<a class="anchor" href="#forminput_color" aria-label="קישור לכותרת">#</a></h3> <p>בורר צבע. נשמר ה-hex <strong>בלי</strong> <code>#</code> (לאחר trim), והתצוגה מוסיפה אותו. מחזיר <code>"ERROR"</code> כש-<code>must</code> והערך ריק. <code>FormInput_Color_OLD</code> מרחיב את <code>Text</code> עם בורר spectrum ישן, ומסיר גם הוא את ה-<code>#</code>.</p> <h3 id="forminput_seourl">FormInput_SeoUrl<a class="anchor" href="#forminput_seourl" aria-label="קישור לכותרת">#</a></h3> <p>כתובת SEO לדף. מאפיינים: <code>pageUrl</code> (תבנית עם המציין <code>__NEWID__</code>), <code>requireID</code> (<code>true</code>). שם הקלט קבוע, <code>SeoUrl</code>, ולכן אפשר רק אחד בטופס. נשמר בטבלה <code>seoUrl</code> (<code>pageurl</code>, <code>sysname</code>), מוחק את מטמון <code>seoUrl_tbl</code>, ומחזיר <code>"ERROR"</code> אם ה-<code>sysname</code> תפוס על ידי דף אחר. לא נשמר דבר בשורת הטופס (<code>get_results</code> מחזיר <code>null</code>). ראו <a href="seo-urls.html">כתובות SEO</a>.</p> <h3 id="forminput_seo">FormInput_SEO<a class="anchor" href="#forminput_seo" aria-label="קישור לכותרת">#</a></h3> <p>מטא-נתוני SEO לדף: כותרת, תיאור, מילות מפתח ו-Open Graph.</p> <p>בנאי: <code>__construct($strName, $json_field = false)</code>.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>key</code></td><td></td><td><code>page_key</code> בטבלת <code>seo_center</code>. אפשר <code>__NEWID__</code></td></tr><tr><td><code>requireID</code></td><td><code>true</code></td><td></td></tr><tr><td><code>save_to_db</code></td><td><code>false</code></td><td></td></tr><tr><td><code>is_by_url</code></td><td><code>"0"</code></td><td></td></tr><tr><td><code>seo_fields</code></td><td></td><td>סלקטורים של <code>title</code>, <code>description</code>, <code>content</code> בדף, לשימוש מנתח ה-SEO</td></tr><tr><td><code>focus_keyphrase</code></td><td></td><td>ביטוי המפתח</td></tr><tr><td><code>pageUrl</code></td><td></td><td>כשמוגדר, נוסף שדה <code>SeoUrl</code></td></tr><tr><td><code>json_field</code></td><td></td><td>מהבנאי. עם <code>true</code>: <code>save_to_db = true</code> ו-<code>requireID = false</code></td></tr></tbody></table></div> <p>תת-השדות: <code>meta_title</code> (עד 60 תווים), <code>title_include_sitename</code>, <code>meta_description</code> (50 עד 160), <code>meta_keywords</code>, <code>og_title</code>, <code>og_description</code>, <code>og_image</code> (שדה <code>drop</code>, <code>dir "media/seo"</code>, <code>Width 1200</code>).</p> <p>ללא <code>json_field</code> השדה כותב שורה אחת בטבלת <code>seo_center</code> (<code>page_key = key</code>, <code>is_by_url</code>, תת-השדות) ומחזיר <code>null</code>. עם <code>json_field</code> הוא מחזיר <code>[name => JSON של תת-השדות]</code> לעמודה בטבלת הרשומה. ב-<code>api_schema</code> הוא <code>writable: false</code> ומחזיר <code>sub_fields</code>, וב-MCP תת-שדות שלא נשלחו שומרים את הערך השמור.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$keywords</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_SEO</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"seo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$keywords</span><span class="token operator">-></span><span class="token property">key</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"page___NEWID__"</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$keywords</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <div class="callout warning" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0zM12 9v4M12 17h.01"/></svg><div><div class="callout-title">שימו לב</div><div class="callout-body"><p>כשמוגדר <code>pageUrl</code>, כתובת כפולה גורמת ל-<code>_saveSeoUrl</code> להחזיר <code>"ERROR"</code>, אבל הקורא מתעלם ממנו. השמירה ממשיכה והכתובת הכפולה לא נשמרת, בלי הודעה למשתמש. בדקו כפילות בעצמכם.</p></div></div></div> <h2 id="מבני-נתונים-ו-json">מבני נתונים ו-JSON<a class="anchor" href="#מבני-נתונים-ו-json" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_jsonedit_ex">FormInput_JSONEdit_ex<a class="anchor" href="#forminput_jsonedit_ex" aria-label="קישור לכותרת">#</a></h3> <p>טבלת שורות חוזרות. מאפיין <code>titles</code> הוא מערך של אובייקטי <code>FormInput</code>. <code>set_var($key, $placeholder)</code> מוסיף עמודה: מחרוזת הופכת לשדה <code>FormInput_Text</code> שהכותרת שלו היא המחרוזת. נשמר <code>json_encode($_POST[name])</code> של מערך השורות, ו-<code>""</code> אם הערך אינו מערך.</p> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$links</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_JSONEdit_ex</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"links"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$links</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"קישורים"</span><span class="token punctuation">;</span> <span class="token variable">$links</span><span class="token operator">-></span><span class="token function">set_var</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"label"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"טקסט"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$links</span><span class="token operator">-></span><span class="token function">set_var</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"href"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"כתובת"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$links</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h3 id="forminput_jsonedit">FormInput_JSONEdit<a class="anchor" href="#forminput_jsonedit" aria-label="קישור לכותרת">#</a></h3> <p>טבלת מפתח וערך (<code>key_<name>[]</code>, <code>val_<name>[]</code>). נשמר אובייקט JSON <code>{key: value}</code>.</p> <h3 id="forminput_array-forminput_array_exp-forminput_json">FormInput_Array, FormInput_Array_exp, FormInput_Json<a class="anchor" href="#forminput_array-forminput_array_exp-forminput_json" aria-label="קישור לכותרת">#</a></h3> <p>יורשים מ-<code>Text</code> ומציירים עורכי JSON ב-Vue (התבניות <code>assets/FormInput_Array/index.tpl</code>, <code>assets/FormInput_Array_exp/index.tpl</code>, <code>assets/json_builder/index.tpl</code>). הערך נשלח כטקסט JSON ב-textarea מוסתר בשם <code>name</code>, ונשמר כמחרוזת JSON. <code>mcp_write</code> מקודד מערך ואובייקט ל-JSON.</p> <h3 id="forminput_dynamic_fields">FormInput_Dynamic_fields<a class="anchor" href="#forminput_dynamic_fields" aria-label="קישור לכותרת">#</a></h3> <p>יורש מ-<code>Text</code>, אבל <code>get_results</code> שלו ריק ולכן <strong>לא נשמר כלום</strong>. אם אתם צריכים שדות דינמיים שנשמרים, השתמשו ב-<code>JSONEdit_ex</code> או ב-<code>Json</code>.</p> <h2 id="תזמון">תזמון<a class="anchor" href="#תזמון" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_crontime">FormInput_CronTime<a class="anchor" href="#forminput_crontime" aria-label="קישור לכותרת">#</a></h3> <p>תזמון בסגנון cron בחמישה שדות נפרדים. נשלח כ-<code>crontime_minute</code>, <code>crontime_hour</code>, <code>crontime_day</code>, <code>crontime_month</code>, <code>crontime_weekday</code> (שמות קבועים, ולכן אחד בטופס), ונשמר כמחרוזת אחת <code>"m h d mo wd"</code>. הערך ההתחלתי יכול להיות מחרוזת או מערך.</p> <h3 id="forminput_crontimepro">FormInput_CronTimePro<a class="anchor" href="#forminput_crontimepro" aria-label="קישור לכותרת">#</a></h3> <p>בורר תזמון ב-Vue. מאפיין <code>help_url</code> (<code>false</code>). נשלח שדה אחד בשם <code>name</code> עם מחרוזת cron, מרופדת או חתוכה ל-5 חלקים. ברירת המחדל <code>"* * * * *"</code>.</p> <div class="table-wrap"><table><thead><tr><th>חתימה</th><th>החזרה</th><th>הערה</th></tr></thead><tbody><tr><td><code>static get_presets(): array</code></td><td>מערך 19 תבניות מוכנות</td><td></td></tr><tr><td><code>static humanize(string $expr): string</code></td><td>תיאור בעברית של הביטוי</td><td></td></tr></tbody></table></div> <pre class="language-php" dir="ltr"><code class="language-php"><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">load</span><span class="token operator">-></span><span class="token function">library</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"forms/FormInput_CronTimePro"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token class-name static-context">FormInput_CronTimePro</span><span class="token operator">::</span><span class="token function">humanize</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"*/5 * * * *"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$crontime</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FormInput_CronTimePro</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"crontime"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$crontime</span><span class="token operator">-></span><span class="token property">title</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"תזמון"</span><span class="token punctuation">;</span> <span class="token variable">$crontime</span><span class="token operator">-></span><span class="token function">Must</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$frmForm</span><span class="token operator">-></span><span class="token function">push</span><span class="token punctuation">(</span><span class="token variable">$crontime</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre> <h2 id="התראות-push">התראות Push<a class="anchor" href="#התראות-push" aria-label="קישור לכותרת">#</a></h2> <h3 id="forminput_pushmanager">FormInput_PushManager<a class="anchor" href="#forminput_pushmanager" aria-label="קישור לכותרת">#</a></h3> <p>ניהול התראות מתוזמנות לרשומה. <code>requireID = true</code>, <code>save_to_db = false</code>, מאפיין <code>item_type</code>. קורא את <code>$_POST["pushmanager_notifications"]</code> (מערך JSON של <code>{id, title, message, date, time}</code>) וכותב לטבלה <code>push_manager</code> (<code>item_type</code>, <code>item_id</code>, <code>title</code>, <code>content</code>, <code>date_send</code>). שורות שכבר נשלחו (<code>is_send = 1</code>) לא נוגעים בהן.</p> <div class="callout note" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg><div><div class="callout-title">הערה</div><div class="callout-body"><code>item_type</code> משורשר ל-SQL בלי escape, והוא ערך שהמפתח קובע בקוד. אל תמלאו אותו מקלט משתמש.</p></div></div></div> <h2 id="שירותי-שוק">שירותי שוק<a class="anchor" href="#שירותי-שוק" aria-label="קישור לכותרת">#</a></h2> <p>שלושת השדות האלה יורשים מ-<code>Text</code> ותלויים בשירות חיצוני.</p> <h3 id="forminput_wizzostream">FormInput_WizzoStream<a class="anchor" href="#forminput_wizzostream" aria-label="קישור לכותרת">#</a></h3> <p>סרטוני Wizzo Stream.</p> <div class="table-wrap"><table><thead><tr><th>מאפיין</th><th>ברירת מחדל</th><th>הערה</th></tr></thead><tbody><tr><td><code>api_key</code></td><td><code>""</code></td><td>אם ריק, <code>market_service::api_key("wizzostream")</code></td></tr><tr><td><code>api_ping</code></td><td><code>""</code></td><td></td></tr><tr><td><code>ws_settings</code></td><td><code>false</code></td><td></td></tr><tr><td><code>disable_chunks</code></td><td><code>false</code></td><td></td></tr><tr><td><code>api_url</code></td><td><code>"https://api.wizzo.stream/api_wizzocms/"</code></td><td></td></tr></tbody></table></div> <p>נשמר ערך הטקסט (<code>get_results</code> הבסיסי).</p> <h3 id="forminput_payme">FormInput_payme<a class="anchor" href="#forminput_payme" aria-label="קישור לכותרת">#</a></h3> <p>שדה תשלום מאובטח (Hosted Fields) של PayMe. מאפיינים: <code>api_key</code>, <code>api_ping</code>, <code>name</code>. בלי <code>api_key</code> מוצגת הודעה בעברית. טוען את <code>hostedfields.js</code> מה-CDN של PayMe, וכש-<code>must</code> הוולידציה בצד הלקוח קוראת ל-<code>orderApp.handleFormSubmit()</code>. זה קוד תשלומים: מתועדת החתימה בלבד.</p> <h2 id="מחלקת-form-ו-ajaxform">מחלקת Form ו-AJAXForm<a class="anchor" href="#מחלקת-form-ו-ajaxform" aria-label="קישור לכותרת">#</a></h2> <p>השדות נדחפים לאובייקט <code>Form</code> (או <code>AJAXForm</code>, שמגיש ב-AJAX). השדות החשובים לשימוש עם <code>FormInput</code>:</p> <div class="table-wrap"><table><thead><tr><th>חתימה</th><th>הערה</th></tr></thead><tbody><tr><td><code>new Form($strFormName)</code></td><td>שם הטופס משמש גם לשדה <code>isFormSent_<name></code></td></tr><tr><td><code>update_mode($id)</code></td><td>טוען את השורה (<code>DB::query</code> עם <code>editLang</code>) למצב עריכה. קובע <code>db_id</code> ו-<code>db_row</code></td></tr><tr><td><code>push($inpInput)</code></td><td>מוסיף שדה, לפי <code>perms</code> ושפת העריכה (ראו למעלה). שדה <code>must</code> מקבל פונקציית ולידציה בשם <code>CheckData_<form>_<name></code></td></tr><tr><td><code>RemoveInput($strInputName)</code></td><td>מסיר שדה</td></tr><tr><td><code>GetInputByName($strInputName)</code></td><td>מחזיר את אובייקט השדה</td></tr><tr><td><code>ChangeContentTable($tblName, $queryKey)</code></td><td>מגדיר טבלת תוכן ועמודת קשר (<code>parentId</code> כברירת מחדל)</td></tr><tr><td><code>IsFormSent()</code></td><td>האם הגיע POST של הטופס</td></tr><tr><td><code>get_html()</code></td><td>מציג את הטופס</td></tr><tr><td><code>save()</code></td><td>אם הטופס נשלח: <code>MakeSave()</code>, הדפסת <code>successFunc</code> כשמצליח, ומחזיר הודעת הצלחה או כישלון</td></tr><tr><td><code>MakeSave()</code></td><td>השמירה עצמה. מחזיר <code>bool</code></td></tr><tr><td><code>UnSend()</code></td><td>מבטל את דגל השליחה</td></tr></tbody></table></div> <div class="callout tip" role="note"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18h6M10 21h4M12 3a6 6 0 0 0-3.5 10.9c.6.5 1 1.2 1.1 2.1h4.8c.1-.9.5-1.6 1.1-2.1A6 6 0 0 0 12 3z"/></svg><div><div class="callout-title">טיפ</div><div class="callout-body"><p>פרטים נוספים על המאפיינים (<code>tpl</code>, <code>groups</code>, <code>successFunc</code>, <code>table</code>) ב-<a href="forms.html">מדריך הטפסים</a>.</p></div></div></div> <h2 id="ראו-גם">ראו גם<a class="anchor" href="#ראו-גם" aria-label="קישור לכותרת">#</a></h2> <ul> <li><a href="forms.html">טפסים</a>: בניית טופס שלם, קבוצות ותבניות</li> <li><a href="panel-table.html">panel_table</a> ו-<a href="ref-panel-table.html">רפרנס panel_table</a>: הטבלה שמובילה לטפסים</li> <li><a href="building-a-panel.html">בניית פאנל ניהול</a></li> <li><a href="ai-in-forms.html">AI בטפסים</a></li> <li><a href="admin-json-api.html">ממשק JSON של הניהול</a></li> <li><a href="ref-admin.html">רפרנס הניהול</a></li> </ul> </article> <nav class="pager" aria-label="דפים סמוכים"><a class="prev" href="./ref-params-langs.html"><small>→ הקודם</small><strong>PARAMS ו-LANGS</strong></a><a class="next" href="./ref-panel-table.html"><small>הבא ←</small><strong>panel_table (אפשרויות)</strong></a></nav> <div class="doc-foot"> <span>מצאתם טעות או חוסר? <a href="https://github.com/wizzo-products/wizzo50_core/blob/main/website/docs-src/reference/form-inputs.md">תקנו את הדף</a> או פתחו Issue בריפו.</span> <span>התיעוד נכתב מתוך הקוד של ליבה 5.0.115.</span> </div> </main> <aside class="toc" aria-label="בדף זה"> <h5>בדף זה</h5><ul><li class="l2"><a href="#הדוגמה-הבסיסית">הדוגמה הבסיסית</a></li><li class="l2"><a href="#חוזה-השמירה">חוזה השמירה</a></li><li class="l2"><a href="#מחלקת-הבסיס-forminput">מחלקת הבסיס FormInput</a></li><li class="l3"><a href="#מאפיינים">מאפיינים</a></li><li class="l3"><a href="#מתודות">מתודות</a></li><li class="l2"><a href="#שדות-טקסט">שדות טקסט</a></li><li class="l3"><a href="#forminput_text">FormInput_Text</a></li><li class="l3"><a href="#forminput_textarea">FormInput_Textarea</a></li><li class="l3"><a href="#forminput_hidden">FormInput_Hidden</a></li><li class="l3"><a href="#forminput_var">FormInput_Var</a></li><li class="l3"><a href="#forminput_label-ו-forminput_html">FormInput_Label ו-FormInput_HTML</a></li><li class="l3"><a href="#forminput_valuelabel">FormInput_ValueLabel</a></li><li class="l3"><a href="#forminput_email">FormInput_Email</a></li><li class="l3"><a href="#forminput_url">FormInput_URL</a></li><li class="l3"><a href="#forminput_phone">FormInput_Phone</a></li><li class="l3"><a href="#forminput_fa">FormInput_FA</a></li><li class="l3"><a href="#forminput_latlng">FormInput_LatLng</a></li><li class="l2"><a href="#שדות-מספר">שדות מספר</a></li><li class="l3"><a href="#forminput_number">FormInput_Number</a></li><li class="l3"><a href="#forminput_numberinp">FormInput_NumberInp</a></li><li class="l3"><a href="#forminput_minutes">FormInput_minutes</a></li><li class="l2"><a href="#שדות-בחירה">שדות בחירה</a></li><li class="l3"><a href="#forminput_select">FormInput_Select</a></li><li class="l3"><a href="#forminput_selectdb">FormInput_SelectDB</a></li><li class="l3"><a href="#forminput_multiselect">FormInput_MultiSelect</a></li><li class="l3"><a href="#forminput_inpcheckbox">FormInput_InpCheckbox</a></li><li class="l3"><a href="#forminput_radio-ו-forminput_radiodb">FormInput_Radio ו-FormInput_RadioDB</a></li><li class="l3"><a href="#forminput_autocompletedb">FormInput_AutocompleteDB</a></li><li class="l3"><a href="#forminput_mgz_autocompletedb">FormInput_MGZ_AutoCompleteDB</a></li><li class="l3"><a href="#forminput_tags">FormInput_Tags</a></li><li class="l2"><a href="#תיבות-סימון-ומתגים">תיבות סימון ומתגים</a></li><li class="l3"><a href="#forminput_checkbox">FormInput_Checkbox</a></li><li class="l3"><a href="#forminput_newcheckbox">FormInput_NewCheckbox</a></li><li class="l3"><a href="#forminput_switch">FormInput_Switch</a></li><li class="l2"><a href="#תאריכים-ושעות">תאריכים ושעות</a></li><li class="l3"><a href="#forminput_calendar">FormInput_Calendar</a></li><li class="l3"><a href="#forminput_date-dateandtime-datesimple">FormInput_Date, DateAndTime, DateSimple</a></li><li class="l2"><a href="#קבצים-ותמונות">קבצים ותמונות</a></li><li class="l3"><a href="#forminput_ajaxfile">FormInput_AJAXFile</a></li><li class="l3"><a href="#forminput_drop">FormInput_drop</a></li><li class="l3"><a href="#forminput_file">FormInput_File</a></li><li class="l3"><a href="#forminput_gallery">FormInput_Gallery</a></li><li class="l3"><a href="#forminput_vgallery">FormInput_VGallery</a></li><li class="l2"><a href="#עורכי-טקסט-עשיר">עורכי טקסט עשיר</a></li><li class="l3"><a href="#forminput_htmleditor">FormInput_HTMLEditor</a></li><li class="l3"><a href="#forminput_wz_editor">FormInput_WZ_Editor</a></li><li class="l2"><a href="#סיסמאות-ואבטחה">סיסמאות ואבטחה</a></li><li class="l3"><a href="#forminput_password">FormInput_Password</a></li><li class="l3"><a href="#forminput_repassword">FormInput_RePassword</a></li><li class="l3"><a href="#forminput_seccode">FormInput_SecCode</a></li><li class="l2"><a href="#צבע-קישורים-ו-seo">צבע, קישורים ו-SEO</a></li><li class="l3"><a href="#forminput_color">FormInput_Color</a></li><li class="l3"><a href="#forminput_seourl">FormInput_SeoUrl</a></li><li class="l3"><a href="#forminput_seo">FormInput_SEO</a></li><li class="l2"><a href="#מבני-נתונים-ו-json">מבני נתונים ו-JSON</a></li><li class="l3"><a href="#forminput_jsonedit_ex">FormInput_JSONEdit_ex</a></li><li class="l3"><a href="#forminput_jsonedit">FormInput_JSONEdit</a></li><li class="l3"><a href="#forminput_array-forminput_array_exp-forminput_json">FormInput_Array, FormInput_Array_exp, FormInput_Json</a></li><li class="l3"><a href="#forminput_dynamic_fields">FormInput_Dynamic_fields</a></li><li class="l2"><a href="#תזמון">תזמון</a></li><li class="l3"><a href="#forminput_crontime">FormInput_CronTime</a></li><li class="l3"><a href="#forminput_crontimepro">FormInput_CronTimePro</a></li><li class="l2"><a href="#התראות-push">התראות Push</a></li><li class="l3"><a href="#forminput_pushmanager">FormInput_PushManager</a></li><li class="l2"><a href="#שירותי-שוק">שירותי שוק</a></li><li class="l3"><a href="#forminput_wizzostream">FormInput_WizzoStream</a></li><li class="l3"><a href="#forminput_payme">FormInput_payme</a></li><li class="l2"><a href="#מחלקת-form-ו-ajaxform">מחלקת Form ו-AJAXForm</a></li><li class="l2"><a href="#ראו-גם">ראו גם</a></li></ul> </aside> </div> <div class="search-modal" role="dialog" aria-modal="true" aria-label="חיפוש בתיעוד"> <div class="search-box"> <div class="inp"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="search" id="docs-search-input" placeholder="חפשו מחלקה, מתודה, טבלה או נושא…" autocomplete="off" spellcheck="false"> <kbd class="kbd">Esc</kbd> </div> <div class="search-results"></div> <div class="search-foot"><span>↑↓ ניווט</span><span>Enter פתיחה</span><span>Esc סגירה</span></div> </div> </div> <script src="../assets/js/site.js?v=150bc793fa" defer></script> <script src="../assets/js/docs.js?v=df9a0deb5b" defer></script> </body> </html>