Tema Motoru

10 görüntülenme Markdown

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.

smarty Kendi filtreleri ve fonksiyonları olan etiket söz dizimi, view'lar .tpl uzantılı.
twig Diğer etiket motoru, view'lar .twig uzantılı.
php Etiket katmanı olmayan düz .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.

düzen
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
theme.php Zorunlu olan tek dosya: motor, katalog kaydı, ayar şeması. Yoksa dizin panelde hiç görünmez.
config.php Kaydedilmiş değerler. Platform yazar; taze bir tema onsuz dağıtılır.
layouts/ Sayfa kabukları: kamuya açık, ödeme, fatura; artı isteğe bağlı giriş kabuğu. Bir view tek kabuğu genişletir.
partials/ View'ın değil kabuğun birleştirdiği parçalar: header, footer, topbar, drawer, popup.
components/ İki ya da daha çok view'ın paylaştığı işaretleme: plan ızgarası, ödeme yöntemleri, pano paneli.
views/ Sayfalar, alana göre gruplu. Controller account/dashboard ister; dizini ve uzantıyı motor ekler.
tables/ Müşteri paneli listelerinin kolon ön ayarları. Eksik ön ayar hata değildir: ham kolonlar görünür.
assets/ Tarayıcının indirdiği her şey: css/, js/, images/, favicon, kütüphaneler. Tek bir fonksiyonla adreslenir.
locale/ ve content/ locale/ yazarın varsayılanlarını dil ve view kapsamı başına tutar; content/ operatörün düzenlemelerini.
hooks.php İsteğe bağlı, ilk sayfadan önce bir kez dahil edilir. Temanın controller'sız platforma uzandığı yer.

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.

$setting Dizi. Manifest ayar anahtarları, kaydedilmiş değerlerle birleşmiş. Çok dilli alan aktif dilin string'idir. Renk alanı iki kez görünür: brand hex, brand_rgb ise "0, 149, 149".
$ui_lang · $ui_dir String. Aktif dil anahtarı (en) ve ltr/rtl. Yerleri <html> elemanıdır; elle yazmak sağdan sola dil paketlerini bozar.
$badress · $sadress · $tadress String, üçü de sonunda eğik çizgiyle: kurulum kökü, paylaşılan resources/, bu temanın dizini. $tadress yalnız assets/ dışı içindir.
$template_dir String. Temanın dosya sistemi yolu; adres değil. İşaretlemede göstermek sunucu yolunu sızdırır.
$cookie_domain String; kurulum çerezleri alt alan adları arasında paylaşmıyorsa boş. Temanın kendi çerezleri bu kapsamı taşımak zorundadır.
$demo_mode Boolean; yalnız tanıtım kurulumunda true.

$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.

engine 'smarty', 'twig' ya da 'php'. Motorun bildirildiği tek yer; view uzantısını da bu belirler.
status 'ready' ya da 'development'. Geliştirme teması önizlenebilir ama etkinleştirilemez. Anahtarın yazılmaması hazır demektir.
update-url Sürüm kontrolünün istek attığı adres. Boş bırakılırsa tema hiç kontrol edilmez.
meta Katalog kaydı: name, version, author, website, image, description. Buradan okunur, kayıtlı değerlerden asla.
meta['disabled_routes'] Temanın servis etmediği rota anahtarları. O adresler 404 döner ve site haritasından düşer.
settings Aşağıdaki ayar şeması. Yönetim formu ondan üretilir; değerler config.php'ye iner.

Ayar Şeması

settings iki harita taşır: groups = anahtar => ['label', 'icon'], fields = anahtar => tanım:

type switch · checkbox · color · number · select · textarea. Başka her şey metin alanı olarak görünür.
group Alanın ait olduğu grubun anahtarı. Grubu bildirilmemiş alan gruplanmadan görünür.
label · desc · placeholder Düz metin değil: temanın kendi locale dosyasındaki anahtarlar. Çözülemeyen anahtar kendisi olarak görünür.
default Operatör bir değer kaydedene kadar kullanılan değer; view'lar onu gösterebilmelidir.
options Yalnız select, değer => etiket anahtarı biçiminde. Varlığı alanı açılır listeye çevirir.
depends başka alan => gereken değer haritası. Her koşul sağlanana kadar satır kapalı kalır.
multilang · rows Yalnız text ve textarea. 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

coremio/classes/Theme.php
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.

templates/website/Acme/theme.php
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],
            ],
        ],
    ],
];
değeri geri okuyan view
{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.

templates/website/Acme/hooks.php
// 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

Bir düzeltme yalnız sizin temanıza değil hepsine aittir

Temalar kardeştir, fork değil: birindeki kusur diğerlerinde de vardır. Düzeltmeyi kümenin tamamına uygulayın.

Form korumasını temanın icat etmesi değil bağlaması gerekir

Korumalar platformda vardır ama form onları ancak tema dahil ederse alır.

Şablon sır saklanacak yer değildir

İki etiket motoru da view'ları sunmadan önce diske düz PHP olarak derler. Değerleri ve kararları PHP'de tutun.

Tema birkaç değil tek bir değişken dinleyicisi kaydeder

Yalnız son kaydın dönüş değeri yaşar; ikinci bir kayıt birincinin verisini sessizce çöpe atar.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.