Tema Ayarları

1.7k görüntülenme Markdown

Temanın kabul ettiği ayarları manifestinde bildirin. Admin formu, doğrulama ve kayıt dosyası ardından gelir; view sonucu tek bir değişkenden okur.

Genel Bakış

Tema bir sınıf değil, veridir. Neyle yapılandırılabileceğini bildirir, nasıl düzenlendiğine karışmaz. Panel her alanı bildirilen tipine göre doğrular ve değerleri temanın kendi dizinine yazar.

Sözleşmenin sınırı da budur. Tema bir alan ekleyip kontrol alır ama formun altyapısına karar veremez. Şemada olmayan bir değer asla kaydedilmez.

Yapı

İki Dosya, İki Sahip

theme.php Şema, varsayılanlar ve temanın adı, sürümü, motoru. Temayla gelir, çalışma anında asla yazılmaz.
config.php Panelin düz bir harita olarak yazdığı kayıtlı değerler. İlk kayda kadar dosya yoktur, sürüm kontrolüne de girmez.
Okuma Kayıtlı değer varsa o, yoksa şema varsayılanı.
Form Şemadan üretilir. Daha fazlasını isteyen tema kendi admin markup'ını gönderebilir; ona form oluşturucu ve kayıtlı değerler verilir.

Şemanın Biçimi

theme.php, ayarlar bloğu
$manifest['settings'] = [
    // anahtar => grubun başlığı ve ikonu. Etiket, bu temanın bir LOCALE ANAHTARIDIR.
    'groups' => [
        'topbar' => ['label' => 'grp_topbar', 'icon' => 'bi-megaphone'],
    ],
    // anahtar => tanımlayıcı. Anahtar aynı anda POST adı, config anahtarı ve view'ın
    // okuduğu addır: yeniden adlandırmak kayıtlı olanı öksüz bırakır.
    'fields' => [
        'topbar_enabled' => ['type' => 'switch', 'group' => 'topbar', 'label' => 'set_topbar_enabled', 'default' => false],
    ],
];

Adım Adım

Bir Grup Bildirin

  1. Gruplar haritasına başlık ve ikon sınıfı taşıyan bir giriş ekleyin.
  2. Başlık metnini temanın locale dosyasına iki dilde koyun ve anahtarıyla referans verin. Çevirisi olmayan anahtar kendisi olarak görünür.
  3. Grubu bildirilmemiş bir alan yine görünür; gruplanmamış olur.

Bir Alan Bildirin

  1. Tipi aşağıdaki listeden seçin. Kontrolü, doğrulamayı ve saklanan değerin biçimini o belirler.
  2. Gerçek bir varsayılan verin, boş yer tutucu değil. Temiz kurulumdaki ve her sıfırlamadan sonraki değer budur.
  3. Yardım cümlesi için desc, başka bir alan açıkken anlamlıysa depends ekleyin.
  4. Yapılandırma sayfasını yenileyin. Kontrol oradadır, başka dosyaya dokunulmadı.

View'da Okuyun

  1. Ayar değişkeninden anahtarıyla okuyun. Fonksiyon değil değişkendir; bir koşulun içinde böyle çalışır.
  2. Renk için değerin kendisini özelliğe, _rgb ikizini de yarı saydam bir sürüm gereken her yere okuyun.
  3. PHP tarafında tek bir ayarı tema nesnesinden anahtarıyla isteyin; haritanın tamamı yüklenmez.

Admin Formunu Devralın

  1. Tema dizinine bir admin-settings.php ekleyin; üretilen formun tamamının yerine geçer.
  2. Markup'ı size verilen form oluşturucu, kayıtlı değerler ve şemayla kurun. HTML'i dize olarak döndürün.
  3. Alan adlarını şema anahtarlarıyla birebir aynı tutun. Başka adla verilen bir kontrol gönderilir ve atılır.

Referans

Alan Tipleri

TipKontrolSaklananKayıtta doğrulama
switch, checkboxKutucuk; desc yanındaki etiket olurBooleanİşaretliyse true, gelmemişse false
selectoptions'tan kurulan açılır listeSeçilen anahtaroptions anahtarlarından biri olmalı, değilse varsayılan
numberSayı girişiTam sayıTam sayıya çevrilir; sayısal olmayan sıfır olur
colorRenk seçici ve yazılabilir hex kutusuBaştaki diyezle birlikte hex dizeÜç ile sekiz arası hex basamağı, değilse varsayılan
textarearows ile boyutlanan metin kutusuDize, çok dilliyse dil haritasıhtml kapalıysa etiketler temizlenir, açıksa izin listesine süzülür
başka her şey ya da tipsizMetin girişiDize, çok dilliyse dil haritasıMetin kutusuyla aynı

