בקרי מערכת (system/)

הבקרים שמגיעים עם הליבה ונגישים תחת /system/<name>/<method>, מה כל אחד עושה, מי רשאי לקרוא להם, ואיך כותבים בקר ליבה משלכם.

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

מלבד הבקרים של האתר (בקרים), הליבה מגיעה עם בקרים משלה בתיקייה api/core/controllers/ (באתר חי: system/controllers/). הם נגישים בכתובת /system/<controller>/<method>. בעמוד הזה: איך הניתוב אליהם עובד, רשימת כל הבקרים עם התפקיד והאימות של כל אחד, ומה צריך לדעת לפני שמוסיפים בקר ליבה.

אזהרה
אין whitelist ואין בדיקת הרשאה מרכזית. בקר מערכת נטען אם הקובץ קיים, וכל מתודה ציבורית שלו היא endpoint שכל אחד יכול לקרוא לו. אם בקר צריך אימות, הוא חייב לבדוק אותו בעצמו בתוך המתודה (ADMIN::is_admin(), טוקן, מפתח API). זו הסיבה שבטבלה למטה יש עמודת "אימות": היא מתארת מה הקוד באמת בודק, לא מה היה צפוי שיבדוק.

איך הניתוב עובד#

כשהכתובת מתחילה ב-system/ (ואחרי שהכללים הקודמים לא התאימו, ראו ניתוב), ROUTER::parse_friendly_url בודק ארבע תבניות לפי הסדר הזה, והראשונה שמתאימה קובעת $_GET["sys_controller"], $_GET["pname"] (המתודה) ו-$_GET["id"]:

הכתובתsys_controllerpname (המתודה)$_GET["id"]
system/<c>/<ספרות><c>ריק, כלומר indexהספרות
system/<c>/<m>/<כל דבר><c><m>כל מה שאחרי הסלאש השני, כולל סלאשים
system/<c>/<m><c><m>לא נקבע
system/<c><c>ריק, כלומר indexלא נקבע

שימו לב: system/minify/12 קורא ל-minify::index עם id=12, ולא למתודה בשם 12. עם ?__router_trace=1 אפשר לראות איזו תבנית נבחרה (מעקב ניתוב). אחר כך הבקר נטען דרך MODULE::get_html($controller, $method, true), והפרמטר השלישי ($is_system = true) הוא מה שגורם ל-MODULE::get לחפש את הקובץ ב-CONFIG::$core_path/controllers/<name>.php במקום ב-application/controllers/.

שלושה דברים שונים מבקר אתר:

  • אין צורך בשורה ב-CRM_modules. הקובץ מספיק, ולכן אין "הפעלה" ואין מטמון modules שצריך לנקות.
  • בדיקת הדומיין (die("URL ERROR") כשהדומיין לא תואם לדומיין של הלקוח) לא חלה על minify ו-Tools, כדי שאפשר יהיה לטעון נכסים וכלי עזר גם מדומיין אחר.
  • אותו כלל של is_callable: כל מתודה ציבורית היא endpoint, כולל wrapper, view ו-system_view שהבקר יורש מ-wz_controller. מתודה שאסור להפעיל מבחוץ צריכה להיות private או protected.

רשימת הבקרים#

הטבלה מסודרת לפי נושא. "ציבורי" בעמודת האימות פירושו שלא נמצאה בקוד של הבקר בדיקת הרשאה.

נכסים וצד לקוח#

בקרמתודות עיקריותתפקידאימות
minifyindex, js, css, scss, tag_managerאיחוד וכיווץ קבצי JS ו-CSS לפי קבוצות, קומפילציית SCSS, ושירות tag_manager.js (צנרת הנכסים)ציבורי (בכוונה)
ToolssecurityPic, securityPic_check, CRM, GalleryActions, AutocompleteDB, LiveEdit, CKEditor_upload*, save_url_to_storage, gallery_upload, delete_cacheכלי עזר מעורבים לאתר ולאדמיןמשתנה לפי מתודה, ראו הערה למטה
analyticsindexאיסוף אירועי צפייה ופעולה מה-JS (wz_analytics), מחזיר JSON עם CORS פתוח (*)טוקן שה-JS מקבל מהשרת
ad_managergotourl, get_all_banners, get_typesבאנרים: מעקב קליקים והפניה, ורשימת באנרים כ-JSONציבורי (המזהה ב-gotourl עובר MISC::decode)
newpage_publicindexמציג עמודי NEWPAGE תחת /p/<slug>, מתוך newpage.wizzo.media, עם מטמון של דקהציבורי (תצוגה מקדימה דרך פרמטר ייעודי)
pdf_viewerindexמציג קובץ PDF מהאחסון (המזהה ב-id מוצפן ב-MISC::encode)ציבורי
photofilter, CropManagerindex, upload, doSave, doCrop, doFlip ועודעריכת תמונה וחיתוך, מבוסס טוקןלא נבדק לעומק, ראו כלי תמונה

אדמין וניהול#

בקרמתודות עיקריותתפקידאימות
admin_loginindex, login, check_otp, login_as, logoutמסך הכניסה לניהולבדיקת CSRF (ADMIN::verify_csrf_token) ב-login; ראו אימות אדמין
excel_import_apiprocess, importייבוא מקובץ אקסלאדמין בלבד
file_processorextract_contentחילוץ טקסט מקובץאדמין בלבד
ai_insert_apicreateיצירת רשומות בעזרת AIאדמין בלבד
wizzoai_apiai, ai_image, image, get_prompt, get_models, get_image_modelsשער ל-WIZZO AI מתוך הפאנלים, מחזיר JSONאדמין בלבד

