Twig (Şablon Dili)
T-SOFT temaları Twig ile yazılır. Twig üç temel sözdizimi üzerine kuruludur:
| Sözdizimi | Görevi |
|---|---|
{{ ifade }} | Bir değişkenin değerini çıktıya yazar. |
{% etiket %} | Mantık bloklarını çalıştırır (koşul, döngü, atama). |
{# yorum #} | Yorum — çıktıya yazılmaz. |
Çıktı
Çift süslü parantez bir değişkeni yazdırır. Filtreler | (pipe) ile zincirlenir.
{{ product.title }}
{{ product.price|money }}
{{ t.go_to_checkout }}
{{ product.description|raw }}
|raw filtresini açıkça kullanın.Mantık etiketleri
Koşul
{% if product.available %}
<button class="btn-primary">Sepete ekle</button>
{% elseif product.coming_soon %}
<span>Yakında</span>
{% else %}
<span class="text-secondary">Tükendi</span>
{% endif %}
Döngü
{% for variant in product.variants %}
<option value="{{ variant.id }}">
{{ variant.title }} — {{ variant.price|money }}
</option>
{% else %}
<option disabled>Varyant bulunamadı</option>
{% endfor %}
{% for ... %} bloğunun else'i, koleksiyon boşsa çalışır.
Atama
{% set discounted = product.price < product.compare_at_price %}
{% set classes = discounted ? 'text-primary' : 'text-body' %}
T-SOFT global'leri
T-SOFT, her sayfa ve section render edilirken Twig context'ine UPPERCASE global değerler ekler. Ayrıca t çeviri sözlüğü ile BLOCK ve SETTING gibi yapılandırma nesneleri kullanılabilir.
cart, product, settings lowercase formları çalışmaz. CART_INFO, PRODUCTS, SETTING gibi büyük harfle yazılırlar. Tam liste mağaza ve section'a göre değişir.Sık karşılaşılan global'ler
| Global | İçerik |
|---|---|
t | O blok için enjekte edilen çeviri sözlüğü (block + common). {{ t.next }} veya dinamik {{ t[key] }}. Bkz. Locale ve Çeviriler. |
BLOCK | Aktif section instance'ı — en çok BLOCK.ID (DOM ID üretmek için) kullanılır. |
SETTING | Tema-genelinde nested ayarlar. Ör. SETTING.PERVIEW.XL, SETTING.SUBFOLDER_PRODUCT_DETAIL_IMAGES. |
CART_INFO | Sepet bilgisi — COUNT, TOTAL gibi alanlar. |
CURRENCY | Aktif para birimi (ör. TL). |
DESIGN_MODE | Mağaza editör/tasarım modunda mı (true/false). |
IS_ADMIN_LOGGED | Yönetici giriş yapmış mı. |
IS_HOME_PAGE | Aktif sayfa ana sayfa mı (0/1). |
SEARCH_WORD | Aranan kelime (varsa). |
PRODUCTS, TOTAL, ALLOWED_SORTS | Liste section'larında gelen veri alanları. |
P | Ürün detay sayfasında aktif ürün (ör. P.ID, P.TITLE, P.PRICE_SELL, P.HAS_VARIANT, P.MULTIPLE_DISCOUNT). |
CAMPAIGN_LIST | Aktif sayfa/ürün için kampanya listesi. |
Section veri alanları
Bir section'a giren UPPERCASE değişkenler o section tipine özgüdür — product-list'e PRODUCTS, TOTAL, SEARCH_WORD gelir; category-menu'ye farklı bir set gelir. Hangi alanların geldiğini her zaman Devtools → Blok Değişkenleri sekmesinden teyit edin. Detay için bkz. Section.
Yaygın filtreler
| Filtre | Görevi | Örnek |
|---|---|---|
money | Para birimine göre biçimlendirir | {{ 749.9|money }} → ₺749,90 |
date | Tarihi biçimlendirir (PHP format) | {{ post.date|date('d.m.Y') }} |
default | Boşsa yedek değer | {{ title|default('Ürün') }} |
truncate | Metni kısaltır | {{ desc|truncate(80) }} |
upper / lower | Büyük / küçük harf | {{ product.title|upper }} |
escape / e | HTML escape (varsayılan) | {{ user_input|e }} |
raw | Escape'i atla | {{ html_content|raw }} |
replace | Placeholder değiştirir | {{ t.search_result|replace({'%COUNT%': TOTAL}) }} |
merge | İki object'i birleştirir | {{ OBJ|merge({key: val}) }} |
length | Eleman / karakter sayısı | {{ PRODUCTS|length }} |
join | Diziyi birleştir | {{ tags|join(', ') }} |
{{ product.title|upper|truncate(30) }} önce büyük harfe çevirir, sonra kısaltır.Yaygın fonksiyonlar
| Fonksiyon | Görevi | Örnek |
|---|---|---|
snippet('isim', {...}) | Bir snippet'ı çağırır | {{ snippet('product-card', {PRODUCT_ID: P.ID}) }} |
snippet_uri('isim', {...}) | Snippet'ın URI'sini üretir (AJAX/lazy load için) | {{ snippet_uri('product-out-stock', {'include':'product-detail'}) }} |
asset('yol') | assets/ altındaki dosyanın URL'sini üretir | {{ asset('images/logo.svg') }} |
cookie('ad') | Cookie değerini okur | {{ cookie('selected_layout') }} |
query('parametre') | URL query parametresini okur | {{ query('sort')|default('0') }} |
url(id, 'tip') | Mağaza içi URL üretir (ör. içerik sayfası) | {{ url(21, 'page') }} |
vat(fiyat, oran) | KDV dahil fiyat hesaplar | {{ vat(P.PRICE_SELL, P.VAT) }} |
format(sayı) | Sayıyı yerel biçimde formatlar | {{ format(P.PRICE_SELL) }} |
range(1, 5) | Sayı dizisi üretir | {% for n in range(1, 5) %} |
menu(), product(), category(), exchange() dahil tüm T-SOFT Twig fonksiyonlarının imza, parametre ve örnekleriyle tam listesi için bkz. Twig Fonksiyonları.Macro ve include
Tekrarlayan mantığı bir macro'ya alıp {% from %} ile import edebilir, parçalı şablonları {% include %} ile gömebilirsiniz:
{% from 'layout/components/macros.twig' import grid_cols %}
<div class="grid {{ grid_cols(PERVIEW, {xs: 2, md: 3}) }}">
...
</div>
{% include 'layout/pagination.twig' %}
| Form | Ne zaman |
|---|---|
{% include 'yol.twig' %} | Bir Twig dosyasını mevcut context ile gömmek |
{% from 'yol.twig' import name %} | Macro'yu fonksiyon gibi çağırmak |
{{ snippet('isim') }} | Yeniden kullanılan tema parçasını çağırmak (T-SOFT'un yolu) |
snippet() kullanın (T-SOFT konvansiyonu). include daha çok layout/ altındaki paylaşılan parça şablonlar için (pagination gibi), macro ise işaretleme üreten yardımcı fonksiyonlar için (grid_cols gibi) tercih edilir.Yorum yazma
{# Bu blok katalog güncellemesinden sonra kaldırılacak — TICKET-1234 #}
{% if false %}
<div>geçici olarak kapalı</div>
{% endif %}