panel_table (אפשרויות)

רפרנס מלא לטבלת הניהול panel_table: כל המאפיינים עם ברירות מחדל, מפתחות עמודה, סוגי סינון, פעולות, עריכה בתוך הטבלה, מיון, עימוד, ייצוא Excel, פרוטוקול ה-POST והמתודות הציבוריות.

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

panel_table (api/core/libraries/panel_table.php, בפריסה system/libraries/panel_table.php) היא טבלת הניהול הסטנדרטית: רכיב Vue שמצויר מהשרת, עם עימוד, חיפוש, סינון לפי עמודה, עריכה בתוך השורה, מיון בגרירה, פעולות לשורה ולקבוצה וייצוא ל-Excel. הדף הזה הוא הרפרנס לכל אפשרות. מדריך בנייה של פאנל שלם נמצא במדריך panel_table ובבניית פאנל ניהול.

השימוש: יוצרים אובייקט, מגדירים מאפיינים, וקוראים ל-get_html(). כל פעולה בטבלה (עימוד, חיפוש, מחיקה, עריכה, מיון, ייצוא) היא POST JSON לאותה כתובת של הדף, ש-get_html() מזהה לפי tbl_action.

$lstListManager = new panel_table("pgs");
$lstListManager->title = "עמודי תוכן";

$lstListManager->titles = [
    ["title" => "id", "field" => "id", "type" => "number"],
    ["title" => "noDelete", "field" => "noDelete", "editable" => true, "type" => "boolean"],
    ["title" => "כותרת", "field" => "title", "editable" => true, "editable_table" => "content"],
    ["title" => "URL", "func" => function($row){
        $url = ROUTER::get_by_url("pages/" . $row["id"]);
        return "<a target=\"_blank\" href=\"$url\">$url</a>";
    }],
];

$lstListManager->query = DB::query("pages", null, "id DESC");
$lstListManager->btn_add_url = CONFIG::$admin_url . "/Pages/insert";
$lstListManager->order_manager = false;

$lstListManager->delete = function ($id) {
    DB::delete("pages", ["id" => $id]);
    ROUTER::remove_by_url("pages/" . $id);
};

$lstListManager->actions = function ($rows) {
    return [
        ["title" => LANGS::get_word('EDIT'), "link" => "EDIT", "perms" => "edit", "target" => "inner",
         "icon" => '<i class="fas fa-edit"></i>'],
    ];
};

return $lstListManager->get_html();
מזהה הטבלה

הארגומנט של הבנאי (tblID) חייב להיות ייחודי בדף ויציב בין ה-GET ל-POST, כי השרת מזהה בו את הבקשה (data["tblID"] == tblID). בלי ארגומנט משתמשים במונה סטטי, שתלוי בסדר יצירת הטבלאות בדף.

הבנאי#

חתימההערה
__construct($tblID = false)tblID ריק מקבל ערך מהמונה הסטטי panel_table::$index. קורא את php://input ומפענח אותו ל-$this->data. קובע txt_add מהמילה _ADD_, direction מהפלטפורמה, ו-actions ל-closure שמחזיר []

הבנאי גם מחליט מראש על כמה דגלים:

  • בנייד (PAGE::is_mobile()) actions_side הופך ל-"right".
  • realtime_tracking דולק כששירות השוק wizzonow פעיל.
  • radar_tracking דולק כשהשירות kama פעיל, ואז radar_api_key נלקח מהשירות.
  • ai_insert_enabled דולק אם הוגדר ai_insert_default_prompt והשירות wizzoai פעיל.

מאפיינים#

נתונים ושאילתה#

מאפייןברירת מחדלמשמעות
title""כותרת הטבלה
titles[]הגדרות העמודות. ראו "עמודות"
queryfalseאובייקט DB::query(...) או מחרוזת SQL. עם מחרוזת: אין מיון בגרירה, ו-DELETE ועריכה דורשים id בתוצאה
rows_funcfalsefn($qu, $results). הערך המוחזר נקבע ב-$this->rows ושורות אלה מוצגות לפני תוצאות ה-DB
rowsfalseהשורות שנוספו על ידי rows_func
searchFuncnullfn($escapedQ): string. מקבל את מחרוזת החיפוש אחרי DB::escape ומחזיר תנאי SQL. בלעדיו החיפוש הוא LIKE על כל עמודות השאילתה
limit50שורות בעמוד
pgnm1מספר העמוד הנוכחי, נקרא מ-data.pgnm
default_order""ORDER BY ברירת מחדל, אחרי כל שאר המקורות (ראו "מיון")
name"report"חלק משם קובץ ה-Excel
more_data[]מידע נוסף שמוחזר ללקוח (בשימוש פנימי לתשובות פעולה)
data[]גוף הבקשה (JSON מפוענח)

