Tema Motoru
Site teması kurulumun tüm kamuya açık alanına sahiptir: ziyaretçinin gördüğü her sayfanın işaretlemesi, biçimlendirmesi ve metni.
Genel Bakış
Yönetim paneli ile site farklı sistemlerle üretilir. Panel sabittir: şablonları düz PHP. Site temalıdır: tema, platformun verisini teslim ettiği bir view dizinidir.
Tema bir kaplama değildir: altında geri düşülecek işaretleme yoktur. Sepet view'ı olmayan temada sepet de yoktur; her tema aynı sayfa listesini uygular.
Yapı
Şablon Motorları
Üç motor desteklenir; bir tema manifestinde birine bağlanır. Aynı veri view'a ulaşır.
.tpl uzantılı.
.twig uzantılı.
.php şablonlar. Dile tam erişim, kaçışta tam sorumluluk.
Temanın İçinde Ne Var
Tema dizini templates/website altında durur. Dizinin kendisi temadır; okunan ilk dosya manifestidir.
templates/website/{Tema}/
├── theme.php # manifest: motor, meta, durum, ayar şeması. Yazar tarafından yazılır
├── config.php # kaydedilmiş ayar DEĞERLERİ. Çalışma anında yazılır, elle asla
├── hooks.php # temanın dinleyicileri: değişkenler, çıktı filtreleri, rota eklemeleri
├── cover.png # meta['image'] anahtarının gösterdiği katalog görseli
├── layouts/ # bir view'ın genişlettiği sayfa kabukları: default, auth, checkout, invoice
├── partials/ # kabuğun birleştirdiği parçalar: header, footer, topbar, drawer, popup
├── components/ # iki ya da daha çok view'ın paylaştığı işaretleme: plan ızgarası, ödeme yöntemleri
├── views/ # yüzeylerin kendisi, alana göre gruplu: account/ auth/ checkout/ content/ page/ products/
├── tables/ # müşteri paneli liste tablolarının kolon ön ayarları
├── assets/ # temanın getirdiği css, js, görsel, favicon
├── locale/ # temanın kendi metinleri, dil ve view kapsamı başına
└── content/ # o metinlerin operatör düzenlemeleri, panelden yazılır
account/dashboard ister; dizini ve uzantıyı motor ekler.
css/, js/, images/, favicon, kütüphaneler. Tek bir fonksiyonla adreslenir.
locale/ yazarın varsayılanlarını dil ve view kapsamı başına tutar; content/ operatörün düzenlemelerini.
Veri Nasıl Gelir
İşi controller'lar yapar ve sonucu view'a adlandırılmış değişkenler olarak teslim eder. Tema veritabanını kendisi sorgulamaz; fazladan bir şeyi kancayla ister.
Değişkenlerin çoğu tek bir sayfaya aittir ve Şablon Değişkenleri'nde kataloglanır. Küçük bir kümeyi platform her tema view'ına enjekte eder.
brand hex, brand_rgb ise "0, 149, 149".
en) ve ltr/rtl. Yerleri <html> elemanıdır; elle yazmak sağdan sola dil paketlerini bozar.
resources/, bu temanın dizini. $tadress yalnız assets/ dışı içindir.
$company_name ve $current_year her müşteri sayfasında bulunur. Bu listenin dışındaki her şeyi göstermeden önce |default: ile kontrol edin.
Referans
Manifest: theme.php
Düz bir dizi, sınıf değil. Beş üst seviye anahtar; yalnız engine temanın nasıl üretildiğini değiştirir. Tamamı Tema Anatomisi'nde.
'smarty', 'twig' ya da 'php'. Motorun bildirildiği tek yer; view uzantısını da bu belirler.
'ready' ya da 'development'. Geliştirme teması önizlenebilir ama etkinleştirilemez. Anahtarın yazılmaması hazır demektir.
name, version, author, website, image, description. Buradan okunur, kayıtlı değerlerden asla.
config.php'ye iner.
Ayar Şeması
settings iki harita taşır: groups = anahtar => ['label', 'icon'], fields = anahtar => tanım:
switch · checkbox · color · number · select · textarea. Başka her şey metin alanı olarak görünür.
değer => etiket anahtarı biçiminde. Varlığı alanı açılır listeye çevirir.
başka alan => gereken değer haritası. Her koşul sağlanana kadar satır kapalı kalır.
multilang etkin dil başına bir sekme verir ve dil => değer haritası saklar. rows textarea'yı boyutlandırır, varsayılan 4.
Tema Nesnesi
public static function active(): self; // kurulumun teması, yoksa Basic'e düşer
public static function installed(): array;
public static function manifest(string $themeName): array;
public function getName(): string;
public function engine(): string;
public function exists(): bool;
public function dir(): string; // dosya sistemi yolu, sonunda ayraçla
public function assetUrl(string $path = ''): string; // assets/ altındaki bir dosyanın adresi
public function viewExists(string $view): bool; // 'account/dashboard', uzantısız
public function render(string $view, array $data = []): string;
public function lang(string $key, array $vars = []): string;
public function settingsSchema(): array; // theme.php → settings
public function savedConfig(): array; // config.php → kaydedilmiş değerler
public function setting(string $key): mixed; // kayıtlı değer, yoksa şema varsayılanı
public function allSettings(): array; // view'ların $setting olarak aldığı şey
public function boot(): void; // hooks.php'yi ilk render'dan önce bir kez dahil eder
Örnek
Bir ayarın iki yarısı: şema onu bildirir, view değeri $setting altından geri okur.
return [
'engine' => 'smarty',
'meta' => [
'name' => 'Acme',
'version' => '1.0.0',
'author' => 'Acme Ltd',
'image' => 'cover.png',
],
'settings' => [
'groups' => [
'topbar' => ['label' => 'grp_topbar', 'icon' => 'bi-megaphone'],
],
'fields' => [
'topbar_enabled' => [
'type' => 'switch',
'group' => 'topbar',
'label' => 'set_topbar_enabled', // locale/{lang}.php içindeki anahtar
'default' => false,
],
'topbar_text' => [
'type' => 'textarea',
'group' => 'topbar',
'label' => 'set_topbar_text',
'default' => '',
'rows' => 3,
'multilang' => true,
// Üstteki anahtar açılana kadar satır kapalı kalır.
'depends' => ['topbar_enabled' => true],
],
],
],
];
{if $setting.topbar_enabled}
<div class="topbar">{$setting.topbar_text nofilter}</div>
{/if}
Temanın her sayfada ihtiyaç duyduğu veri kendi kanca dosyasından geçer. Dinleyiciye şablon yolu ve veri verilir; veriyi döndürmek zorundadır.
// Tema başına TEK handler: yalnız son kaydın dönüş değeri yaşar.
Hook::add("filter:template.variables", 1, function ($template, $data) {
// Her site sayfasında çalışır, o yüzden sorgu içeren her şey cache'ten geçer.
$data["footer_groups"] = Cache::remember('website', 'acme_footer_' . Language::selected(), 3600,
fn (): array => Products::groups());
return $data; // dönüş vermemek platformun topladığı her anahtarı düşürür
});
// Veri değil işaretleme: layout'un kanca noktaları dizeyi alır ve olduğu gibi basar.
Hook::add("ui:client.head.css", 1, fn () => '<link rel="stylesheet" href="' . Theme::active()->assetUrl('css/extra.css') . '">');
Tuzaklar
Temalar kardeştir, fork değil: birindeki kusur diğerlerinde de vardır. Düzeltmeyi kümenin tamamına uygulayın.
Korumalar platformda vardır ama form onları ancak tema dahil ederse alır.
İki etiket motoru da view'ları sunmadan önce diske düz PHP olarak derler. Değerleri ve kararları PHP'de tutun.
Yalnız son kaydın dönüş değeri yaşar; ikinci bir kayıt birincinin verisini sessizce çöpe atar.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.