Tanımlayıcının Kabul Ettikleri

type Yukarıdaki tiplerden biri; yokluğu metin alanı demektir.
group Alanın ait olduğu grup. Bildirilmemiş bir grup alanı gruplanmamış bırakır.
label Düz metin değil, bu temanın bir locale anahtarı. Operatörün dilinde çözülür; sonra İngilizce, sonra anahtarın kendisi.
desc Yardım satırı için locale anahtarı. Kutucukta, kutunun yanındaki etiket olur.
placeholder Metin kontrolündeki ipucu için locale anahtarı. Etiket değildir; alanın kendi etiketi yine gerekir.
default Operatör kaydedene kadarki değer; gönderilen değer doğrulamadan geçemezse de buna dönülür. Boş bırakılan renk, türetilen rgb ikizini üç sıfır yapar.
options Yalnız select; saklanan değerden etiket anahtarına: ['rail' => 'opt_rail', 'card' => 'opt_card']. Kayıtlı değerin denetlendiği izin listesi de budur.
depends Başka bir alanı taşıması gereken değere eşleyen harita: ['topbar_enabled' => true]. Satır, her koşul sağlanana kadar kapalı durur; hem yüklemede hem operatör yazarken.
multilang Metin ve metin kutusunda geçerli. Aktif dil başına bir sekme, saklanan değer bir dil haritası. View düz dize alır.
rows Metin kutusunun yüksekliği, varsayılanı dört. Diğer bütün tiplerde yok sayılır.
html · allowed_tags Metin değerindeki markup'ı temizlemek yerine korur. Liste alan başına daraltılabilir; varsayılanı temel biçimlendirmeyi ve bağlantıları kapsar.
from_logo Renk alanlarında geçerli. Alanı marka rengi olarak işaretler ve paletteki sırasını verir. "Logodan renkleri al" butonu onu site logosundan doldurur.

Ayar API'si

imzalar
// Manifestteki ayarlar bloğu, bildirildiği gibi (groups + fields).
public function settingsSchema(): array;

// Tek değer: anahtar hiç kaydedildiyse kayıtlı olan, yoksa şema varsayılanı, o da
// yoksa null. Platform tek bir tema yeteneğini böyle okur.
public function setting(string $key): mixed;

// Yalnız kayıtlı değerler (config.php). İlk kayda kadar boştur.
public function savedConfig(): array;

// Her şema alanı değeriyle birleşmiş hâlde : view'ın $setting olarak aldığı şey.
// Çok dilli değer burada AKTİF dile indirgenir ve renk alanı ayrıca bir
// "{anahtar}_rgb" girdisi üretir.
public function allSettings(): array;

// Bir hex rengi, rgba() ifadesinin istediği virgüllü üçlüye çevirir. Kısa biçimler
// genişletilir ve kısa değer doldurulur, bu yüzden boş dize hata değil üç sıfır verir.
// Yukarıdaki "{anahtar}_rgb" girdilerini üreten budur.
public static function hexToRgb(string $hex): string;

Örnek

Dört alanlı bir grup, ürettiği kayıt dosyası ve onu geri okuyan view. Birlikte gösterilmelerinin tek sebebi var: şemadaki anahtar, dosyadaki anahtar ve view'daki ad aynı dizedir.

