שדות טופס: FormInput

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

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

כל שדה בטופס הוא מחלקה 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_dbfalse: השדה לא נשמר לעמודה (שדות תצוגה וקשרים)
requireIDtrue: השדה נשמר אחרי ה-INSERT, כשהמזהה כבר ידוע
forceValuetrue: לא לדרוס את הערך מהשורה
mustנקבע ב-$input->Must() (חובה)
$title = new FormInput_Text("title");
$title->title = "כותרת";
$title->placeholder = "למשל: חדשות היום";
$title->Must();
$frm->push($title);

טקסט ומספרים#

שדהמאפייניםנשמר
FormInput_Textmaxlength, dir (ltr, rtl, auto)מחרוזת
FormInput_Numberמחרוזת (אין בדיקת מספר בשרת)
FormInput_NumberInpmin, max, is_nullמספר; ריק עם is_null נשמר כ-NULL
FormInput_Phoneמחרוזת; בדיקה בדפדפן שהמספר מתחיל ב-0
FormInput_Emailמחרוזת
FormInput_URLמחרוזת (מוסיף http:// אם אין פרוטוקול)
FormInput_Textareamaxlength, minlengthמחרוזת
FormInput_Hiddenמחרוזת
FormInput_Colorצבע hex בלי #
FormInput_LatLngsecond_field"lat,lng", או שתי עמודות
FormInput_FAHTML של אייקון 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_Selectoptions, set_var($key, $label), selectedID, sizeהמפתח הנבחר
FormInput_SelectDBquery (אובייקט DB::query), queryKey (id), queryVal (name)המפתח
FormInput_MultiSelectquery, queryKey, queryVal, label, size|1||2|
FormInput_Radio, FormInput_RadioDBכמו Select ו-SelectDBהמפתח
FormInput_InpCheckboxquery, queryKey, queryVal, options|1||2|
FormInput_AutocompleteDBquery, queryKey, queryVal, urlהמפתח
FormInput_MGZ_AutoCompleteDBquery, queryKey, queryVal, allow_insertהמזהה (יוצר שורה חדשה אם לא קיים)
FormInput_Tagsquery, 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_NewCheckboxNewCheckbox מוסיף label"1" או "0"
FormInput_Passwordencryption: "md5" (ברירת מחדל), "bcrypt", "encode" או פונקציהhash; ערך ריק לא דורס את הקיים
FormInput_RePasswordnew 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_VGallerystorage_object_type, dir, Width, Height, types, editURLלא נשמר בעמודה; הקבצים נקשרים דרך storage.object_type ו-object_id
FormInput_Filetypes, 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, forceDateY-m-d H:i:00; ריק לא נשמר
FormInput_Dateלוח שנה ישן. withMinutes, datetime, forceDatetimestamp (מספר שניות); עם 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_CronTimeProCronTimePro הוא הבונה המודרני עם תיאור בעברית"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_SecCodecaptchaלא

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.

ראו גם#

מצאתם טעות או חוסר? תקנו את הדף או פתחו Issue בריפו. התיעוד נכתב מתוך הקוד של ליבה 5.0.115.