הדף הזה הוא הרפרנס לכל שדות הטפסים של הליבה. הוא מפרט לכל מחלקה את הבנאי, את המאפיינים הציבוריים עם ברירות המחדל, את הערך שנשמר בעמודה ואת הפורמט שלו. הסבר על בניית טופס שלם (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מוסיף אותו רק למי שיש לו את ההרשאה.
כשהבקשה מגיעה עם הכותרת 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 |
oneTD | false | הצגה בעמודה אחת (בלי תווית נפרדת) |
must | false | שדה חובה. מוגדר דרך Must() |
must_allow_ignore | false | חובה שמוותרים עליו בצד השרת (get_results הבסיסי לא מחזיר "ERROR") |
validate_functions | [] | שמות פונקציות JS לוולידציה בצד הלקוח |
validate_url | "" | כתובת לוולידציה ב-AJAX. נשלח POST {value} ומצופה {result, msg} |
validate_urlOnpress | false | להפעיל את validate_url בכל הקשה |
error_msg | "" | הודעת השגיאה שנרשמה בשמירה שנכשלה |
alertString | NULL | הודעת שגיאה מותאמת. ברירת המחדל: "נא למלא את השדה: |
save_to_db | true | האם הערך המוחזר נכתב לעמודה |
autoResults | true | האם MakeSave קורא ל-get_results אוטומטית |
forceValue | false | ראו "חוזה השמירה" |
requireID | false | ראו "חוזה השמירה" |
has_effects | true | האם השדה משתתף בתבנית הטופס effects (אנימציית כניסה). שדות שמציירים בעצמם (עורכים, קבצים, Select) מכבים אותו |
has_results | false | מטמון פנימי של התוצאה, בשימוש drop ו-AJAXFile: קריאה שנייה ל-get_results מחזירה אותה תוצאה בלי להעלות שוב |
numbers | 0 | עם 1, שדות Text מקבלים את מחלקת ה-CSS numeric |
db_id | "" | ה-id של הרשומה. נקבע ב-get_results |
formName | "" | נקבע על ידי Form::push |
ObjClassName | "" | שם המחלקה (פנימי) |
DataFromDB | false | פנימי |
ai_allow, ai_disabled_explicitly, ai_fields, ai_prompt, ai_num_words, ai_settings | false, false, [], false, false, [] | מצב כפתור ה-AI של השדה. מוגדרים דרך ai() ו-ai_disable() |
מתודות#
| חתימה | החזרה | הערה |
|---|---|---|
__construct($strName) | ||
get_html() | ברירת המחדל ריקה. כל מחלקה מממשת | |
get_results($id) | "ERROR", מערך [name => value] או מערך ריק | קובע db_id. מחזיר מערך ריק אם mcp_skip_absent($id). מחזיר "ERROR" אם must ו-!must_allow_ignore והערך ב-POST ריק. אחרת [name => $_POST[name] ?? ""] |
get_results_string() | string | קורא ל-get_results(0) ומחזיר את הערך של העמודה עצמה ("" אם אין תוצאה). SEO משתמש בו לאיסוף תת-שדות |
Must($allow_ignore = false) | מסמן את השדה כחובה. עם true הוולידציה נשארת בצד הלקוח בלבד | |
CheckData() | bool | בדיקת נתונים בצד השרת. ל-Email בודקת פורמט אימייל |
GetAlertString() | string | alertString או "נא למלא את השדה: title", בלי תגיות HTML ועם escape למרכאות |
GetCheckDataJS() | string | קוד ה-JS של הוולידציה (חובה, validate_url) |
add_validate_function($name) | מוסיף ל-validate_functions | |
ForceResults($str) | כותב את $_POST[name], כך ש-get_results יראה ערך שלא הגיע מהמשתמש | |
set_value($value) | קובע value | |
set_name($value) | קובע name | |
api_selector() | string | ביטוי jQuery שמאתר את השדה (form#<form> *[name='<name>']), לשימוש ממשק ה-API של הטפסים |
mcp_write($value) | הערך המומר | המרת ערך שהגיע מ-MCP לפורמט ה-POST של השדה. ברירת מחדל: הערך כמות שהוא |
mcp_list($value) | array | מנרמל מערך, אובייקט, מחרוזת JSON, "a,b" או "|1||2|" למערך ערכים ייחודיים (מחרוזות) |
mcp_skip_absent($id) | bool | true כשיש $id (עדכון), השדה לא ב-$_POST, והכותרת AI-Form-Insert קיימת |
api_get(), api_set() | קריאה וכתיבה של ערך השדה בממשק ה-API של הטפסים | |
api_schema() | array | תיאור השדה ל-MCP: {label, required, writable, input:{value:{type:'string', maxlength?, minlength?}}} |
ai(array $m_settings = []) | מפעיל כפתור AI על השדה. ראו למטה | |
ai_disable() | מכבה את כפתור ה-AI באופן מפורש |
ברירות המחדל של ai(): fields ו-prompt ריקים, num_words false, versions 1, suggestions (shorter, longer, detailed, simple, clickbait דולקים; formal, casual, seo כבויים), allow_edit_prompt true, show_preview true, model "", provider "".
$title = new FormInput_Text("title");
$title->title = "כותרת";
$title->Must();
$title->ai(["num_words" => 8, "suggestions" => ["seo" => true]]);
$frmForm->push($title);
הסבר על ה-AI בטפסים נמצא בAI בטפסים.
שדות טקסט#
FormInput_Text#
שדה טקסט שורה אחת. שומר מחרוזת (get_results הבסיסי).
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
maxlength | false | מגבלת אורך |
dir | "" | ltr, rtl או auto. מוסיף direction ו-text-align |
$url = new FormInput_Text("url");
$url->title = "URL להרצה";
$url->dir = "ltr";
$url->placeholder = "cron_payments/daily";
$url->Must();
$frmForm->push($url);
FormInput_Textarea#
אזור טקסט (30 עמודות, 5 שורות). שומר מחרוזת.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
maxlength | מגבלת אורך | |
minlength | מגבלת מינימום |
כשאחד מהם מוגדר נטען מונה תווים.
FormInput_Hidden#
שדה מוסתר. מאפיין maxlength. שומר מחרוזת. ב-api_schema הוא writable: false, כך ש-MCP לא יכתוב אליו.
FormInput_Var#
לא מציג כלום. get_results מחזיר [name => value]: ערך קבוע שנכתב ל-DB בכל שמירה.
$status = new FormInput_Var("status");
$status->value = "new";
$frmForm->push($status);
FormInput_Label ו-FormInput_HTML#
שדות תצוגה בלבד (oneTD = true). מציגים את value כמות שהוא, ו-get_results מחזיר "": לא נשמר כלום.
FormInput_ValueLabel#
מציג את value ב-span בתוך שורת שדה רגילה (has_effects = false). לא נשמר כלום, ו-api_schema שלו writable: false.
FormInput_Email#
מרחיב את הבסיס ומוסיף input_type (ברירת מחדל "text"). ולידציית אימייל ב-JS, ו-CheckData() בודק עם IsValidEmailAddress. שומר מחרוזת.
FormInput_URL#
מאפיין maxlength. הערך נשמר עם http:// מוסר ומוסף מחדש, אלא אם מכיל https://. מחזיר "ERROR" כש-must והערך ריק.
FormInput_Phone#
שדה טלפון. ולידציית JS: מתחיל ב-0 ובאורך 9 עד 10 ספרות. שומר מחרוזת, בלי בדיקה בצד השרת.
FormInput_FA#
מרחיב את Text. בורר אייקון FontAwesome. שומר HTML מהצורה <i class='fa <class>'></i>, או SVG גולמי או טקסט. ערך שמתחיל ב-b64: מפוענח קודם מ-base64. מחזיר "ERROR" כש-must והערך ריק.
האייקון נשמר כ-HTML. כשמציגים אותו ב-Vue, אל תשימו עליו v-if או v-for (ראו ממשק Vue).
FormInput_LatLng#
מרחיב את Text. מאפיין second_field (false). נשלח כ-<name>_lat ו-<name>_lng. שומר "lat,lng" בעמודה אחת, או, כש-second_field מוגדר, את קו הרוחב ב-name ואת קו האורך בעמודה second_field.
$loc = new FormInput_LatLng("location");
$loc->title = "מיקום";
$loc->second_field = "lng"; // lat בעמודה location, lng בעמודה lng
$frmForm->push($loc);
שדות מספר#
FormInput_Number#
שדה טקסט עם מחלקת numeric, שומר מחרוזת (get_results הבסיסי). אין בדיקה בצד השרת שהערך באמת מספר.
FormInput_NumberInp#
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
max | ערך מקסימלי | |
min | ערך מינימלי | |
is_null | false | שדה ריק נשמר כ-NULL |
טוען assets/inputs/NumberInp.js ו-NumberInp.css. get_results מחזיר "ERROR" כש-must והערך ריק. עם is_null ושדה ריק נשמרת המחרוזת "NULL" (ש-DB מתרגם ל-SQL NULL). ב-HTML ערך שאינו מספר שלם מוצג כ-0.
$price = new FormInput_NumberInp("price");
$price->title = "מחיר";
$price->min = 0;
$price->is_null = true;
$frmForm->push($price);
FormInput_minutes#
הזנת זמן HH:MM. נשמר מספר שלם של דקות (שעות*60 + דקות), לא שניות. ערך ריק מחזיר "" (לא נשמר). המתודה hoursToSecods($hour) קרויה בטעות "שניות" אבל מחזירה דקות.
שדות בחירה#
FormInput_Select#
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
options | [] | [מפתח => ["title" => טקסט, "selected" => bool]] |
size | "1" | |
selectedID | המפתח הנבחר | |
has_effects | false |
| חתימה | הערה |
|---|---|
set_var($key, $val) | קובע options[$key]["title"] = $val |
set($key, $val) | כינוי ל-set_var |
שומר את המפתח שנבחר כמחרוזת. ב-api_schema הוא select עם רשימת האפשרויות.
$group_id = new FormInput_Select("group_id");
$group_id->title = "קבוצה";
$group_id->options[""] = ["title" => "ללא קבוצה"];
$group_id->set_var(1, "מנהלים");
$group_id->set_var(2, "עורכים");
$frmForm->push($group_id);
FormInput_SelectDB#
מרחיב את Select ומקבל את האפשרויות משאילתה.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
query | אובייקט DB::query(...) | |
queryVal | "name" | העמודה שמוצגת |
queryKey | "id" | העמודה שנשמרת |
אפשר להוסיף אפשרות ריקה לפני כן ב-options[""].
$category_id = new FormInput_SelectDB("category_id");
$category_id->title = "תיקייה";
$category_id->options[""] = ["title" => "ללא תיקייה"];
$category_id->query = DB::query("cron_categories", null, "name ASC");
$frmForm->push($category_id);
FormInput_MultiSelect#
מרחיב את Select. מאפיינים: query, queryVal, queryKey, size (1), label, placeholder. נשלח כ-name[]. נשמר בפורמט הרשימה של הליבה: |v1||v2| (מחרוזת ריקה כשאין בחירה), ומפורק עם MISC::bgl_explode. mcp_write משתמש ב-mcp_list.
FormInput_InpCheckbox#
מרחיב את Select. אוסף תיבות סימון מתוך שאילתה. מאפיינים: query, queryVal ("name"), queryKey ("id"). נשמר |v||v|, כמו MultiSelect. mcp_write משתמש ב-mcp_list.
FormInput_Radio ו-FormInput_RadioDB#
Radio מרחיב את Select ושומר את המפתח הנבחר. RadioDB מוסיף את query, queryVal, queryKey כמו SelectDB.
FormInput_AutocompleteDB#
מרחיב את SelectDB ומציג חיפוש תוך כדי הקלדה. מאפיינים: sessID, has_effects (true), url (ברירת מחדל system/Tools/AutocompleteDB?token=). השאילתה נשמרת ב-SESSION תחת ac_<sessID>, והשדה שומר את המפתח.
FormInput_MGZ_AutoCompleteDB#
בחירה בודדת עם Select2, עם אפשרות יצירת ערך חדש.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
maxlength | ||
min | 1 | |
url | כתובת החיפוש | |
queryKey | "id" | |
queryVal | "name" | |
allow_insert | true | מותר ליצור רשומה חדשה מטקסט חופשי |
query | false | חובה בפועל, מגדיר את הטבלה |
מה שנשמר הוא ה-id. מספר שלם חיובי נשמר כמות שהוא. טקסט מחפשים לפי queryVal ב-query->table, ואם לא נמצא ו-allow_insert דלוק נוצרת שורה (DB::update(table)->set_var(queryVal, val)->insert(), ואז cache_engine::remove(table)). אחרת נשמר "". הגרסה MGZ_AutoCompleteDBOLD היא מימוש ישן (vcomplete), לא לשימוש בקוד חדש.
FormInput_Tags#
תגיות עם חיפוש ויצירה. נשלח מערך JSON של שמות תגיות.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
maxlength | ||
min | 1 | נאכף רק כש-must |
url | כתובת החיפוש | |
queryKey | "id" | |
queryVal | "name" | |
allow_insert | true | יצירת תגית חדשה |
query | false | טבלת התגיות. בלעדיה נשמר הטקסט עצמו |
rel_table | false | טבלת קשר (ללא CRM_) |
rel_item_key | "item_id" | עמודת הרשומה בטבלת הקשר |
rel_tag_key | "tag_id" | עמודת התגית בטבלת הקשר |
rel_more_fields | [] | מערך [עמודה => ערך] שנכתב בכל שורת קשר חדשה |
עם query נשמר |id||id| בעמודה. עם rel_table השדה גם מוחק את שורות הרשומה בטבלת הקשר (DELETE FROM CRM_<rel_table> WHERE <rel_item_key> = (int)$id) וכותב מחדש שורה לכל תגית. mcp_write מחזיר JSON של שמות ופותר מזהים מספריים לשמות. api_schema מסוג tags.
$allow_ip = new FormInput_Tags("allow_ip");
$allow_ip->title = "כתובות IP מורשות";
$frmForm->push($allow_ip);
rel_table צריך את ה-id של הרשומה. ברשומה חדשה הגדירו $tags->requireID = true, אחרת השדה רץ לפני ה-INSERT ללא id.תיבות סימון ומתגים#
FormInput_Checkbox#
| מאפיין | ברירת מחדל |
|---|---|
oneTD | true |
trClass | "checkbox" |
נשמר "1" או "0". כולל שדה מוסתר hidd_<name> כדי שגם תיבה לא מסומנת תישלח. המתודה IsCheckd() מחזירה אם התיבה מסומנת. api_schema מסוג boolean.
FormInput_NewCheckbox#
מרחיב את Checkbox. מוסיף label ומציג בפריסת שתי עמודות (oneTD = false). שומר "1" או "0".
FormInput_Switch#
מרחיב את Checkbox. מציג מתג הפעלה, שומר "1" או "0". כדי להציג מתג דלוק בטופס חדש: $sw->value = true כשאין id.
$is_active = new FormInput_Switch("is_active");
$is_active->title = "פעיל";
if (!isset($_GET["id"])) $is_active->value = true;
$frmForm->push($is_active);
תאריכים ושעות#
| מחלקה | ממשק | מה נשמר |
|---|---|---|
Calendar | flatpickr (נטען מ-CDN), פורמט d/m/Y, עברית | Y-m-d H:i:00. "" אם לא נבחר חודש |
Date | לוח שנה ישן עם חלון קופץ | Y-m-d H:i:s כש-datetime (ברירת מחדל), אחרת timestamp גולמי |
DateAndTime | כמו Date עם withMinutes = true וטווח שנים מהשנה הנוכחית ועד חמש קדימה | Y-m-d H:i:s |
DateSimple | שלוש רשימות: שנה (1930 עד השנה הנוכחית), חודש, יום | תאריך. תאריך ריק נשמר "" |
Time | בורר HH:MM | date('H:i', strtotime(post)) |
minutes | בורר HH:MM | מספר דקות (ראו למעלה) |
FormInput_Calendar#
המומלץ לשימוש חדש. נשלח כ-<name>_year, <name>_month, <name>_day (וכש-withMinutes גם <name>_time בפורמט H:i).
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
withMinutes | להוסיף בחירת שעה | |
forceDate | תאריך קבוע שמוצג | |
datetime | true | |
minDate, maxDate, onSelectFunc | null | לא בשימוש בקוד, אין להסתמך עליהם |
mcp_write מפרק d/m/Y [H:i] או כל מחרוזת ש-strtotime מבינה לשדות המשנה. ForceResults($str) קובע את forceDate.
$start = new FormInput_Calendar("start_date");
$start->title = "תאריך התחלה";
$start->withMinutes = true;
$frmForm->push($start);
FormInput_Date, DateAndTime, DateSimple#
Date: המאפיינים withMinutes (false), forceDate (null), datetime (true). הערך נשלח בשדה מוסתר כ-timestamp, ועם withMinutes נוספים <name>_hour ו-<name>_min. DateSimple מוסיף forceVal שנקבע דרך ForceValue($str).
קבצים ותמונות#
כל שדות הקבצים יורשים מ-AJAXFile, שמעלה את הקובץ בנפרד (AJAX) ושומר ב-DB את ה-id של הקובץ בטבלת storage (מספר שלם). ניקוי הקובץ שולח את המחרוזת "NULL", שמאפסת את העמודה. הסבר על שכבת האחסון ב-אחסון קבצים.
FormInput_AJAXFile#
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
types | סוגי קבצים מותרים | |
dir | תיקיית היעד (נשלחת כ-path) | |
Width, Height | מידות להמרה | |
img_max_width, img_max_height | הגבלת מידות מקסימליות | |
img_convert | "" | פורמט להמרה |
image_background_color | "#FFFFFF" | רקע להמרה |
image_ratio_fill | false | מילוי ביחס |
storage_object_type, storage_object_id | שיוך הקובץ לאובייקט | |
str_upload_text | מחרוזת _UPLOAD_FILE_ | טקסט כפתור ההעלאה |
str_remove_text | מחרוזת _REMOVE_FILE_ | טקסט כפתור המחיקה |
process_func | NULL | fn(\Verot\Upload\Upload $handle, $db_id), מופעל על הקובץ לפני השמירה. $db_id משמעותי רק עם requireID = true |
remote | NULL | יעד אחסון מרוחק |
has_effects | false |
ההעלאה נחתמת בטוקן MISC::encode(name|json(Width,Height,img_convert,image_background_color,image_ratio_fill)), כך שלא ניתן לשנות את הפרמטרים מהדפדפן. הקובץ נוסף ב-storage->Add עם path, clear => true, remote (אם הוגדר), name, object_type, object_id ומגבלות img_max_*.
בשגיאת העלאה השדה מבצע die("UPLOAD ERROR"), כלומר הטופס מת באמצע ולא מחזיר "ERROR" מסודר.
FormInput_drop#
אזור גרירה והעלאה, הבחירה המומלצת לתמונות וקבצים. מרחיב את AJAXFile ומוסיף:
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
require_copyrights | false | חובה למלא קרדיט |
allow_edit_copyrights | false | לאפשר עריכת קרדיט |
require_description | false | חובה למלא תיאור |
allow_edit_description | false | לאפשר עריכת תיאור |
uid | מזהה ייחודי של האלמנט | |
ai_image_enabled | false | מופעל אוטומטית כש-FORM::$allow_ai ושירות wizzoai פעיל |
ai_image_settings | [] | |
suggest_ai | false |
ai_image(array $settings) מפעיל יצירת תמונה ב-AI. ברירות המחדל: quick_button true, advanced_button true, context_fields [], default_prompt "", image_size "wide", model "", provider "".
get_results מקבל את הקובץ באחת משלוש דרכים: _edit (העלאה זמנית), _sid מספרי (קובץ קיים ב-storage, ובמקרה כזה גם מעדכן את העמודות copyrights ו-description של שורת ה-storage מ-_edit_copyrights ו-_edit_description), או _sid שמכיל base64 (STORAGE::addFromBase64, עם _realName ו-_ext). _removePrev == "remove" מחזיר "NULL". api_schema מגדיר את המפתחות sid, url, credits, description.
המחלקות FormInput_drop_file, FormInput_drop_file_gallery, FormInput_Image, FormInput_StorageFile ו-FormInput_ImageEditor הן תת-מחלקות ריקות של drop עם אותה התנהגות בדיוק, שקיימות לתאימות לאחור.
$image = new FormInput_drop("image");
$image->title = "תמונה";
$image->dir = "media/pages";
$image->Width = 1200;
$image->require_copyrights = true;
$frmForm->push($image);
FormInput_File#
העלאה ישנה ללא AJAX. requireID = true ו-has_effects = false. מאפיינים: types, dir. שומר את סיומת הקובץ ומעתיק אותו ל-<dir>/<id>.<ext>. מתודת עזר: GetFileData().
המימוש משתמש ב-eregi, שהוסרה ב-PHP 7. הגדרת types גורמת ל-fatal error. השתמשו ב-FormInput_drop.
FormInput_Gallery#
גלריית תמונות. מרחיב את AJAXFile.
| מאפיין | ברירת מחדל |
|---|---|
save_to_db | false |
requireID | true |
editURL | false |
התמונות הן שורות storage (object_type, object_id, ord). פריט חדש מקושר זמנית עם object_id = -1 ומוצמד לרשומה בשמירה לפי <name>_ids. הפעולות (מחיקה, עדכון) עוברות דרך system/Tools/GalleryActions עם טוקן. טוען jQuery UI ו-jquery.form מ-CDN. get_results מחזיר null.
FormInput_VGallery#
גרסה מודרנית של Gallery (תמונה ממוזערת 300x270, מיון בגרירה). אותם ערכי ברירת מחדל (save_to_db false, requireID true, editURL false). בשמירה קורא את <name>_ids ואת <name>_order (מחשב מחדש את ord). פעולות עם טוקן: remove, update_details, updateName, set_order, download.
ב-Gallery וב-VGallery ערכי <name>_ids נכנסים ל-SQL בלי המרה למספר שלם. הערכים מגיעים מהדפדפן של משתמש מחובר באדמין, אבל כדאי להמיר ל-(int) בתוך המחלקה כשנוגעים בה.
עורכי טקסט עשיר#
FormInput_HTMLEditor#
עורך HTML.
| מאפיין | ברירת מחדל |
|---|---|
width | |
height | 400 |
has_effects | false |
שם שדה ה-POST הוא name ועוד מזהה ייחודי (time(), נשלח גם כ-<name>_unique). get_results מחזיר "ERROR" כש-must והערך ריק, ושומר HTML. api_schema מסוג html. FormInput_MiniEditor ו-FormInput_text_editor יורשים ממנו ומציירים גרסה קטנה (MISC::create_editor_mini) וגרסה חדשה (MISC::create_editor_new) של העורך.
ה-HTML נשמר כמו שהוא. בתצוגה בצד האתר הוא חייב לעבור סינון לפי מודל האבטחה, במיוחד אם הכתיבה פתוחה לא רק למנהלים.
FormInput_WZ_Editor#
מרחיב את Text. עורך ה-WZ החדש.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
height | 400 | |
editorOptions | [] | אפשרויות מועברות לעורך |
plugins | קבוצות כלים ברירת מחדל |
העלאת קבצים מהעורך עוברת ל-{admin}/storage/wz_editor_upload. אם השדה לא נשלח בכלל: "ERROR" כש-must, אחרת לא נשמר כלום. אחרת ההתנהגות הבסיסית, וה-HTML נשמר.
סיסמאות ואבטחה#
FormInput_Password#
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
encryption | "md5" | md5, bcrypt (הספרייה bcrypt), encode (MISC::encode), או שם כל פונקציה (נקראת עם call_user_func) |
strong | false | דורש סיסמה חזקה |
סיסמה ריקה, או המחרוזת "null", לא נשמרת (עריכה בלי החלפת סיסמה). המתודה isPasswordStrong($password) דורשת לפחות 8 תווים, אות גדולה, אות קטנה, ספרה ותו מיוחד.
$password = new FormInput_Password("password");
$password->title = "סיסמה";
$password->encryption = "bcrypt";
$frmForm->push($password);
עם strong = true ו-get_html, המימוש מפנה למשתנה $password שלא הוגדר (שגיאה ב-PHP 8), ובסיסמה חלשה get_results מחזיר false ולא "ERROR". ה-JS גם מניח שמזהה הטופס הוא frmAdmins. אל תסתמכו עליו מחוץ ל-Admins.
ברירת המחדל md5 חלשה לאחסון סיסמאות. הגדירו encryption = "bcrypt" בכל שימוש חדש. ראו גם מודל האבטחה.
FormInput_RePassword#
אימות סיסמה. בנאי: __construct($strInpName, $inpPassword), כש-$inpPassword הוא אובייקט ה-FormInput_Password של אותו טופס. save_to_db = false. מחזיר "ERROR" כשהערכים לא זהים (או כשהערך הוא "null"), אחרת "".
$password = new FormInput_Password("password");
$frmForm->push($password);
$re = new FormInput_RePassword("repassword", $password);
$re->title = "אימות סיסמה";
$frmForm->push($re);
FormInput_SecCode#
תמונת אבטחה מ-system/Tools/securityPic. מחזיר "ERROR" על קוד שגוי ואינו שומר כלום. הקוד נגזר מ-substr(hexdec(md5(UA . site_url . random_num . "F j")), 2, 6).
צבע, קישורים ו-SEO#
FormInput_Color#
בורר צבע. נשמר ה-hex בלי # (לאחר trim), והתצוגה מוסיפה אותו. מחזיר "ERROR" כש-must והערך ריק. FormInput_Color_OLD מרחיב את Text עם בורר spectrum ישן, ומסיר גם הוא את ה-#.
FormInput_SeoUrl#
כתובת SEO לדף. מאפיינים: pageUrl (תבנית עם המציין __NEWID__), requireID (true). שם הקלט קבוע, SeoUrl, ולכן אפשר רק אחד בטופס. נשמר בטבלה seoUrl (pageurl, sysname), מוחק את מטמון seoUrl_tbl, ומחזיר "ERROR" אם ה-sysname תפוס על ידי דף אחר. לא נשמר דבר בשורת הטופס (get_results מחזיר null). ראו כתובות SEO.
FormInput_SEO#
מטא-נתוני SEO לדף: כותרת, תיאור, מילות מפתח ו-Open Graph.
בנאי: __construct($strName, $json_field = false).
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
key | page_key בטבלת seo_center. אפשר __NEWID__ | |
requireID | true | |
save_to_db | false | |
is_by_url | "0" | |
seo_fields | סלקטורים של title, description, content בדף, לשימוש מנתח ה-SEO | |
focus_keyphrase | ביטוי המפתח | |
pageUrl | כשמוגדר, נוסף שדה SeoUrl | |
json_field | מהבנאי. עם true: save_to_db = true ו-requireID = false |
תת-השדות: meta_title (עד 60 תווים), title_include_sitename, meta_description (50 עד 160), meta_keywords, og_title, og_description, og_image (שדה drop, dir "media/seo", Width 1200).
ללא json_field השדה כותב שורה אחת בטבלת seo_center (page_key = key, is_by_url, תת-השדות) ומחזיר null. עם json_field הוא מחזיר [name => JSON של תת-השדות] לעמודה בטבלת הרשומה. ב-api_schema הוא writable: false ומחזיר sub_fields, וב-MCP תת-שדות שלא נשלחו שומרים את הערך השמור.
$keywords = new FormInput_SEO("seo");
$keywords->key = "page___NEWID__";
$frmForm->push($keywords);
כשמוגדר pageUrl, כתובת כפולה גורמת ל-_saveSeoUrl להחזיר "ERROR", אבל הקורא מתעלם ממנו. השמירה ממשיכה והכתובת הכפולה לא נשמרת, בלי הודעה למשתמש. בדקו כפילות בעצמכם.
מבני נתונים ו-JSON#
FormInput_JSONEdit_ex#
טבלת שורות חוזרות. מאפיין titles הוא מערך של אובייקטי FormInput. set_var($key, $placeholder) מוסיף עמודה: מחרוזת הופכת לשדה FormInput_Text שהכותרת שלו היא המחרוזת. נשמר json_encode($_POST[name]) של מערך השורות, ו-"" אם הערך אינו מערך.
$links = new FormInput_JSONEdit_ex("links");
$links->title = "קישורים";
$links->set_var("label", "טקסט");
$links->set_var("href", "כתובת");
$frmForm->push($links);
FormInput_JSONEdit#
טבלת מפתח וערך (key_<name>[], val_<name>[]). נשמר אובייקט JSON {key: value}.
FormInput_Array, FormInput_Array_exp, FormInput_Json#
יורשים מ-Text ומציירים עורכי JSON ב-Vue (התבניות assets/FormInput_Array/index.tpl, assets/FormInput_Array_exp/index.tpl, assets/json_builder/index.tpl). הערך נשלח כטקסט JSON ב-textarea מוסתר בשם name, ונשמר כמחרוזת JSON. mcp_write מקודד מערך ואובייקט ל-JSON.
FormInput_Dynamic_fields#
יורש מ-Text, אבל get_results שלו ריק ולכן לא נשמר כלום. אם אתם צריכים שדות דינמיים שנשמרים, השתמשו ב-JSONEdit_ex או ב-Json.
תזמון#
FormInput_CronTime#
תזמון בסגנון cron בחמישה שדות נפרדים. נשלח כ-crontime_minute, crontime_hour, crontime_day, crontime_month, crontime_weekday (שמות קבועים, ולכן אחד בטופס), ונשמר כמחרוזת אחת "m h d mo wd". הערך ההתחלתי יכול להיות מחרוזת או מערך.
FormInput_CronTimePro#
בורר תזמון ב-Vue. מאפיין help_url (false). נשלח שדה אחד בשם name עם מחרוזת cron, מרופדת או חתוכה ל-5 חלקים. ברירת המחדל "* * * * *".
| חתימה | החזרה | הערה |
|---|---|---|
static get_presets(): array | מערך 19 תבניות מוכנות | |
static humanize(string $expr): string | תיאור בעברית של הביטוי |
$this->load->library("forms/FormInput_CronTimePro");
echo FormInput_CronTimePro::humanize("*/5 * * * *");
$crontime = new FormInput_CronTimePro("crontime");
$crontime->title = "תזמון";
$crontime->Must();
$frmForm->push($crontime);
התראות Push#
FormInput_PushManager#
ניהול התראות מתוזמנות לרשומה. requireID = true, save_to_db = false, מאפיין item_type. קורא את $_POST["pushmanager_notifications"] (מערך JSON של {id, title, message, date, time}) וכותב לטבלה push_manager (item_type, item_id, title, content, date_send). שורות שכבר נשלחו (is_send = 1) לא נוגעים בהן.
item_type משורשר ל-SQL בלי escape, והוא ערך שהמפתח קובע בקוד. אל תמלאו אותו מקלט משתמש.שירותי שוק#
שלושת השדות האלה יורשים מ-Text ותלויים בשירות חיצוני.
FormInput_WizzoStream#
סרטוני Wizzo Stream.
| מאפיין | ברירת מחדל | הערה |
|---|---|---|
api_key | "" | אם ריק, market_service::api_key("wizzostream") |
api_ping | "" | |
ws_settings | false | |
disable_chunks | false | |
api_url | "https://api.wizzo.stream/api_wizzocms/" |
נשמר ערך הטקסט (get_results הבסיסי).
FormInput_payme#
שדה תשלום מאובטח (Hosted Fields) של PayMe. מאפיינים: api_key, api_ping, name. בלי api_key מוצגת הודעה בעברית. טוען את hostedfields.js מה-CDN של PayMe, וכש-must הוולידציה בצד הלקוח קוראת ל-orderApp.handleFormSubmit(). זה קוד תשלומים: מתועדת החתימה בלבד.
מחלקת Form ו-AJAXForm#
השדות נדחפים לאובייקט Form (או AJAXForm, שמגיש ב-AJAX). השדות החשובים לשימוש עם FormInput:
| חתימה | הערה |
|---|---|
new Form($strFormName) | שם הטופס משמש גם לשדה isFormSent_<name> |
update_mode($id) | טוען את השורה (DB::query עם editLang) למצב עריכה. קובע db_id ו-db_row |
push($inpInput) | מוסיף שדה, לפי perms ושפת העריכה (ראו למעלה). שדה must מקבל פונקציית ולידציה בשם CheckData_<form>_<name> |
RemoveInput($strInputName) | מסיר שדה |
GetInputByName($strInputName) | מחזיר את אובייקט השדה |
ChangeContentTable($tblName, $queryKey) | מגדיר טבלת תוכן ועמודת קשר (parentId כברירת מחדל) |
IsFormSent() | האם הגיע POST של הטופס |
get_html() | מציג את הטופס |
save() | אם הטופס נשלח: MakeSave(), הדפסת successFunc כשמצליח, ומחזיר הודעת הצלחה או כישלון |
MakeSave() | השמירה עצמה. מחזיר bool |
UnSend() | מבטל את דגל השליחה |
פרטים נוספים על המאפיינים (tpl, groups, successFunc, table) ב-מדריך הטפסים.
ראו גם#
- טפסים: בניית טופס שלם, קבוצות ותבניות
- panel_table ו-רפרנס panel_table: הטבלה שמובילה לטפסים
- בניית פאנל ניהול
- AI בטפסים
- ממשק JSON של הניהול
- רפרנס הניהול