כפתור הוספה ואלמנטים בראש הטבלה#

מאפייןברירת מחדלמשמעות
txt_addהמילה _ADD_טקסט כפתור ההוספה
btn_add_url""כתובת הוספה. כשהוגדרה, השרת שולח גם את הכותרת add_action: <btn_add_url> ומציב $_SERVER["HTTP_ADD_ACTION"]
btn_add_url_target"inner"יעד הפתיחה (inner לפאנל פנימי, popup)
head_html[]מערך מחרוזות HTML שמוצגות בסרגל העליון (כפתורים נוספים)
intro""HTML גולמי מעל הטבלה
intro_cardtrueהאם intro עטוף בכרטיס .pt_intro. עם false הוא מוצג כמו שהוא
additional_contentfalsefn($tbl). התוצאה חוזרת בשדה additional_content של תשובת השורות ומפעילה את אירוע jQuery additionalcontent
ai_insert_enabledfalseכפתור "צור עם AI"
ai_insert_default_prompt""הנחיית ברירת מחדל ליצירה עם AI
excel_import_enabledtrueכפתור ייבוא מ-Excel

בתוך intro עם intro_card אפשר להשתמש במחלקות העזר .pt_intro__head, .pt_intro__icon, .pt_intro__title, .pt_intro__text, .pt_intro__code, .pt_intro__chips, .pt_intro__actions.

HTML בתאים

הלקוח מציג ערכי תאים עם v-html. הפלט של func (ושל intro, head_html) חייב להיות מוצא באחריות המפתח (MISC::special_chars), אחרת זו פרצת XSS.

פעולות, הרשאות ומחיקה#

מאפייןברירת מחדלמשמעות
actionsclosure שמחזיר []fn($row): array מחזיר את פעולות השורה. ראו "פעולות"
group_actions[]פעולות לשורות מסומנות. ראו "פעולות קבוצה"
actions_side"left""left", "right", או מספר: אינדקס עמודה שמתחתיה מוצגות הפעולות (ב-Pages.php: 2)
deleteNULLfn($id, $row). מפעיל מחיקה: כפתור מחיקה בשורה ופעולת קבוצה, מותנים בהרשאה delete
dblclick_urlNULLכתובת שנפתחת בלחיצה כפולה על שורה (מתווספת פעולה "כניסה")
line_classNULLfn($row). מחלקת CSS על שורה
ignore_permsfalseמתעלם משדה perms של עמודות ופעולות. שבור, ראו אזהרה
argtogetDelete""לא בשימוש
ignore_perms משבית את get_actions

עם ignore_perms = true, get_actions לא מציב את המשתנה $ret, ו-array_map מקבל null וזורק TypeError (ממצא ADMIN-30). עד שיתוקן, אל תפעילו אותו על טבלה שיש לה actions או delete.

מיון בגרירה#

מאפייןברירת מחדלמשמעות
order_managertrueמיון בגרירה. מכובה אוטומטית אם query אינו אובייקט DB::query, ואם המשתמש בחר מיון לפי עמודה
order_manager_external_tblfalseלהחזיק את הסדר בטבלה חיצונית panel_table_order ולא בעמודת ord
order_manager_external_key""המפתח (type) של הטבלה בטבלת הסדר החיצונית
order_successfalsecallable שרץ אחרי שמירת סדר
order_manager דולק כברירת מחדל ומשנה את הסכמה

כשהוא דולק וללא טבלה חיצונית, init() מריץ DESCRIBE על הטבלה, ואם אין עמודה ord מריץ ALTER TABLE ... ADD ord INT NOT NULL (בשקט). כבו אותו (order_manager = false) בכל טבלה שלא מתכוונים לסדר, ובמיוחד בטבלאות גדולות.

מעקב בזמן אמת ורדאר#

מאפייןברירת מחדלמשמעות
realtime_trackingלפי שירות wizzonowמעקב עריכה בזמן אמת
realtime_tracking_urls[]כתובות לעקוב אחריהן. מוסיפים עם realtime_tracking_add_url()
realtime_keyfalseמפתח מעקב
radar_trackingלפי שירות kamaחיבור לרדאר
radar_url_funcnullfn($row): כתובת האתר של השורה, שמוצגת ברדאר (מחזיר נתיב, והטבלה מוסיפה / בתחילתו)
radar_api_keynullמפתח השירות
directionכיוון הפלטפורמהrtl או ltr
queryType, linesלא בשימוש