Cron ותחזוקה#

בקרמתודותתפקידאימות
cron_runnerindex, runמריץ את המשימות שהגיע זמנן ב-CRM_cron_tasks (Cron)פרמטר tk מול הפרמטר cron_runner_token. run מתיר גם אדמין
seo_cronweeklyסריקת SEO שבועיתטוקן או אדמין
seo_indexnowkey, runמפתח IndexNow ושליחת כתובות (IndexNow)key ציבורי בכוונה, run טוקן או אדמין
ai_cronindexבדיקת משימות AI מתוזמנותלא נמצאה בדיקה
cache_cleanuprunמחיקת קבצי מטמון שפג תוקפם (`?type=allpages
admin_session_cleanuprunניקוי סשנים שפג תוקפם של האדמיןלא נמצאה בדיקה
core_pingindexJSON עם ok, version, db, php, בלי מטמון, עבור העדכוןציבורי, ללא נתונים רגישים

Wizzo Market, סוכנים ו-MCP#

בקרתפקידאימות
connectorהדלת היחידה של Wizzo Market אל האתר (index, status, mcp_connect ועוד)לפי מתודה, ראו Market
wizzo_market_apiהגדרות וסנכרון מול המרקטמפתח wizzo_market_api_key מול WIZZO_KEY::matches, אחרת 403 JSON
check_versionהצד של שרת האב ב"עדכון גרסה"ראו עדכונים
mcpשרת MCP עצמאי: POST /system/mcp (MCP)טוקן Bearer או ?key=
agent_mcpגשר לשרת הסוכנים של Wizzoמוגבל ל-WIZZO_NET
ai_agent_runnerמישור הבקרה של WIZZO Agentsמפתח ה-API של האתר ב-Authorization
seo_runner, perf_runnerהסוכן באתר של מנוע ה-SEO ושל אולג המתארחAuthorization עם מפתח האתר
perf_advisor, system_healthקליפות תאימות, העבודה עברה למנוע אולג המתארח
שימו לב
Tools מערבב מתודות מוגנות עם מתודות פתוחות. delete_cache דורשת אדמין. LiveEdit מעדכן טבלה, שדה ומזהה לפי טוקן שמוצפן ב-MISC::encode, ולא נמצאה בה בדיקת is_admin. מתודות ה-cron_* של Tools וכן GalleryActions ו-AutocompleteDB נגישות לכל מי שמכיר את הכתובת (ממצא CORE-04). בפרויקט חדש, אל תסתמכו על "הכתובת לא מפורסמת", ושקלו חסימה בשרת האינטרנט של /system/Tools/ מלבד המתודות שבאמת נחוצות לציבור (securityPic ו-CRM).

הערה

המתודות של cron_runner, seo_cron ו-seo_indexnow נבדקות מול טוקן. בבקרי cron אחרים (cache_cleanup, admin_session_cleanup, ai_cron) לא נמצאה בדיקה, ולכן כל אחד יכול להפעיל אותם. הם בטוחים להרצה חוזרת (מוחקים רק מה שפג תוקפו), אבל הם עדיין עבודה שאפשר להפעיל מבחוץ.

בקרים שמחזירים JSON או טקסט#

רוב הבקרים כאן מחזירים נתונים ולא עמוד. הדפוס הוא לקבוע $_GET["pmode"] = "empg" בבנאי (או במתודה), כדי ש-PAGE::output ידלג על ה-theme ועל מעטפת ה-HTML, ואז להחזיר מחרוזת או לעשות echo ו-die. לדוגמה, core_ping:

class core_ping extends bgl_controller
{
	function __construct()
	{
		parent::__construct();
		$_GET["pmode"] = "empg";
		header("Content-Type: application/json; charset=utf-8");
		header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
	}

	function index()
	{
		echo json_encode(["ok" => true]);
		die;
	}
}

(זו גרסה מקוצרת של הקוד האמיתי, שמוסיף גם גרסה, בדיקת DB וגרסת PHP.)

כתיבת בקר ליבה משלכם#

בקר ליבה הוא קובץ PHP ב-CONFIG::$core_path/controllers/ שמגדיר מחלקה בשם הקובץ ויורשת מ-bgl_controller:

<?php
// system/controllers/hello.php  (בריפו: api/core/controllers/hello.php)
class hello extends bgl_controller
{
	public function index()
	{
		$_GET["pmode"] = "empg";
		if (!ADMIN::is_admin()) {          // האימות הוא באחריותכם
			http_response_code(403);
			return "forbidden";
		}
		return "hello";
	}
}

אחרי העלאה, /system/hello מחזיר את התוכן. שימו לב:

  • api/core הוא הליבה המשותפת לכל האתרים. עדכון גרסה מחליף אותו, וקובץ שהוספתם שם לא יישמר. בקר שהוא חלק מהאתר שלכם שייך ל-application/controllers/ עם שורה ב-CRM_modules (בקרים). בקר ב-api/core/controllers/ מתאים רק לתרומה לליבה עצמה (תרומה לליבה).
  • בקר מערכת מקבל את $this->load ואת view() כמו כל בקר, אבל system_view($tpl, $vars) קורא תבניות מ-core_path/views/.
  • שם הקובץ הוא שם המחלקה, והשם הוא מה שמופיע בכתובת. אותיות גדולות נשמרות (/system/Tools/..., /system/CropManager/...).

ראו גם#

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