İlk Temanız
Dört dosya, bir dizin ve bir buton: kurulumun gerçekten sunacağı bir tema.
Genel Bakış
Tema hiçbir yere kaydedilmez. templates/website altında bir dizin açıp içine manifest koyarsınız; panel onu bulur.
Geçiş iznine iki kapı karar verir: manifest, artı bir varsayılan kabuk ve bir ana sayfa view'ı.
Ön Koşullar
templates/websiteve derlenmiş şablonların düştüğütempdizinine yazma izni.- Tema değiştirebileceğiniz bir kurulum: etkinleştirme kamuya açık sitenin yerine geçer.
- Bir kez okunmuş Tema Motoru: manifest ile değerler ayrımı için.
coremio/configuration/debug.phpiçindedeveloperaçık olmalı; yoksa şablon hatası yutulur.
Yapı
Kapıların Gerçekte İstediği
Tema ekranı kapı tutmaz: her dizin için bir kart gösterir. Her şey Etkinleştir'de karara bağlanır ve başarısız olan ilk kontrol aldığınız mesajdır.
| Koşul | Ne zaman kontrol edilir | Sağlanmazsa ne olur |
|---|---|---|
theme.php var | Etkinleştirmede ve kartta | Kart motorsuz ve Unknown yazarla görünür; etkinleştirme reddedilir |
status değeri 'development' değil | Etkinleştirmede, ilk sırada | Geliştirme mesajıyla reddedilir; önizleme çalışır |
layouts/default.* | Etkinleştirmede, durum kontrolünden sonra | Paket eksik mesajıyla reddedilir |
views/home.* | Etkinleştirmede, durum kontrolünden sonra | Aynısı: iki dosya çift olarak kontrol edilir |
locale/{lang}.php | Hiç | İsteğe bağlı; olmadığında etiketler ham anahtar olarak görünür |
* yerine engine anahtarınızın seçtiği uzantı gelir. Aşağıdaki örnekler Smarty ile yazılmıştır.
Adım Adım
1. Dizini Açın
templates/website/Acme/dizinini oluşturun. Klasör adı temanın kimliğidir.- İçinde
layouts/,views/,locale/veassets/css/açın.
Tema ekranını yenileyin. Kart boş bir klasör gösterir: yer tutucu kapak, klasör adı.
2. Manifesti Yazın
- Aşağıdaki diziyi döndüren
templates/website/Acme/theme.phpdosyasını oluşturun. engineanahtarını bilerek yazın: her view'ın uzantısını o belirler. Yazmamak düz PHP demektir.- Geliştirirken
update-urlanahtarını boş bırakın: tema hiç kontrol edilmez.
Ekranı yenileyin. Kart artık adı, sürümü, yazarı ve motoru taşıyor. Etkinleştir reddedilir: status değeri 'development'.
3. Sayfa Kabuğunu Ekleyin
layouts/default.tpldosyasını oluşturun: belge ve bir view'ın dolduracağı bloklar.- Beş blok bildirin:
title,head,content,scripts,body_end. Dağıtılan temalar bu adları kullanır. - Her dosya için
{asset}, her metin için{lang}kullanın.
Kapının yarısı sağlandı; ikinci dosyaya kadar ret sürer.
4. Ana Sayfa View'ını Ekleyin
views/home.tpldosyasını oluşturun: kabuğu genişletir,contentbloğunu doldurur.- Gerçek bir değer gösterin:
{$company_name}her müşteri sayfasındadır.
Bütünlük kapısının iki yarısı da yerinde; geriye yalnız status kaldı.
5. Temanın Kendi Metinlerini Ekleyin
locale/en.phpdosyasını oluşturun: anahtardan metne düz bir harita.- İçine
namevedescriptionkoyun; kart bunları manifestten önce okur. - Ana sayfa view'ındaki her metin için bir anahtar ekleyin,
{lang key='...'}ile çağırın.
Kart artık adınızı ve açıklamanızı gösteriyor.
6. Etkinleştirin
theme.phpiçindekistatusanahtarını'ready'yapın.'development'yazdığı sürece buton reddedilir.{admin}/settings/theme?group=themeadresinde Acme kartındaki Etkinleştir butonuna tıklayın.- Başka bir sekmede site kökünü açın.
Ana sayfa sizin işaretlemeniz. Seçim coremio/configuration/theme.php içinde tek bir anahtar olarak saklanır.
Referans
View Neyi Çağırabilir
Her iki motor da sınıf izin listesi boş bir kum havuzunda çalışır. Köprünün tamamı dokuz fonksiyondur: Smarty adlandırılmış, Twig konumsal.
| Fonksiyon | Smarty | Twig | Dönen |
|---|---|---|---|
link | {link route='x' p1='a' p2='b'}{link page='pages/1'} | link('x', null, 'a', 'b') | Bir rota anahtarının adresi ya da saklanmış bir sayfanın hedefi |
lang | {lang key='k' foo='bar'} | lang('k') | Temanın k çevirisi. Fazladan Smarty parametreleri {foo} yerine geçer; Twig anahtarı alır |
asset | {asset path='css/x.css'} | asset('css/x.css') | Temanın assets/ dizini altındaki adres; css ve js sürümlenir |
config | {config key='favicon'} | config('favicon') | Yalnız tema yapılandırmasından tek değer; eğik çizgili anahtar boş döner |
money | {money amount=$v currency=$c} | money(v, c) | Tutar, sembolüyle. Varsayılan para birimi ziyaretçininki |
hook | {hook name='ui:client.head.css'} | hook('ui:client.head.css') | Her dinleyicinin string dönüşü |
captcha | {captcha area='a' tray='t' class='' force=false} | captcha('a', 't', '', false) | Aktif sağlayıcının bileşeni; captcha kapalıysa boş string |
csrf | {csrf form='key'} | csrf('key') | O form anahtarı için gizli token input'u |
content | {content var=$page.content} | content(page.content) | Operatörün yazdığı HTML, ham gösterilir; içindeki şablon söz dizimi derlenir |
Smarty kum havuzu ayrıca yirmi düz PHP fonksiyonuna izin verir. Twig'in PHP erişimi yoktur: on iki etiket, on yedi filtre. Gerisi kum havuzu hatası doğurur.
// Smarty: bir view'ın çağırabileceği tek PHP fonksiyonları
count sizeof nl2br number_format htmlspecialchars strip_tags
strlen mb_strlen substr mb_substr str_contains str_starts_with
str_ends_with ucfirst date time implode explode in_array is_array
// Twig: izin verilen etiketler
if for set block with apply autoescape verbatim extends include use embed
İki motorda da kaçış açıktır: Smarty nofilter eklenmedikçe, Twig raw filtresinden geçirilmedikçe kaçırır.
Örnek
Temanın tamamı.
return [
'meta' => [
'name' => 'Acme',
'version' => '1.0.0',
'author' => 'Acme Ltd',
'website' => 'https://acme.example',
'image' => 'cover.png', // bu dosyanın yanında, assets/ altında değil
],
'update-url' => '', // geliştirirken boş: hiç sürüm kontrolü yapılmaz
'engine' => 'smarty', // HER view'ın uzantısını belirler
'status' => 'development', // yalnız önizleme; etkinleştirilebilir olunca 'ready' yapın
'settings' => [
'groups' => [],
'fields' => [],
],
];
<!doctype html>
{* $ui_lang ve $ui_dir her render'da gelir; elle yazmak RTL paketlerini kırar. *}
<html lang="{$ui_lang}" dir="{$ui_dir}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{block name=title}{$page_title|default:$company_name}{/block}</title>
<link rel="icon" href="{asset path='favicon.svg'}">
<link rel="stylesheet" href="{asset path='css/default.css'}">
{* Sayfaya özel CSS buraya gelir. Sayfaya özel BETİKLER gelmez: aşağıya bakın. *}
{block name=head}{/block}
{hook name='ui:client.head.css'}
</head>
<body>
{hook name='ui:client.body.begin'}
<header class="site-header">
<a href="{link route='home'}">{$company_name}</a>
</header>
<main>{block name=content}{/block}</main>
<footer>© {$current_year} {$company_name}</footer>
{* Önce çekirdek betikler, sonra sayfanınki: defer belge sırasıyla çalışır. *}
<script src="{asset path='js/default.js'}" defer></script>
{block name=scripts}{/block}
{* Modallar <main> dışında, burada durur; sabit bir katman kabuğun yığın bağlamına hapsolmasın. *}
{block name=body_end}{/block}
{hook name='ui:client.body.end'}
</body>
</html>
{extends file='layouts/default.tpl'}
{block name=title}{lang key='home_title'} | {$company_name}{/block}
{block name=head}
<link rel="stylesheet" href="{asset path='css/home.css'}">
{/block}
{block name=content}
<section class="hero">
<h1>{lang key='home_headline' brand=$company_name}</h1>
<p>{lang key='home_lead'}</p>
<a class="btn" href="{link route='sign-in'}">{lang key='home_cta'}</a>
</section>
{/block}
return [
// Paneldeki tema kartı bunları meta.name / meta.description'dan önce okur.
'name' => 'Acme',
'description' => 'A minimal starter theme.',
// Ana sayfa view'ının metinleri. {brand} etiketin kendisi tarafından doldurulur:
// {lang key='home_headline' brand=$company_name}
'home_title' => 'Home',
'home_headline' => 'Everything {brand} runs, in one place.',
'home_lead' => 'Hosting, domains and licences from a single account.',
'home_cta' => 'Sign in',
];
status anahtarını 'ready' yapın. O zamana kadar tema önizlenebilir ama etkinleştirilemez.
Tuzaklar
Platform şablon motorunun fırlattığı her şeyi yakalar ve boş dize döner: yazım hatası ya da kapatılmamış blok boş sayfa üretir. developer anahtarını açın.
{extends file='layouts/default.tpl'}; view'a göreli bir yol değil. Şablon dizini tema dizinidir.
Bütün platform sınıfları view'dan erişilemez. Dilin tamamına ihtiyacı olan tema engine => 'php' bildirir.
İki kez görünen işaretleme components/ dizinine, kabuk parçaları partials/ dizinine aittir.
Veriyi controller'lar hazırlar ve adlandırılmış değişkenler olarak verir. Fazladan veri gerekiyorsa cevap temanın kanca dosyasındaki bir dinleyicidir.
İ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.