templates/website/Acme/theme.php
return [
    'engine' => 'smarty',
    'status' => 'ready',
    'meta'   => [
        'name'    => 'Acme',
        'version' => '1.0.0',
        'author'  => 'Acme Ltd',
        'image'   => 'cover.png',
    ],
    'settings' => [
        'groups' => [
            'brand'    => ['label' => 'grp_brand', 'icon' => 'bi-palette'],
            'topbar'   => ['label' => 'grp_topbar', 'icon' => 'bi-megaphone'],
            'checkout' => ['label' => 'grp_checkout', 'icon' => 'bi-cart3'],
        ],
        'fields' => [
            // Bir marka rengi. `from_logo`, panelin site logosundan çıkardığı paletteki
            // sırasıdır; "renkleri logodan seç" düğmesi bu alanı o sıradan doldurur.
            // Varsayılan, diyez artı altı onaltılık hane biçimindedir (seçicinin kendi
            // biçimi) — yer tutucuyu bu temanın gerçek rengiyle değiştirin. Boş
            // bırakılırsa türetilen primary_color_rgb üç sıfır okunur ve ondan kurulan
            // her yarı saydam yüzey siyaha boyanır.
            'primary_color' => [
                'type'      => 'color',
                'group'     => 'brand',
                'label'     => 'set_primary_color',
                'from_logo' => 0,
                'default'   => '#RRGGBB',
            ],

            // Kapı. Altındaki her şey buna bağlıdır.
            'topbar_enabled' => [
                'type'    => 'switch',
                'group'   => 'topbar',
                'label'   => 'set_topbar_enabled',
                'desc'    => 'set_topbar_enabled_desc',
                'default' => false,
            ],

            // Dil başına ve markup taşıyabilir: duyurunun içinde genelde bir bağlantı olur.
            // Saklanan değer bir haritadır; view yine dize alır.
            'topbar_text' => [
                'type'      => 'textarea',
                'group'     => 'topbar',
                'label'     => 'set_topbar_text',
                'default'   => '',
                'rows'      => 3,
                'multilang' => true,
                'html'      => true,
                'depends'   => ['topbar_enabled' => true],
            ],

            // Anahtarlar saklanan şeydir; değerler bu temanın locale anahtarlarıdır.
            'checkout_sidebar' => [
                'type'    => 'select',
                'group'   => 'checkout',
                'label'   => 'set_checkout_sidebar',
                'options' => [
                    'rail'  => 'opt_checkout_rail',
                    'card'  => 'opt_checkout_card',
                    'stack' => 'opt_checkout_stack',
                ],
                'default' => 'rail',
            ],

            'popup_width' => [
                'type'    => 'number',
                'group'   => 'checkout',
                'label'   => 'set_popup_width',
                'default' => 500,
            ],
        ],
    ],
];
templates/website/Acme/config.php
return [
    // Seçicinin gönderdiği hâliyle, baştaki diyezle saklanır. Dikkat: operatör
    // dokunmamış olsa da HER şema alanı her kayıtta yeniden yazılır.
    'primary_color'    => '#RRGGBB',
    'topbar_enabled'   => true,
    // Çok dilli: dil başına saklanır, kayıt anındaki her AKTİF dil için bir giriş.
    'topbar_text'      => [
        'en' => 'Free migration this month.',
        'tr' => 'Bu ay ücretsiz taşıma.',
    ],
    'checkout_sidebar' => 'card',
    'popup_width'      => 520,
];
onu okuyan view
{* Boolean doğrudan bir koşulun içinde okunur; bunun DEĞİŞKEN olup fonksiyon
   olmamasının sebebi budur: kayıtlı bir fonksiyon {if} içinden çağrılamaz. *}
{if $setting.topbar_enabled}
    {* Kayıtta markup korundu, bu yüzden burada filtresiz basılır. *}
    <div class="topbar">{$setting.topbar_text nofilter}</div>
{/if}

{* Select yalnızca saklanan anahtarıdır: dört kez dallanmak yerine sınıf olarak kullanın. *}
<div class="checkout-layout-{$setting.checkout_sidebar}">

{* Renk alanı ayrıca bir _rgb ikizi üretir; aynı rengin yarı saydam sürümü için. *}
<style>
    :root {
        --acme-brand: {$setting.primary_color};
        --acme-brand-rgb: {$setting.primary_color_rgb};
    }
</style>

Tuzaklar

Anahtarı yeniden adlandırmak kayıtlı değeri öksüz bırakır

Anahtar hem form adı, hem saklanan anahtar, hem de view'ın okuduğu addır. Eski adla saklanmış değer bir daha okunmaz ve temizlenmez. Temayı yapılandırmış her kurulum varsayılana döner.

Kayıt dosyası üretilir, kaynak değildir

Sadece değer tutar. Temanın adı ve sürümü manifestte kalır; tema listesi ve güncelleme kontrolü onları oradan okur. Dosyayı tema paketiyle göndermek, test yapılandırmanızı onu kuran herkese teslim eder.

Çok dilli değer dosyada harita, view'da dizedir

Ham ayarı isteyen PHP haritanın tamamını alır. View aktif dili çözülmüş hâlde alır. Birini diğeri sanan kod tam olarak bir yerde çalışır.

Kapalı duran bağımlı alan yine kaydedilir ve yine okunur

Bağımlılık satırı gizler, değeri devre dışı bırakmaz. Bağımlı bir ayarı okuyan view, bağlı olduğu alanı da kontrol etmelidir. Yoksa operatörün kapalı sandığı bir şeyi gösterir.

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.