עמודות#

titles הוא מערך של מערכים. לכל עמודה:

מפתחמשמעות
titleכותרת העמודה (HTML)
fieldשם העמודה בשאילתה. בלעדיו העמודה מחושבת על ידי func
typeסוג העמודה. ברירת מחדל "text". עמודה עם field == "id" מקבלת "id"
funcfn($row, $title): מחזיר את הערך המוצג (HTML)
linkמחרוזת או fn($row, $title): הופך את התא לקישור
editabletrue או fn($row, $title) שמחזיר true: עריכה בתוך הטבלה
editable_table"conf" או "content": איזו טבלה מעדכנים כשעורכים
editable_field_tableשם טבלה אחרת (בלי CRM_) לעדכון לפי id
editable_field_funcfn($row, $value, $title): שמירה מותאמת
editable_successfn($row, $value, $title) שרץ אחרי שמירה מוצלחת
confirmכותרת חלון אישור לפני שמירה בעריכה
select_optionsאפשרויות לעמודות select, multiselect, list: מערך [id => טקסט]
filter_funcfn($fieldObj, $GetVal): string: תנאי SQL מותאם לסינון העמודה
permsהרשאה נדרשת לראות את העמודה (נבדקת ב-ADMIN::has_perms, אלא אם ignore_perms)
classnameמחלקת CSS על תא העמודה
stylestyle על תא העמודה

עמודה שאינה מערך נזרקת. העמודות עוברות json_encode ללקוח, ולכן closures שבתוכן לא מגיעים אליו.

סוגי עמודה#

typeתצוגהסינוןעריכה בתוך הטבלה
idהמספרשוויון (= (int))לא
text (ברירת מחדל)הערךLIKE '%q%'תיבת טקסט (Ctrl+Enter שומר)
numberהערךטווח from ו-toשדה מספר
booleanהערךבחירהמתג
selectהתווית מתוך select_optionsשוויוןרשימה
multiselectכמו selectIN (...)לא
listערכים מופרדים ב-", "LIKE '%|id|%'רשימה
dateY-m-dטווח תאריכיםתאריך
datetimeY-m-d H:iטווח תאריכיםdatetime-local
imageתמונה ממוזערת 70 על 70לא

פרטים לפי סוג:

  • image: אם הערך מספרי וגדול מ-0 הוא id בטבלת storage והתמונה נבנית ב-STORAGE::get_url; אחרת הערך נחשב כתובת. מוצגת כ-<img class="big_pic"> ב-70 על 70 פיקסלים עם object-fit: cover.
  • list: הערך נשמר בפורמט הרשימה של הליבה (|1||2|) ומפורק עם MISC::bgl_explode, ואז ממופה דרך select_options. הערך המקורי (original_value) הוא מערך.
  • date ו-datetime: ערך ריק או 0000-... מוצג כריק.
  • select: ערך שאין לו מפתח ב-select_options מוצג כמו שהוא.
אפשרויות נגזרות אוטומטית

עמודת select, multiselect או list בלי select_options מקבלת אפשרויות מ-SELECT * FROM (<query>) tbl GROUP BY tbl.<field>, והתווית היא תוצאת func אם קיימת. זה שאילתה על כל הטבלה בכל הצגה. בטבלה גדולה, או כשיש רק rows_func ואין query, הגדירו select_options בעצמכם.

classname ולא class

רק classname ו-style של העמודה מוחלים על התא בלקוח. מפתח class של העמודה, וגם class ברמת התא שהשרת מחזיר, לא נצרכים.

ערכי תא שהשרת מחזיר#

כל תא בתשובה הוא אובייקט {value, original_value, editable, link, select_options, class, style, field}. בכל שורה נוספים __actions_arr (הפעולות), __id, __class (מ-line_class) ו-__radar_url (כש-radar_tracking ו-radar_url_func). תווי בקרה מוסרים מערכי התאים, ונשארים רק התווים U+0020-U+007E ו-U+00A0-U+FFFF, כלומר ירידות שורה, טאבים ואימוג'י מחוץ ל-BMP נמחקים.

סינון וחיפוש#

