Themes

מה זה theme ב-WizzoCMS, מבנה התיקייה themes/<name>/, המחלקה TEMPLATE_<name> ו-bgl_theme, איך בוחרים theme לאתר ולעמוד, ומה ה-theme מקבל מהבקר.

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

ה-theme הוא המעטפת של האתר: הכותרת העליונה, התפריט, הכותרת התחתונה והנכסים הגלובליים. הבקר מחזיר את תוכן העמוד, וה-theme מניח אותו בתוך המעטפת. בעמוד הזה: איך theme בנוי, איך הוא נטען, איך בוחרים theme לאתר ולעמוד מסוים, ואילו משתנים עוברים אל התבנית שלו.

הערה

theme כאן הוא רק מעטפת ה-<body> ונקודת הכניסה לנכסים. את המסמך (<html>, <head>, התגים של ה-SEO) בונה PAGE::output, ראו PAGE API.

מבנה#

theme הוא תיקייה בשורש האתר, ושם התיקייה הוא שם ה-theme:

themes/default/
├── index.php        class TEMPLATE_default extends bgl_theme
├── index.tpl        תבנית Smarty של המעטפת
├── style.scss       (לדוגמה) נכסי ה-theme, נטענים עם PAGE::add_asset
└── app.js

הכלל הוא קשיח: השם הוא themes/<name>/index.php, והמחלקה היא TEMPLATE_<name>. אם השם כולל תווים שאינם חוקיים בשם מחלקה ב-PHP (כמו מקף), הטעינה נכשלת.

bgl_theme#

כל theme יורש מ-bgl_theme (collections/theme.php), שיורשת מ-bgl_controller. מה שהיא נותנת:

חברפירוט
$nameשם ה-theme, כפי שהועבר לבנאי
$varsמערך המשתנים שיוצג בתבנית. מגיע ממולא מראש עם content ו-pgClass (ראו למטה)
index()מתודה ריקה שאתם דורסים. רצה ממש לפני עיבוד התבנית, והיא המקום להוסיף נכסים, meta ומשתנים
get_html()קוראת ל-index() ואז מעבדת את themes/<name>/index.tpl עם $vars דרך Smarty ומחזירה את ה-HTML

הנה theme מינימלי:

<?php
// themes/default/index.php
class TEMPLATE_default extends bgl_theme
{
	public function index()
	{
		PAGE::add_asset("themes/default/style.scss.css", false, "head");
		PAGE::add_asset("themes/default/app.js", false, "body_end");
		PAGE::add_meta('<meta name="viewport" content="width=device-width, initial-scale=1">');

		$this->vars["site_name"] = CONFIG::$platform_data["name"];
	}
}
{* themes/default/index.tpl *}
<header class="{$pgClass}"><a href="/">{$site_name|escape}</a></header>
<main id="page">{$content nofilter}</main>
<footer>&copy; {$smarty.now|date_format:"%Y"}</footer>

.scss.css מתקמפל בשרת מקובץ ה-.scss שבאותה תיקייה (צנרת הנכסים), וכל הערכים שב-$this->vars זמינים כמשתנים בתבנית.

מה ה-theme מקבל#

משתנה בתבניתמקור
{$content}מה שהבקר החזיר (MISC::$GLOBALS["app_html"]). כבר HTML, לא עושים לו escape
{$pgClass}MISC::$GLOBALS["pgClass"], אם הבקר קבע אותו (מחרוזת ריקה אחרת). נוח כ-class של העמוד, לעיצוב לפי עמוד
{$GLOBALS.key}כל MISC::$GLOBALS (מוקצה אוטומטית על ידי FILES::html_template)
כל מפתח ב-$this->varsמה שהוספתם ב-index()
טיפ
index() של ה-theme רץ אחרי שהבקר רץ ו-content כבר מוכן. לכן הוא יכול להגיב למה שהבקר קבע: לקרוא MISC::$GLOBALS["pgClass"], לבדוק PAGE::$is_404, או לדלג על כותרת עליונה בעמודים מסוימים. מצד שני, כשהוא רץ כבר מאוחר מדי להשפיע על קבוצות minify, ראו מחזור החיים.

בחירת theme#

לאתר#

ה-theme הראשי נקבע בשדה deftheme של טבלת CRM_platforms, בפאנל {admin}/platforms ("טיימפלט ברירת המחדל"). הרשימה שם היא כל תיקיית משנה של themes/ בשורש האתר. אם בקשה לא בחרה theme אחר, PAGE::load מציבה את platform_data["deftheme"] ממש לפני הרצת הבקר.

אתר רב-שפות או רב-פלטפורמות יכול להחזיק theme שונה לכל פלטפורמה, כי deftheme הוא שדה של הפלטפורמה (פלטפורמות ושפות).

לעמוד מסוים#

בכל קוד שרץ לפני הרינדור, בדרך כלל בבקר:

class landing extends bgl_controller
{
	public function index()
	{
		PAGE::set_theme("landing");        // themes/landing/index.php, class TEMPLATE_landing
		return $this->view("landing/index");
	}
}

ו-PAGE::set_theme(false) מוציאה את העמוד בלי theme: הפלט הוא רק מה שהבקר החזיר, עטוף ב-<html> ו-<head> רגילים. כך עובדים pdf_viewer ועמודי /p/<slug> (כש-chrome הוא none). קראו ל-set_theme בבקר, לא בקובץ ב-application/includes, אלא אם אתם רוצים שזה ישפיע על כל האתר.

שימו לב

שם ה-theme נכנס ישירות לנתיב (require_once "themes/<name>/index.php") ולשם מחלקה (new TEMPLATE_<name>), בלי ולידציה. הקפידו להעביר ל-set_theme רק מחרוזות שאתם שולטים בהן, לא ערך שהגיע מ-$_GET או מבסיס הנתונים של משתמשים.

הערה

ל-theme יש השפעה על קבוצות minify: קבוצה ב-CRM_minify_groups שה-theme שלה מוגדר נטענת רק כש-PAGE::$theme שווה לו בזמן בחירת הקבוצות, שהוא לפני הרצת הבקר. לכן set_theme שנקרא בבקר לא יביא קבוצה של ה-theme החדש. אם צריך קבוצה ייעודית לעמוד, הוסיפו אותה בבקר עם PAGE::add_asset_group($id).

ה-themes של הליבה#

לליבה יש שני themes משלה, ב-api/core/themes/ (באתר: system/core/themes/): admin_login ו-admin_panel. הם נטענים אוטומטית בצד האדמין (מסך הכניסה והפאנל), מתוך תיקיית הליבה ולא מ-themes/ של האתר. הם לא משתנים בעדכון אלא עם הליבה, ואין לערוך אותם באתר. אם צריך לשנות את מראה האדמין, ראו ממשק האדמין.

ראו גם#

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