T-SOFT/Tema Geliştirme/Twig (Şablon Dili)

Twig (Şablon Dili)

T-SOFT temaları Twig ile yazılır. Twig üç temel sözdizimi üzerine kuruludur:

SözdizimiGö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 }}
Twig varsayılan olarak HTML escape eder. Güvendiğiniz HTML çıktısı için |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.

Globals UPPERCASE'dir.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
tO blok için enjekte edilen çeviri sözlüğü (block + common). {{ t.next }} veya dinamik {{ t[key] }}. Bkz. Locale ve Çeviriler.
BLOCKAktif section instance'ı — en çok BLOCK.ID (DOM ID üretmek için) kullanılır.
SETTINGTema-genelinde nested ayarlar. Ör. SETTING.PERVIEW.XL, SETTING.SUBFOLDER_PRODUCT_DETAIL_IMAGES.
CART_INFOSepet bilgisi — COUNT, TOTAL gibi alanlar.
CURRENCYAktif para birimi (ör. TL).
DESIGN_MODEMağaza editör/tasarım modunda mı (true/false).
IS_ADMIN_LOGGEDYönetici giriş yapmış mı.
IS_HOME_PAGEAktif sayfa ana sayfa mı (0/1).
SEARCH_WORDAranan kelime (varsa).
PRODUCTS, TOTAL, ALLOWED_SORTSListe 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_LISTAktif sayfa/ürün için kampanya listesi.
Değişken listesini mağaza üzerinde doğrulayın.T-Soft Theme Devtools Chrome eklentisi → Global Değişkenler sekmesi, o sayfada erişilebilir global değerleri canlı olarak gösterir. Detay için bkz. Genel Bakış — Devtools.

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

FiltreGöreviÖrnek
moneyPara birimine göre biçimlendirir{{ 749.9|money }} → ₺749,90
dateTarihi biçimlendirir (PHP format){{ post.date|date('d.m.Y') }}
defaultBoşsa yedek değer{{ title|default('Ürün') }}
truncateMetni kısaltır{{ desc|truncate(80) }}
upper / lowerBüyük / küçük harf{{ product.title|upper }}
escape / eHTML escape (varsayılan){{ user_input|e }}
rawEscape'i atla{{ html_content|raw }}
replacePlaceholder değiştirir{{ t.search_result|replace({'%COUNT%': TOTAL}) }}
mergeİki object'i birleştirir{{ OBJ|merge({key: val}) }}
lengthEleman / karakter sayısı{{ PRODUCTS|length }}
joinDiziyi birleştir{{ tags|join(', ') }}
Filtreler zincirlenebilir: {{ product.title|upper|truncate(30) }} önce büyük harfe çevirir, sonra kısaltır.

Yaygın fonksiyonlar

FonksiyonGö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) %}
Bu tablo bir özettir.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' %}
FormNe 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 vs include vs macro: Gündelik tema parçaları için 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 %}

Sıradaki adım