İlk Temanız

5 görüntülenme Markdown

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/website ve derlenmiş şablonların düştüğü temp dizinine 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.php içinde developer açı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şulNe zaman kontrol edilirSağlanmazsa ne olur
theme.php varEtkinleştirmede ve karttaKart motorsuz ve Unknown yazarla görünür; etkinleştirme reddedilir
status değeri 'development' değilEtkinleştirmede, ilk sıradaGeliştirme mesajıyla reddedilir; önizleme çalışır
layouts/default.*Etkinleştirmede, durum kontrolünden sonraPaket eksik mesajıyla reddedilir
views/home.*Etkinleştirmede, durum kontrolünden sonraAynısı: iki dosya çift olarak kontrol edilir
locale/{lang}.phpHiçİ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

  1. templates/website/Acme/ dizinini oluşturun. Klasör adı temanın kimliğidir.
  2. İçinde layouts/, views/, locale/ ve assets/css/ açın.

Tema ekranını yenileyin. Kart boş bir klasör gösterir: yer tutucu kapak, klasör adı.

2. Manifesti Yazın

  1. Aşağıdaki diziyi döndüren templates/website/Acme/theme.php dosyasını oluşturun.
  2. engine anahtarını bilerek yazın: her view'ın uzantısını o belirler. Yazmamak düz PHP demektir.
  3. Geliştirirken update-url anahtarı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

  1. layouts/default.tpl dosyasını oluşturun: belge ve bir view'ın dolduracağı bloklar.
  2. Beş blok bildirin: title, head, content, scripts, body_end. Dağıtılan temalar bu adları kullanır.
  3. 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

  1. views/home.tpl dosyasını oluşturun: kabuğu genişletir, content bloğunu doldurur.
  2. 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

  1. locale/en.php dosyasını oluşturun: anahtardan metne düz bir harita.
  2. İçine name ve description koyun; kart bunları manifestten önce okur.
  3. 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

  1. theme.php içindeki status anahtarını 'ready' yapın. 'development' yazdığı sürece buton reddedilir.
  2. {admin}/settings/theme?group=theme adresinde Acme kartındaki Etkinleştir butonuna tıklayın.
  3. 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.

FonksiyonSmartyTwigDö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.

kum havuzu izin listeleri
// 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ı.

templates/website/Acme/theme.php
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' => [],
    ],
];
templates/website/Acme/layouts/default.tpl
<!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>&copy; {$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>
templates/website/Acme/views/home.tpl
{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}
templates/website/Acme/locale/en.php
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

Eksik view hata değil boş sayfadır

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.

Kabuklara ve parçalara tema kökünden referans verilir

{extends file='layouts/default.tpl'}; view'a göreli bir yol değil. Şablon dizini tema dizinidir.

View'ın dokuz fonksiyonu vardır, sınıfı yoktur

Bütün platform sınıfları view'dan erişilemez. Dilin tamamına ihtiyacı olan tema engine => 'php' bildirir.

İkinci sayfayı birinciyi kopyalayarak kurmayın

İki kez görünen işaretleme components/ dizinine, kabuk parçaları partials/ dizinine aittir.

View hiçbir şey sorgulamaz

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.

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.