CONFIG ו-CONFIG_USER

רפרנס מפתחות ההגדרה של הליבה (CONFIG_USER), המפתחות הנגזרים ש-CONFIG מחשבת, והמתודות CONFIG::preinit() ו-CONFIG::init().

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

כל אתר WizzoCMS מגדיר מחלקה בשם CONFIG_USER ב-index.php שלו, ורק אחר כך טוען את הליבה. הליבה מרחיבה אותה במחלקה CONFIG (class CONFIG extends CONFIG_USER), ולכן כל מפתח נקרא בקוד כ-CONFIG::$key. בדף הזה: כל מפתח שהליבה קוראת, מה הסוג שלו, מי משתמש בו ומה קורה כשהוא חסר, וגם שתי המתודות הציבוריות של CONFIG. הדף מציג שמות מפתחות והסבר בלבד, בלי ערכי סודות.

איך ההגדרה נטענת#

הליבה לא מגדירה ברירות מחדל. CONFIG_USER נמצאת באתר ולא בליבה, ולכן "ברירת מחדל" בטבלאות למטה היא תמיד "מוגדר באתר". כך נראה סדר הדברים ב-core.php:

  1. glob(collections/*.php) טוען את כל המחלקות, כולל CONFIG.
  2. CONFIG::preinit() מחשבת פרוטוקול, נתיב בסיס ונתיבים מוחלטים לתיקיות.
  3. MISC::cli_check() מטפלת בהרצה משורת פקודה (cron).
  4. CONFIG::init() מחברת את הפלטפורמה ומחשבת את כתובות האתר והשפה.
מפתח שלא הוגדר הוא שגיאה, לא
null ב-PHP 8 קריאה למאפיין סטטי שלא הוגדר זורקת Error: Access to undeclared static property, והבקשה נופלת. רק מפתחות שהקוד שומר עליהם ב-isset() או ב-property_exists() אפשר להשמיט (הם מסומנים "אופציונלי" בטבלאות). כל מפתח אחר חייב להיות מוצהר ב-CONFIG_USER, גם עם ערך ריק או false.

מפתחות ששייכים לאתר (CONFIG_USER)#

נתיבים ותיקיות#

מפתחסוגברירת מחדלמי משתמש בואם חסר
core_pathstringמוגדר באתרכל ה-require בליבה, core.php, תבניות ניהול, גרסת הליבה (version.txt), מנהל הקבציםחובה. הבקשה נופלת מיד
cache_folderstring (יחסי לתיקיית האתר)מוגדר באתרcache_engine, מנהל קבצים, ComposerManager, יועץ הביצועיםחובה. preinit() ממירה אותו לנתיב מוחלט
models_folderstring (יחסי לתיקיית האתר)מוגדר באתרMODULE בטעינת מודל (המתודה model())חובה. preinit() ממירה אותו לנתיב מוחלט

מסד נתונים#

מפתחסוגברירת מחדלמי משתמש בואם חסר
db_typestring: "PDO", "mysql", "pg" או "clickhouse"מוגדר באתרDB::create_connection(), מנהל ה-DB, יועץ הביצועיםחובה. ערך אחר מסיים ב-die("DB ERROR")
db_hoststringמוגדר באתרDB::create_connection()חובה
db_portintMySQL: ברירת המחדל של PDO. ClickHouse: 8123DB::create_connection()אופציונלי (נבדק ב-isset)
db_dbnamestringמוגדר באתרDB::create_connection()חובה
db_userstringמוגדר באתרDB::create_connection()חובה
db_passwordstringמוגדר באתרDB::create_connection()חובה. הערך נשמר רק בקובץ של האתר, לעולם לא בקוד או בתיעוד
db_prefixstringמוגדר באתר (בדרך כלל CRM)CONFIG::init() מחשבת ממנו את db_fullprefixחובה
db_protocolstring: "http" או "https""http"רק חיבור clickhouseאופציונלי (נבדק ב-isset)
zend_dbאובייקטלא בשימוש בנתיב רגילבנאי ה-select הישן ב-DB.phpנדרש רק בקוד ישן שמשתמש בו
ערכי
db_type החיבור הרגיל הוא "PDO" (MySQL). הענף "mysql" קורא ל-mysql_connect(), פונקציה שהוסרה מ-PHP, ולכן ב-PHP 8.3 הוא לא שמיש. ראו סכימת הטבלאות ו-ה-DB לשימוש בחיבור.

ניתוב, ניהול ותבניות#

מפתחסוגברירת מחדלמי משתמש בואם חסר
admin_urlstring, יחסי וללא / בהתחלהמוגדר באתרROUTER (ביטויים רגולריים של כתובות הניהול), הפניות, כל קישור לניהול (כ-135 מקומות)חובה. ראו אזהרה למטה
default_modulestringמוגדר באתרROUTER, כשהכתובת ריקה (דף הבית)חובה
ignore_domain_checkboolמוגדר באתר (בדרך כלל false)PAGE מדלג על בדיקת הדומיין כשהוא true. MISC::cli_check() מציבה true בהרצת cronחובה: גם הקריאה וגם ההשמה על מפתח לא מוצהר זורקות שגיאה
use_smartytrue, false או "plain"מוגדר באתרFILES בעיבוד תבניות (אפשר לדרוס לכל מודול ב-use_smarty של הגדרות המודול)חובה
minify_htmlboolמוגדר באתרPAGE: ערך false מדלג על כיווץ ה-HTMLחובה (נקרא בלי הגנה)
show_wizzo_creditsbooltrue כשהמפתח חסרPAGE: ערך false מסיר את תגית ה-copyrightאופציונלי (נבדק ב-property_exists)
set_base_domainstringאיןCONFIG::init(): דורס את base_domainאופציונלי (נבדק ב-isset)
admin_countriesarray או falsefalseמסך מדינות הניהול וספריית המדינות (חלופה כשאין קובץ JSON)אופציונלי (נבדק ב-isset)
environmentstringריקminify: שורת נכס עם environment אחר מ-all נטענת רק כשהיא שווה לערך הזהאופציונלי (נבדק ב-isset)
שימו לב
admin_url ללא לוכסן בהתחלה הערך נכנס ישירות לביטוי רגולרי שמתאים כתובת שכבר נוקתה מ-/ בהתחלה ('/^' . CONFIG::$admin_url . '\/...'), וההפניות בונות site_url . admin_url. לכן "wizzocms" נכון ו-"/wizzocms" לא יתאים לאף כתובת ניהול ויגרום להפניות עם כפל לוכסנים. בתיעוד זה {admin} מציין את הערך הזה.

מטמון, קבצים ומדיה#

מפתחסוגברירת מחדלמי משתמש בואם חסר
allow_cacheboolמוגדר באתרcore.php (שמירת עמוד שלם), cache_engine (cache_php_check() ונעילת הבנייה)חובה. false מבטל את שמירת העמוד השלם ואת בדיקת המטמון ב-PHP. ראו סקירת המטמון
storage_remotestring: "local", "ftp" או "s3"מוגדר באתרcore.php (טוען את AWS SDK כשהוא "s3"), STORAGE::add(), STORAGE::get_url()חובה (נקרא בלי הגנה)
storage_remote_urlstring (כתובת בסיס)מוגדר באתרSTORAGE: קידומת הכתובת הציבורית כשהאחסון "ftp"נדרש רק באחסון FTP
storage_remote_ftp_hoststringמוגדר באתרSTORAGE::FtpClose() ופתיחת חיבור FTPנדרש רק באחסון FTP
storage_remote_ftp_usernamestringמוגדר באתרהתחברות FTPנדרש רק באחסון FTP
storage_remote_ftp_passwordstringמוגדר באתרהתחברות FTPנדרש רק באחסון FTP. סוד, נשמר בקובץ האתר בלבד

פרטי האחסון המלאים, כולל אישורי S3 שנשמרים ב-MISC::$GLOBALS ולא ב-CONFIG, ב-STORAGE.

דואר#

מפתחסוגברירת מחדלמי משתמש בואם חסר
mail_queueboolמוגדר באתרmail_tpl (המתודה send()): true מכניס את ההודעה לתור emails_queue במקום לשלוח מידחובה (נקרא בלי הגנה)
mail_is_smtpboolמוגדר באתרmail_tpl ו-MISC (שליחה ישירה): רק === true מפעיל SMTPחובה
mail_smtp_hoststringמוגדר באתראותם מקומות, כש-mail_is_smtp === trueנדרש רק עם SMTP
mail_smtp_authboolמוגדר באתראותם מקומותנדרש רק עם SMTP
mail_smtp_usernamestringמוגדר באתראותם מקומותנדרש רק עם SMTP
mail_smtp_passwordstringמוגדר באתראותם מקומותנדרש רק עם SMTP. סוד, נשמר בקובץ האתר בלבד
mail_smtp_securestring: "tls" או "ssl"מוגדר באתראותם מקומותנדרש רק עם SMTP
mail_smtp_portintמוגדר באתראותם מקומותנדרש רק עם SMTP

ראו דואר לשליחה ולתור.

מצב הסוואה#

מפתחסוגברירת מחדלמי משתמש בואם חסר
maskarray (מפה קידומת אמיתית => מוסוות) או trueכבויMASK::map(): ערך true מפעיל מפה ברירת מחדל שמסווה גם את ערכת הנושא הפעילהאופציונלי (נבדק ב-property_exists). חסר הוא כבוי
mask_wordsarray (אמיתי => ניטרלי)איןMASK: שינויי שם בכיוון יציאה בלבד למזהים נוספיםאופציונלי (נבדק ב-property_exists)

ראו מצב הסוואה.

מפתחות נגזרים: אסור להגדיר אותם#

CONFIG מצהירה בעצמה על המאפיינים האלה בלבד, והליבה ממלאת אותם. הגדרה שלהם ב-CONFIG_USER לא תועיל: הערך נדרס ב-preinit() או ב-init().

מפתחמי ממלאמשמעות
protocolpreinit()"https" או "http"
base_pathpreinit()התיקייה של סקריפט הכניסה (index.php של האתר)
db_fullprefixinit()db_prefix . "_", או מחרוזת ריקה כשאין קידומת. משמש בכל שאילתה ב-DB
platform_datainit()שורת הפלטפורמה מ-CRM_platforms שמתאימה לדומיין הבקשה
site_urlinit()כתובת האתר לפי דומיין הפלטפורמה, עם לוכסן בסוף
original_site_urlinit()כתובת לפי HTTP_HOST של הבקשה עצמה
env_urlinit()זהה ל-site_url, חוץ מבקשה מדומיין מורשה (allowed_domains) שאז הוא כתובת הדומיין שביקשו
base_domaininit()set_base_domain אם הוגדר, אחרת HTTP_HOST
langinit()מזהה הפלטפורמה (platform_data["id"]), ומועתק גם ל-MISC::$GLOBALS["lang"]
system_typeROUTER"client" או "admin" לפי סוג הכתובת שנפתרה
site_config(מוצהר, לא בשימוש)מוצהר ב-CONFIG ואין לו קוראים בליבה

CONFIG::preinit()#

public static function preinit()

קוראת core.php לפני כל דבר אחר, ללא פרמטרים וללא ערך החזרה.

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

  1. קובעת את אזור הזמן Asia/Jerusalem עם date_default_timezone_set().
  2. קובעת את CONFIG::$protocol: "https" בהרצה משורת פקודה, ובבקשת רשת "https" רק כש-$_SERVER["HTTPS"] == "on", אחרת "http".
  3. מחשבת את CONFIG::$base_path כתיקייה של סקריפט הכניסה (הקובץ התחתון ב-debug_backtrace()).
  4. ממירה את models_folder ואת cache_folder לנתיבים מוחלטים. ערך שמכיל ../ עובר realpath() ביחס ל-base_path, וערך אחר מקבל base_path . '/' בהתחלה.
פרוטוקול מאחורי proxy

הפרוטוקול נקבע רק מ-$_SERVER["HTTPS"]. מאחורי פרוקסי או CDN שמסיים TLS ולא מעביר את המשתנה, CONFIG::$protocol יהיה "http" וכל כתובת שנבנית מ-site_url תהיה http://. הדרך היחידה לתקן היא שהשרת יעביר HTTPS=on ל-PHP.

הערה
realpath() על נתיב שלא קיים אם התיקייה עם ../ לא קיימת, realpath() מחזיר false והמפתח נשאר false. הקוד שקורא לו אחר כך ייכשל. ודאו שהתיקיות קיימות לפני הבקשה הראשונה.

CONFIG::init()#

public static function init()

נקראת מ-core.php אחרי MISC::cli_check(), ומ-MISC::cli_check() עצמה בהרצת cron (אחרי שהיא מאפסת את SERVER_NAME ואת HTTP_HOST). אין פרמטרים ואין ערך החזרה.

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

  1. מחשבת את db_fullprefix מ-db_prefix.
  2. טוענת את טבלת הפלטפורמות: cache_engine::get("platforms", fn, 24*30, false), כלומר SELECT * FROM CRM_platforms ממופה לפי domain, ונשמר 720 שעות ($in_platform = false, כי המפתח משותף לכל הפלטפורמות).
  3. בוחרת את platform_data: שורה שה-domain שלה שווה ל-$_SERVER['SERVER_NAME'].
  4. אם אין התאמה, עוברת על הפלטפורמות ובודקת את allowed_domains (רשימה שמפורקת עם MISC::bgl_explode) יחד עם ה-domain של אותה פלטפורמה. התאמה קובעת את הפלטפורמה וגם את env_url לכתובת הדומיין שביקשו.
  5. אם עדיין אין התאמה, לוקחת את השורה הראשונה בטבלה.
  6. ממלאת את site_url, original_site_url, base_domain, env_url ו-lang (ראו את טבלת המפתחות הנגזרים).
// אחרי core.php אפשר לקרוא את התוצאה
CONFIG::$site_url;                    // "https://example.com/"
CONFIG::$platform_data["domain"];     // example.com
CONFIG::$lang;                        // מזהה הפלטפורמה
טבלת פלטפורמות ריקה שוברת את ה-boot

בלי אף שורה ב-CRM_platforms אין פלטפורמה לחזור אליה, ו-site_url נבנה בלי דומיין. בנוסף, השורה הראשונה משמשת כברירת מחדל לכל דומיין לא מוכר, כלומר כל כתובת שמצביעה על השרת תקבל את האתר הראשון. לכן הדומיינים המורשים מוגדרים ב-allowed_domains.

מטמון הפלטפורמות

שינוי בטבלת CRM_platforms (דומיין חדש, allowed_domains) לא נראה עד שמפתח המטמון platforms נמחק או שחלפו 720 שעות. ראו ממשק המטמון.

דוגמה: CONFIG_USER מינימלי#

הערכים כאן הם מציין מקום. את הערכים האמיתיים מקבלים מהסביבה, ולא שומרים אותם במאגר.

<?php
class CONFIG_USER
{
    // נתיבים
    static $core_path      = __DIR__ . "/system/core";
    static $cache_folder   = "cache";
    static $models_folder  = "application/models";

    // מסד נתונים
    static $db_type        = "PDO";
    static $db_host        = "127.0.0.1";
    static $db_dbname      = "site_db";
    static $db_user        = "site_user";
    static $db_password    = "CHANGE_ME";
    static $db_prefix      = "CRM";

    // ניתוב ותבניות (admin_url יחסי, בלי לוכסן בהתחלה)
    static $admin_url           = "wizzocms";
    static $default_module      = "home";
    static $ignore_domain_check = false;
    static $use_smarty          = true;
    static $minify_html         = true;

    // מטמון, אחסון ודואר
    static $allow_cache    = true;
    static $storage_remote = "local";
    static $mail_queue     = true;
    static $mail_is_smtp   = false;
}

require __DIR__ . "/system/core/core.php";

הדוגמה כוללת את כל המפתחות שהליבה קוראת בלי הגנה בנתיב בקשה רגיל. מפתחות ה-SMTP, ה-FTP וההסוואה מתווספים רק כשמפעילים את התכונה שלהם.

ראו גם#

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