הסינון מגיע ב-data.filters[field]. השדה חייב להתאים לעמודה בהגדרות, והערכים --all-- ו-"" מדלגים. הערך --none-- מסנן שורות ריקות: `field` IN ('', '0', NULL) (שים לב ש-NULL לעולם לא מתאים בתוך IN, כך שרק '' ו-'0' נמצאים בפועל).

סוג עמודהתנאי
עם filter_funcהתנאי שחוזר מ-filter_func($fieldObj, $GetVal)
id= (int)
textLIKE '%q%', ועוד ORDER BY IF(field = 'q', 1, 0) DESC שמקדים התאמה מדויקת
date, datetimeמערך של שני ערכים לא ריקים: >= ראשון AND < שני + יום
numberאובייקט {from, to} עם (float): >= ו-<=
select= 'ערך מוצא'
multiselectIN (...). ערכים לא-מספריים מוקפים במרכאות בלי escape
listLIKE '%|(int)|%'
ערך מספרי בסוג אחר=
אחרLIKE

חיפוש חופשי (data.q): אם הוגדר searchFunc, התנאי הוא searchFunc(DB::escape(q)). אחרת LIKE על כל עמודה שבשורה הראשונה של התוצאה (SELECT * FROM (...) LIMIT 0,1).

$lstListManager->searchFunc = function ($q) {
    // $q כבר עבר DB::escape
    return "(name LIKE '%" . $q . "%' OR email LIKE '%" . $q . "%')";
};
ערכי multiselect בסינון

ערכי סינון multiselect שאינם מספרים נכנסים ל-SQL במרכאות אך ללא DB::escape. כל עוד לא תוקן, הימנעו מעמודות multiselect בטבלה שנגישה למי שאינם מנהלים מהימנים, והעדיפו select או filter_func שמבצע escape.

השאילתה הסופית שנבנית:

SELECT * [, ordtbl.item_ord AS tbl_ord]
FROM (<sql>) AS tbl
[LEFT JOIN CRM_panel_table_order ordtbl ON ordtbl.type = '<key>' AND ordtbl.item_id = tbl.id]
WHERE true <search> AND (<filters>)
ORDER BY ...
LIMIT (pgnm-1)*limit, limit

מיון#

סדר המקורות לקביעת ORDER BY, מהחזק לחלש:

  1. data.ordBy ו-data.ordDir (המשתמש לחץ על כותרת עמודה). מכבה את order_manager לאותה בקשה. הערכים נכנסים ל-SQL ללא ולידציה.
  2. order_manager: tbl_ord ASC עם טבלה חיצונית, אחרת ord ASC.
  3. order_by של אובייקט ה-DB::query (הארגומנט השלישי של DB::query).
  4. default_order.
ordBy
ordBy ו-ordDir מגיעים מהלקוח ומשורשרים ל-ORDER BY. הפאנל נגיש רק למנהלים מחוברים, אבל אל תעתיקו את הדפוס לקוד שחשוף למשתמשי אתר.

סידור בגרירה#

  • order (בקשה): OrderPage() ממספר מחדש את ord ל-1 עד n לכל השאילתה, ואז קובע את ord של העמוד הנוכחי לפי data.order_ids (הזזה של (pgnm-1)*limit). מחזיר false על שאילתת מחרוזת. התשובה {"success": true|false}, ואחריה נקרא order_success.
  • עם order_manager_external_tbl: הסדר נשמר בטבלה panel_table_order (type, item_id, item_ord) עם INSERT ... ON DUPLICATE KEY UPDATE, כך שאפשר לסדר טבלה שאין לך שליטה בסכמה שלה.

פעולות שורה#

הערך המוחזר מ-actions הוא מערך של פעולות:

מפתחמשמעות
titleטקסט הכפתור. גם מפתח ה-v-for בלקוח, לכן כותרות שונות בין פעולות
iconHTML של אייקון (<i class="fas fa-edit"></i>)
linkכתובת לפתיחה. "EDIT" הופך ל-btn_add_url עם action_type של edit
target"inner" (ברירת מחדל, adminMovePage), "popup" (פאנל צד), "_blank" (לשונית)
funcfn($row): פעולה בשרת. הפעולה נשלחת כ-POST, והערך המוחזר מוצג ללקוח
alertטקסט אישור. מציג חלון אישור לפני ההפעלה
permsהרשאה נדרשת
class, styleמחלקה וסגנון על הכפתור
action_typedelete או edit. מזוהה אוטומטית ב-detect_action_type, ומשפיע על תפריט ההקשר
tokenנוצר אוטומטית: MISC::encode(json_encode(action + id))

