שתי מחלקות סטטיות קטנות ב-system/collections/ נותנות לאתר שני מאגרי ערכים שנטענים בכל בקשה. PARAMS היא טבלת הגדרות של מפתח וערך (CRM_params) שמשותפת לכל הפלטפורמות. LANGS היא מילון של "מילות מערכת" בכמה שפות (CRM_langs_words) שנבחר לפי הפלטפורמה הנוכחית. שתיהן נטענות על ידי PAGE::load() ונשמרות בקאש קבצים (ראו cache_engine API); הסבר מושגי על ריבוי פלטפורמות ב-פלטפורמות ורב-לשוניות.
CONFIG_USER הוא קובץ PHP שנטען לפני הכל ומוגדר בפריסה (קונפיגורציה). PARAMS נשמר במסד, נערך בפאנל הניהול בלי פריסה, ולכן מתאים להגדרות שמשתנות בזמן ריצה (מפתחות API, דגלי תכונות). PARAMS שייך לאתר כולו ולא לפלטפורמה.PARAMS#
הטבלה והמטמון#
CRM_params: עמודות id, sysName (המפתח, צריך להיות UNIQUE), value (טקסט), description ו-perm_developer (1 = מוצג בפאנל רק למפתחים). הערך תמיד מחרוזת: מבנה (JSON, מערך) מסדרים ופורסים בעצמכם.
PARAMS::init() נקראת פעם אחת בכל בקשה (בתוך PAGE::load(), לפני ה-ROUTER ולפני SEO::init()). היא טוענת את כל השורות לזיכרון דרך:
cache_engine::get("params", function(){
return DB::get_all('SELECT sysName, value from ' . CONFIG::$db_fullprefix . 'params');
}, 24*30, false);
מפתח המטמון params, תוקף 720 שעות, ו-$in_platform = false: קובץ אחד לכל האתר, לא לכל פלטפורמה. לכן כתיבה ישירה לטבלה לא נראית באתר עד שמנקים את המטמון, והדרך הנכונה היא cache_engine::remove("params") אחרי כל שינוי (כך עושים הפאנל /{admin}/Params, SeoVerification ו-market_service). אם שאילתת הטעינה נכשלה (שגיאת DB בזמן הבנייה), cache_engine::get לא שומרת את התוצאה, כדי שלא יוגש מסד "ריק" 30 יום.
PARAMS::get()#
public static function get($key)
מחזירה את ערך הפרמטר כמחרוזת, או "" (מחרוזת ריקה) כשהמפתח לא קיים. אין הבחנה בין "לא קיים" ל"קיים וריק": אם צריך, בדקו את הטבלה.
$key = trim((string)PARAMS::get("poolse_api_key"));
if ($key === "") return false; // לא הוגדר
if (PARAMS::get("file_manager_readonly") === "1") { /* דגל בוליאני כמחרוזת */ }
PARAMS::set()#
public static function set($key, $value)
מציבה ערך בזיכרון של הבקשה הנוכחית בלבד. לא כותבת למסד ולא לקאש (SeoHosted ו-OlegHosted משתמשות בה כדי שקריאה באותה בקשה תראה את הערך מיד אחרי שהן שומרות אותו בעצמן). כדי לשמור קבוע:
// שמירה קבועה של פרמטר (הכנסה או עדכון) ואז ניקוי מטמון
$row = DB::get_val("params", ["sysName" => "my_flag"]);
$up = DB::update("params");
$up->set_var("sysName", "my_flag");
$up->set_var("value", "1");
if ($row) $up->update((int)$row["id"]);
else $up->insert();
cache_engine::remove("params");
PARAMS::set("my_flag", "1"); // לבקשה הנוכחית
PARAMS::init()#
public static function init()
טוענת את כל הפרמטרים (ראו למעלה). נקראת על ידי הליבה, אין צורך לקרוא לה. קריאה נוספת קוראת שוב מהקאש ודורסת ערכים שהוצבו בזיכרון עם set().
PARAMS::GetArray()#
public static function GetArray($onlyWords = false)
GetArray מפנה ל-self::$arrWords, משתנה שלא קיים ב-PARAMS (המילים נמצאות ב-LANGS). קריאה אליה גורמת ל-Error: Access to undeclared static property ולעמוד לבן. אין קוראים אליה בליבה. כדי לקבל את כל הפרמטרים אין מתודה ציבורית אחרת: שאלו את הטבלה (DB::get_all("SELECT sysName, value FROM CRM_params")). כדי לקבל את המילים: LANGS::get_words_array().פרמטרים שהליבה קוראת#
PARAMS::get מחזירה "" למפתח שלא קיים, ולכן קוד הליבה מתייחס לפרמטר חסר כאל "כבוי". אלה שהליבה קוראת (בדקו בטבלה לפני שאתם מניחים שערך קיים):
| מפתח | נקרא ב | משמעות |
|---|---|---|
attaches_version | ערכת הניהול, WZ_EDITOR | cache-buster לנכסי האדמין (מוגדל על ידי ניקוי המטמון מהפאנל) |
log_sql | OlegAgent, server_load | "1" מפעיל רישום שאילתות איטיות (דיבוג SQL) |
site_name | SeoHosted, OlegHosted | שם האתר בשירותי ה-SEO והבריאות |
wizzo_market_api_key | market_service, external_mcp | מפתח ה-API של ה-Market. סוד: לעולם לא בקוד ובתיעוד |
poolse_api_key, poolse_api_url, poolse_mail, poolse_mail_exclude | poolse_client, mail_tpl | שליחת מיילים דרך POOLSE |
mail_tpl | mail_tpl | תבנית ברירת מחדל למיילים |
file_manager_readonly, file_manager_show_sensitive, file_manager_extra_roots | FileManager | מגבלות מנהל הקבצים (מנהל הקבצים) |
perf_advisor_tuning, accessibility_widget | OlegAgent, market_service | JSON של הגדרות |
מפתחות כמו wizzo_market_api_key נשמרים ב-value בטקסט גלוי, ופאנל /{admin}/Params מציג אותם לכל מי שיש לו גישה אליו. סמנו כל פרמטר רגיש עם perm_developer = 1 כדי שיוצג רק למפתחים, ואל תשכפלו את ערכי הייצור לסביבות פיתוח.
פאנל הניהול#
/{admin}/Params מציג את הרשימה ממוינת ל-perm_developer DESC, sysName ASC. משתמש שאינו מפתח (ADMIN::is_developer()) רואה רק שורות עם perm_developer = 0 ולא רואה את העמודה. עריכת ערך בשורה, הוספה (/{admin}/Params/insert) ומחיקה מנקים את המטמון params בעצמם.
LANGS#
הטבלאות והמטמון#
מילון המערכת מורכב משלוש טבלאות: CRM_langs_words_groups (קבוצות: id, name), CRM_langs_words (המפתחות: id, sysName, group_id) ו-CRM_langs_words_content (התרגומים: id, parentId = langs_words.id, langId = מזהה פלטפורמה, value). ראו טבלאות רב-לשוניות להסבר על הצירוף האוטומטי של טבלאות *_content, ו-סכמת הטבלאות.
CONFIG::$lang הוא מזהה הפלטפורמה הנוכחית (CONFIG::$platform_data["id"]), לא קוד שפה. LANGS::init_words() נקראת ב-PAGE::load() אחרי טעינת המודולים (ובפאנל הניהול אחרי ה-init הרב-לשוני), וטוענת את כל המילים של הפלטפורמה:
cache_engine::get("words_lang" . CONFIG::$lang, function(){
$qu = DB::query("langs_words");
$qu->fields = "sysName, value";
return $qu->get_all();
}, 4);
מפתח המטמון words_lang<platformId>, תוקף 4 שעות, ובתיקיית המטמון של הפלטפורמה. אחרי כתיבה ישירה לטבלה, ניקוי: cache_engine::remove("words") (התאמה לפי קידומת, מסיר את כל הפלטפורמות), ואז LANGS::init_words() אם צריך לראות את השינוי באותה בקשה. הפאנל /{admin}/ui_langs_legacy עושה זאת בעצמו ומפעיל את האירוע words_update.
LANGS::get_word()#
public static function get_word($key, $lang = false)
$lang | התנהגות |
|---|---|
false (ברירת מחדל) | מחזירה את המילה של הפלטפורמה הנוכחית מהזיכרון (בלי שאילתה). מפתח חסר: "" |
| מזהה פלטפורמה | שאילתה ישירה ללא מטמון: DB::query("langs_words", ["sysName" => $key]) עם ->lang = (int)$lang, ומחזירה value |
echo LANGS::get_word('PANEL_MAIN'); // בשפת הפלטפורמה הנוכחית
echo LANGS::get_word('_ADD_', 2); // בפלטפורמה 2, שאילתה לכל קריאה
$lang
כשמעבירים $lang והמפתח לא קיים ל-langs_words (או שאין לו תרגום), הקוד ניגש ל-["value"] של false: PHP 8 יפיק אזהרת "Trying to access array offset on false" ויחזיר null, לא "". בדקו את התוצאה, או השתמשו בצורה הקצרה כשזה אפשרי.LANGS::translate()#
public static function translate($val)
מחפשת את $val בין הערכים של המילון הנוכחי (array_search). נמצא: מחזירה את ערך המפתח שנמצא, שהוא אותה מחרוזת. לא נמצא: מחזירה את $val כמות שהוא. בשני המקרים התוצאה זהה לקלט, ולכן המתודה אינה מתרגמת בין שפות ואין להסתמך עליה לתרגום (למעשה היא רק בודקת מעבר ליניארי על כל המילון).
LANGS::set_word()#
public static function set_word($key, $value)
מציבה מילה בזיכרון של הבקשה בלבד (לא למסד ולא לקאש). שימושי לדרוס מילה לבקשה אחת (למשל לפי נושא העמוד).
LANGS::init_words()#
public static function init_words()
טוענת את כל המילים של CONFIG::$lang לזיכרון (ראו למעלה). הליבה קוראת לה; קוד אתר צריך אותה רק אחרי שינוי שמנקה את הקאש.
LANGS::get_words_array()#
public static function get_words_array()
מחזירה את כל המילים כמערך אסוציאטיבי sysName => value (הפלטפורמה הנוכחית, בצירוף כל מה שהוצב עם set_word).
איך משתמשים במילים#
| איפה | איך |
|---|---|
| PHP (קונטרולר, פאנל) | LANGS::get_word('KEY') |
| תבנית Smarty | {LANGS::get_word('KEY')} (כך כתוב בתבנית האדמין index.tpl) |
| תבנית ללא Smarty | התבנית מוערכת כמחרוזת בגרשיים כפולים והמשתנה $savedWords (אובייקט) זמין בה: {$savedWords->KEY} |
| JavaScript | הנתיב system/Tools/CRM מחזיר var CRM = {...}; עם כל המילים, ומאפשר CRM.KEY (נקרא ללא אימות, ראו כל ה-URLs) |
// application/controllers/contact.php
class contact extends wz_controller
{
function index()
{
return $this->view("contact/form", [
"send_label" => LANGS::get_word('_SEND_'), // מילה מהמילון, לפי פלטפורמה
]);
}
}
מפתחות שהליבה עצמה מצפה להם (חסרים: "" בפאנל): PANEL_MAIN, EDIT, _ADD_, _SEND_, ARE_YOU_SURE, _MESSAGE_ADDED_, _MESSAGE_NOT_SAVED_, SEARCH, VIEW_SITE, LOGOUT.
Tools/CRM ציבורי
כל המילים של הפלטפורמה נחשפות בכתובת ציבורית ללא התחברות. אל תכניסו למילון מידע פנימי, מפתחות או טקסט שלא מיועד לגולשים.