ה-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>© {$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/ של האתר. הם לא משתנים בעדכון אלא עם הליבה, ואין לערוך אותם באתר. אם צריך לשנות את מראה האדמין, ראו ממשק האדמין.
ראו גם#
- תבניות Smarty: תחביר, תוספים ומלכודות.
- PAGE API:
add_asset,add_meta, אירועים ו-set_theme. - צנרת הנכסים:
.scss.css, קבוצות minify. - מבנה האתר ו-הדף הראשון.