כללי הקישור:

  • קישור יחסי (לא http, https, ftp) שאין בו id מקבל /<id> בסוף, או &id= או ?id= אם כבר יש בו ?.
  • קישור שכבר מסתיים ב-/N או ?id=N מקבל את ה-id של השורה במקום.
  • dblclick_url מוסיף פעולה {title: "כניסה", link, target: "inner", class: "btn_enter", action_type: "edit"}.
  • לחיצה על func שולחת tbl_action: "action" עם id ו-token. השרת מחשב מחדש את פעולות השורה ומתאים לפי הטוקן וה-id לפני הפעלה, כך שלא ניתן להפעיל פעולה שלא הוצגה.
  • תוצאת func (more_data.alert) מוצגת כ-HTML, ואם היא מתחילה ב-<script היא מורצת.
  • לחיצת גלגלת על קישור פותחת לשונית חדשה.

מחיקה: כש-delete מוגדר וההרשאה delete קיימת, מתווספת אוטומטית פעולה עם func => fn($rows) => $del($rows["id"], $rows), alert של ARE_YOU_SURE, class: "delete_btn" ו-action_type: "delete".

פעולות קבוצה#

group_actions הן פעולות על שורות מסומנות. כל פעולה: title, icon, class, style, alert, ו-func שהחתימה שלה fn($row, $action) ומורצת פעם לכל שורה מסומנת (השרת שולף כל שורה עם WHERE id = N). הערך המוחזר נשלח ללקוח כ-more_data.alert. הפעולות מזוהות ב-token שנוצר כמו בפעולות שורה. כש-delete מוגדר ויש הרשאה, מתווספת פעולת קבוצה של מחיקה.

$lstListManager->group_actions[] = [
    "title" => "הפעל",
    "class" => "btn_activate",
    "func" => function ($row, $action) {
        DB::update("cron_tasks")->set_var("is_active", 1)->Update((int)$row["id"]);
    },
];

עריכה בתוך הטבלה#

עריכה היא POST עם tbl_action = "editable_field", id, editable_field_name, editable_value. השרת מוצא את השורה (מהשאילתה, או מ-rows_func כשאין שאילתה) ואם אינה קיימת מחזיר "row_not_in_list".

העמודה ניתנת לעריכה אם editable === true, או editable הוא callable שמחזיר true, או שהוגדר editable_field_table, או editable_field_func. אחרת התשובה false. ערך של עמודת list (מערך או אובייקט) מומר ל-|1||2| עם MISC::bgl_implode.

דרכי השמירה, לפי סדר העדיפות:

  1. editable_field_table: DB::update(table)->set_var(field, value)->Update(id), ואז editable_success.
  2. editable_field_func($row, $value, $title).
  3. שאילתת DB::query: DB::update($query->table)->set_var(field, value, "conf"|"content"). טבלת היעד היא editable_table ("conf" או "content"), וכשהעמודה קיימת רק ב-<table>_content השרת עובר אוטומטית ל-content. אחר כך editable_success.
  4. אחרת: false.

התשובה היא true או false.

["title" => "שפה", "field" => "lang_id", "type" => "select",
 "select_options" => [1 => "עברית", 2 => "English"],
 "editable_field_func" => function ($row, $value, $title) {
     DB::update("ui_langs")->set_var("lang_id", (int)$value)->Update((int)$row["id"]);
     return true;
 }],
הערה

הקוד שלמעלה מדגים את החתימה בלבד. טבלאות ועמודות בדוגמה הן לצורך המחשה.

ייצוא ל-Excel#

הבקשה tbl_action = "xls" קוראת ל-xls(): קובץ xlsx (PhpSpreadsheet), מימין לשמאל, שורת כותרות עם רקע FF0850a2 וגופן לבן, גליון בשם Simple, כל התאים מחרוזות והתגיות מוסרות. שם הקובץ <name>-d-m-Y-H-i.xlsx (עם filename*=UTF-8'' לפי RFC 5987), set_time_limit(0) ו-memory_limit -1, ואז exit. data.limit מספרי מגביל ל-LIMIT n, אחרת אין הגבלה.

אין בדיקת הרשאת ייצוא בשרת

