כל שדה בטופס הוא מחלקה FormInput_<Type> שיודעת להציג את עצמה (get_html) ולהחזיר מה לשמור (get_results). הדף הזה הוא קטלוג קצר: איזה שדה מתאים למה, אילו מאפיינים הוא מקבל ומה נכתב לעמודה. את כל המאפיינים והמתודות תמצאו ב-רפרנס שדות טופס, ואת מחזור הטופס ב-טפסים.
system/ הוא תיקיית הליבה (api/core בריפו). קוד השדות נמצא ב-system/libraries/forms/ (FormInputs.php ועוד קבצים לפי שדה).
מאפיינים משותפים#
כל שדה נבנה עם new FormInput_Type("שם_העמודה") ומקבל:
| מאפיין | משמעות |
|---|---|
title | התווית |
placeholder | טקסט רמז |
value | ערך ברירת מחדל (בעריכה נדרס מהשורה) |
table | "conf" (ברירת מחדל, טבלה ראשית) או "content" (טבלת תוכן לפי שפה) |
group | מפתח קבוצה כשהטופס ב-tpl = "groups" |
className, style | מחלקת CSS וסגנון |
perms | הרשאה נדרשת (push מדלגת על השדה למי שאין לו) |
save_to_db | false: השדה לא נשמר לעמודה (שדות תצוגה וקשרים) |
requireID | true: השדה נשמר אחרי ה-INSERT, כשהמזהה כבר ידוע |
forceValue | true: לא לדרוס את הערך מהשורה |
must | נקבע ב-$input->Must() (חובה) |
$title = new FormInput_Text("title");
$title->title = "כותרת";
$title->placeholder = "למשל: חדשות היום";
$title->Must();
$frm->push($title);
טקסט ומספרים#
| שדה | מאפיינים | נשמר |
|---|---|---|
FormInput_Text | maxlength, dir (ltr, rtl, auto) | מחרוזת |
FormInput_Number | מחרוזת (אין בדיקת מספר בשרת) | |
FormInput_NumberInp | min, max, is_null | מספר; ריק עם is_null נשמר כ-NULL |
FormInput_Phone | מחרוזת; בדיקה בדפדפן שהמספר מתחיל ב-0 | |
FormInput_Email | מחרוזת | |
FormInput_URL | מחרוזת (מוסיף http:// אם אין פרוטוקול) | |
FormInput_Textarea | maxlength, minlength | מחרוזת |
FormInput_Hidden | מחרוזת | |
FormInput_Color | צבע hex בלי # | |
FormInput_LatLng | second_field | "lat,lng", או שתי עמודות |
FormInput_FA | HTML של אייקון FontAwesome או <svg> |
עורכי תוכן עשיר:
| שדה | הערות |
|---|---|
FormInput_WZ_Editor | העורך המודרני. height (400), editorOptions, plugins. מעלה קבצים ל-{admin}/storage/wz_editor_upload |
FormInput_HTMLEditor, FormInput_MiniEditor, FormInput_text_editor | עורכי HTML ישנים. height (400) |
$body = new FormInput_WZ_Editor("body");
$body->title = "תוכן";
$body->height = 500;
$body->table = "content";
$frm->push($body);
בחירה#
| שדה | מאפיינים | נשמר |
|---|---|---|
FormInput_Select | options, set_var($key, $label), selectedID, size | המפתח הנבחר |
FormInput_SelectDB | query (אובייקט DB::query), queryKey (id), queryVal (name) | המפתח |
FormInput_MultiSelect | query, queryKey, queryVal, label, size | |1||2| |
FormInput_Radio, FormInput_RadioDB | כמו Select ו-SelectDB | המפתח |
FormInput_InpCheckbox | query, queryKey, queryVal, options | |1||2| |
FormInput_AutocompleteDB | query, queryKey, queryVal, url | המפתח |
FormInput_MGZ_AutoCompleteDB | query, queryKey, queryVal, allow_insert | המזהה (יוצר שורה חדשה אם לא קיים) |
FormInput_Tags | query, queryKey, queryVal, allow_insert, rel_table, rel_item_key, rel_tag_key, rel_more_fields | |id||id| (או |ערך| בלי query) |
// אפשרויות ידניות
$dir = new FormInput_Select("direction");
$dir->title = "כיוון";
$dir->set_var("rtl", "מימין לשמאל");
$dir->set_var("ltr", "משמאל לימין");
$frm->push($dir);
// מטבלה
$cat = new FormInput_SelectDB("cat_id");
$cat->title = "קטגוריה";
$cat->query = DB::query("categories", [], "name");
$cat->queryVal = "name";
$frm->push($cat);
// תגיות עם טבלת קשר
$tags = new FormInput_Tags("tags");
$tags->title = "תגיות";
$tags->query = DB::query("tags");
$tags->rel_table = "articles_tags";
$tags->rel_item_key = "article_id";
$tags->rel_tag_key = "tag_id";
$tags->save_to_db = false;
$tags->requireID = true; // טבלת הקשר נכתבת אחרי שהמזהה ידוע
$frm->push($tags);
FormInput_Select מצפה למערך $options[מפתח]["title"], ו-set_var עושה את זה בשבילכם. ערכים שנשמרים בפורמט |1||2| נקראים בחזרה עם MISC::bgl_explode.
FormInput_Tags בלי query שומר את המילים עצמן (|ערך|). עם query הוא מחפש את המילה בעמודת queryVal של הטבלה, יוצר שורה חדשה אם אין ו-allow_insert פעיל, ושומר את ה-id. כש-rel_table מוגדר הוא גם מוחק ומכניס מחדש את שורות הקשר של הפריט בכל שמירה, ולכן בשימוש עם rel_table הגדירו requireID = true, כדי שבהוספת פריט חדש השדה יישמר אחרי שנוצר המזהה.מתגים וסיסמאות#
| שדה | הערות | נשמר |
|---|---|---|
FormInput_Switch | המתג הסטנדרטי | "1" או "0" |
FormInput_Checkbox, FormInput_NewCheckbox | NewCheckbox מוסיף label | "1" או "0" |
FormInput_Password | encryption: "md5" (ברירת מחדל), "bcrypt", "encode" או פונקציה | hash; ערך ריק לא דורס את הקיים |
FormInput_RePassword | new FormInput_RePassword($name, $passwordInput) | לא נשמר; שגיאה אם לא תואם |
ברירת המחדל של FormInput_Password היא md5, שאינה מתאימה לסיסמאות. הגדירו תמיד $password->encryption = "bcrypt" (כך עושה גם פאנל Admins), ובצד האימות השתמשו בהשוואה שמתאימה לשיטה שבחרתם.
קבצים ותמונות#
| שדה | מאפיינים | נשמר |
|---|---|---|
FormInput_drop (וכינויים: FormInput_drop_file, FormInput_Image, FormInput_StorageFile, FormInput_ImageEditor) | dir, types, Width, Height, img_max_width, img_max_height, img_convert, image_ratio_fill, require_copyrights, allow_edit_copyrights, require_description, allow_edit_description, ai_image_enabled | מזהה קובץ ב-storage (מספר) |
FormInput_AJAXFile | הבסיס של drop (גרסה ישנה) | מזהה קובץ ב-storage |
FormInput_VGallery | storage_object_type, dir, Width, Height, types, editURL | לא נשמר בעמודה; הקבצים נקשרים דרך storage.object_type ו-object_id |
FormInput_File | types, dir | שדה ישן |
FormInput_Gallery | גלריה ישנה |
$logo = new FormInput_drop("logo");
$logo->title = "לוגו";
$logo->dir = "media/buttons"; // תיקייה תחת storage
$frm->push($logo);
בטבלה מציגים תמונה עם "type" => "image" (מזהה storage מומר ל-URL בעצמו). בטופס, הסרת תמונה נשמרת כ-NULL. פרטי STORAGE ב-אחסון.
תאריכים ושעות#
| שדה | הערות | נשמר |
|---|---|---|
FormInput_Calendar | הסטנדרטי (flatpickr). withMinutes, minDate, maxDate, onSelectFunc, forceDate | Y-m-d H:i:00; ריק לא נשמר |
FormInput_Date | לוח שנה ישן. withMinutes, datetime, forceDate | timestamp (מספר שניות); עם datetime = true מחרוזת Y-m-d H:i:s |
FormInput_DateSimple | שלושה בוררים: שנה, חודש, יום | timestamp של חצות, או ריק; עם datetime = true מחרוזת Y-m-d H:i:s |
FormInput_DateAndTime | בוררי תאריך ושעה | timestamp; עם datetime = true מחרוזת Y-m-d H:i:s |
FormInput_Time | שעה | H:i |
FormInput_minutes | משך HH:MM | דקות (מספר) |
FormInput_CronTime, FormInput_CronTimePro | CronTimePro הוא הבונה המודרני עם תיאור בעברית | "m h d M w" |
$when = new FormInput_Calendar("publish_at");
$when->title = "מועד פרסום";
$when->withMinutes = true;
$frm->push($when);
SEO#
| שדה | הערות |
|---|---|
FormInput_SEO | בלוק SEO שלם: new FormInput_SEO($name, $json_field = false). מאפיינים: seo_fields, focus_keyphrase, pageUrl. כברירת מחדל שומר ב-seo_center וב-seoUrl, ובמצב $json_field JSON בעמודה |
FormInput_SeoUrl | כתובת ידידותית בלבד (pageUrl); requireID |
שימוש מלא ב-SEO למפתחי אתר וב-כתובות ידידותיות.
שדות תצוגה ושדות מורכבים#
| שדה | משמעות | נשמר |
|---|---|---|
FormInput_Label, FormInput_HTML | טקסט או HTML בשורה (value) | לא |
FormInput_ValueLabel | ערך לקריאה בלבד | לא |
FormInput_Var | ערך קבוע שנשמר תמיד (value) | כן, לא מוצג |
FormInput_JSONEdit, FormInput_JSONEdit_ex | זוגות מפתח וערך או טבלת שורות | JSON |
FormInput_Json, FormInput_Array, FormInput_Array_exp | עורכי JSON ומערך | מחרוזת JSON |
FormInput_PushManager | תזמון התראות לפריט (item_type) | בטבלה push_manager |
FormInput_WizzoStream | העלאת וידאו ל-WizzoStream | מזהה וידאו |
FormInput_SecCode | captcha | לא |
FormInput_Label שימושי להפרדה בין חלקי טופס:
$lbl = new FormInput_Label("lbl_login");
$lbl->value = "<b>פרטי התחברות</b>";
$frm->push($lbl);
כתיבת שדה משלכם#
מחלקת שדה מותאמת נכנסת ל-application/admin/includes/ (נטען אוטומטית בכל בקשת אדמין) ויורשת מ-FormInput. שלוש מתודות עיקריות:
class FormInput_Rating extends FormInput
{
var $max = 5;
function get_html()
{
$v = (int)($_POST[$this->name] ?? $this->value);
$h = "";
for ($i = 1; $i <= $this->max; $i++) {
$h .= "<label><input type='radio' name='" . htmlspecialchars($this->name)
. "' value='$i' " . ($v == $i ? "checked" : "") . "> $i</label> ";
}
return $h;
}
function get_results($id)
{
$this->db_id = $id;
if ($this->mcp_skip_absent($id)) return [];
$v = (int)($_POST[$this->name] ?? 0);
if ($this->must && !$this->must_allow_ignore && $v == 0) return "ERROR";
return [$this->name => $v];
}
function api_schema()
{
return [
"label" => $this->title,
"required" => (bool)$this->must,
"writable" => true,
"input" => ["value" => ["type" => "number"]],
];
}
}
חוזה get_results($id): החזרת "ERROR" עוצרת את השמירה, מערך [עמודה => ערך] נכתב לשורה (אפשר להחזיר כמה עמודות), ומערך ריק או "" אומר "אין מה לשמור". api_schema מתארת את השדה ל-ממשק ה-AI.
get_html ו-get_results מקבלים קלט גולמי. בהדפסה השתמשו ב-htmlspecialchars/MISC::special_chars, ובשמירה אל תכתבו SQL ידני בלי DB::escape.ראו גם#
- טפסים: מחזור הטופס, ולידציה ורב-לשוניות
- רפרנס שדות טופס
- בניית פאנל חדש
- אחסון (Storage)
- AI בטפסים