כפתור הייצוא מוסתר בלקוח לפי has_perms("export") (ב-index.tpl), אבל xls בשרת לא בודק הרשאה. מי שיש לו גישה לפאנל יכול לשלוח את הבקשה ישירות. אם הנתונים רגישים, בדקו הרשאה בקוד הפאנל.

פרוטוקול הבקשות#

get_html() קורא ל-init(), ואז:

  • אם המשתמש מנהל והכותרת AI-Table-Discovery קיימת: מחזיר output_table_json() (תיאור הטבלה לסוכני AI) ויוצא.
  • אם יש POST עם tbl_action ו-data["tblID"] == tblID: מטפל בפעולה ועונה Content-Type: application/json.
  • אחרת מצייר את assets/panel_table_vue/index.tpl.
tbl_actionמה קורה
get_lines, searchמחזיר שורות
order{"success": ...} ו-order_success
xlsייצוא
DELETEדורש delete, data.id והרשאת delete (או ignore_perms). שולף את השורה ב-WHERE id = N, קורא ל-delete($id, $row) ומחזיר שורות
group_actionLinesFuncs(): מריץ פעולת קבוצה על checkgroup
כל ערך אחר (editable_field, action)do_actions($tbl_action)

תשובת שורות:

{
  "more_data": {},
  "lines": [],
  "paging": {},
  "order_manager": true,
  "action_result": null,
  "additional_content": "..."
}

הקידוד: JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE. additional_content מופיע רק כש-additional_content מוגדר.

פלט הגילוי של AI#

output_table_json() מחזיר: tblID, title, table, base_query (עד 1000 תווים), columns (title, field, type, editable, ו-select_options או select_options_dynamic), limit, default_order, order_manager, btn_add_url, has_delete, group_actions (רק הכותרות).

מתודות ציבוריות#

חתימההחזרההערה
static load_assets()מוסיף את קבצי ה-CSS וה-JS של panel_table_vue, ה-datepicker, ה-bottom sheet וייבוא ה-Excel
init()מכין את הטבלה: pgnm, כיבוי order_manager כשאין DB::query, יצירת עמודת ord, סינון עמודות לפי perms, השלמת type, הוספת פעולת מחיקה, ושליחת הכותרת add_action. נקרא אוטומטית מ-get_html()
get_html()string או JSON (ו-die)נקודת הכניסה. ראו "פרוטוקול הבקשות"
output_table_json()מדפיס את תיאור הטבלה ל-AI
realtime_tracking_add_url($url)מוסיף כתובת ל-realtime_tracking_urls
main_table_name()stringquery->table, או הטבלה מ-FROM הראשון של שאילתת מחרוזת (בלי הקידומת), או ""
fill_lines()מערך שורותמריץ את השאילתה עם LIMIT, מוסיף את שורות rows_func, ובונה את התאים ואת הפעולות
xls()מייצא ו-exit
get_sql_string()string או falseמחרוזת השאילתה, או BuildQuery() של אובייקט, אחרת false
bulid_basic_query()stringבונה את ה-SQL הסופי (סינון, חיפוש, מיון). שם המתודה כתוב כך בקוד, עם הטעות
paging()מערך{pages: [{page, text, active?}], total_results, page, total_pages, limit}. חלון של 10 עמודים וכפתורים <<, <, ..., >, >>. שאילתת הספירה נגזרת בביטוי רגולרי מהשאילתה, ועם rows_func בלבד total_results = 0
LinesFuncs()מריץ פעולת קבוצה על כל שורה ב-checkgroup
OrderPage()boolשמירת סדר העמוד. false על שאילתת מחרוזת
OrderItem($direction, $id)"UP" או "DOWN": מחליף ord עם השכן
do_actions($action)עריכה בתוך הטבלה ופעולות שורה
get_actions($rows)מערךפעולות השורה אחרי סינון הרשאות, עם טוקנים ופעולת מחיקה
detect_action_type($action)"delete", "edit" או nulldelete אם המחלקה מכילה delete, edit אם הקישור מכיל btn_add_url

מלכודות#

  • שורות מ-rows_func מוצגות לפני תוצאות ה-DB ולא נספרות ב-paging().
  • rows_func בלי query: אין DESCRIBE, אין מיון בגרירה, ואין עימוד אמיתי, וצריך select_options מפורשים.
  • DELETE ועריכה שולפים את השורה בתת-שאילתה WHERE id = N, ולכן שאילתת מחרוזת חייבת להחזיר עמודה id.
  • אין תמיכה בכמה טבלאות באותו דף בלי tblID שונה לכל אחת.

ראו גם#

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