Template View Dosyaları Referansı
Bu dokümantasyon, public/templates/basic/views/
dizinindeki tüm template dosyalarının detaylı analizini içerir. Her dosyanın ne işe yaradığı, özel özellikleri ve kullanım örnekleri ile birlikte açıklanmıştır.
Ana Layout ve Temel Template'ler
layouts/theme.twig.php
Ana Layout Template'i - Tüm sayfa içeriklerini saran master template
Özellikler:
- HTML5 dokument yapısı ve responsive meta etiketler
- SEO optimizasyonu ve Open Graph entegrasyonu
- Webpack bundle entegrasyonu
- JavaScript konfigürasyon enjeksiyonu
- CSS özel özellikler için tema desteği
- Sidebar sepet offcanvas entegrasyonu
<main>
{{ render_header() }}
{{ content_for_layout | raw }} {# ÖNEMLİ: Backend'den gelen sayfa içeriği buraya yerleşir #}
{% set footer_url = theme_config('footer_url') %}
{% if footer_url %}
{{ render_page(footer_url) }}
{% endif %}
</main>
content_for_layout
Özel Açıklama:
{{ content_for_layout | raw }}
değişkeni, template sisteminin en kritik parçalarından biridir. Bu değişken:
- Backend'den gelen dinamik içeriği layout template'ine yerleştirir
- Her sayfa (index.twig.php, product.twig.php, login.twig.php vb.) kendi içeriğini üretir ve bu içerik
content_for_layout
değişkenine atanır raw
filtresi HTML içeriğin escape edilmeden, olduğu gibi render edilmesini sağlar- Layout template'i (theme.twig.php) bir çerçeve görevi görür, asıl içerik bu placeholder'a yerleştirilir
- Örneğin:
/product/123
URL'si çağrıldığında, backendproduct.twig.php
template'ini işler ve sonucucontent_for_layout
olarak layout'a gönderir
Çalışma Akışı:
- Backend controller bir sayfa template'ini render eder (örn: product.twig.php)
- Render edilen içerik
content_for_layout
değişkenine atanır - Layout template'i (theme.twig.php) yüklenir
{{ content_for_layout | raw }}
yerinde sayfa içeriği görüntülenir- Böylece her sayfa aynı header, footer ve genel yapıyı kullanır
open_graph.twig.php
Sosyal Medya Meta Etiketleri - Dinamik Open Graph etiketleri
Özellikler:
- Ürün spesifik Open Graph etiketleri
- Stok durumu entegrasyonu
- Marka ve kategori metadata'sı
- Genel website metadata'sına fallback
{% if request.page_type == 'product' and product is defined %}
<meta property="og:type" content="product">
<meta property="product:availability" content="{{ stock_status }}">
<meta property="product:brand" content="{{ product.brand }}">
{% endif %}
index.twig.php
Ana Sayfa Template'i - Modüler widget sistemi ile homepage
Özellikler:
- Webpack bundle yükleme
- Özel widget placeholder'ları
- Modüler widget include'ları (slider'lar, kategoriler, ürünler)
{{ webpack_bundle('index') }}
{{ ___('page__signin_box') }}
{% include 'widgets/brands_slider.twig.php' %}
{% include 'widgets/manset_slider.twig.php' %}
{% include 'widgets/category_grid.twig.php' %}
{% include 'widgets/last_products.twig.php' %}
ÖNEMLİ NOT - CMS Önceliği:
Eğer CMS'de "index" adında bir sayfa oluşturulmuşsa:
- CMS'deki "index" sayfası içeriği önceliklidir
index.twig.php
template'i devre dışı kalır- CMS içeriği doğrudan
content_for_layout
değişkeni aracılığıylatheme.twig.php
layout'una yerleştirilir - Widget'lar ve özel içerikler CMS editöründen yönetilir
- Bu sayede kod değişikliği yapmadan ana sayfa içeriği güncellenebilir
Template Öncelik Sırası:
- CMS'de tanımlı "index" sayfası varsa → CMS içeriği kullanılır
- CMS'de "index" sayfası yoksa →
index.twig.php
template'i kullanılır
Header Varyantları
header.twig.php
Standart Header - İki bölümlü layout ile temel header
Özellikler:
- Çok dil desteği ve bayrak gösterimi
- Kullanıcı kimlik doğrulama durumları (giriş yapmış/yapmamış)
- Dropdown menüler ile kategori navigasyonu
- Arama işlevselliği
- Alışveriş sepeti entegrasyonu
- Sticky header seçeneği
<div class="header-sec-one">
<!-- Logo, dil seçimi, kullanıcı işlemleri -->
<div class="language">
{% for locale_data in get_locales() %}
<a href="{{ locale_data.url }}">
<img src="{{ ('flags/' ~ locale_data.code ~ '.png') | image }}">
</a>
{% endfor %}
</div>
</div>
<div class="header-sec-two">
<!-- Navigasyon ve arama -->
<nav class="navbar">
{% for category in categories %}
<a href="{{ category.url }}">{{ category.name }}</a>
{% endfor %}
</nav>
</div>
header_ella.twig.php
Alternatif Header - Tam genişlik navigasyon ile
Özellikler:
- Dil seçim dropdown'u
- Yatay kategori navigasyonu
- Kullanıcı hesap dropdown'u
- Typewriter efekti ile arama
<div class="language">
<div class="dropdown">
<button class="dropdown-toggle">
<img src="{{ ('flags/' ~ locale ~ '.png') | image }}">
</button>
</div>
</div>
<nav class="row">
<!-- Logo, navigasyon, kullanıcı butonları -->
</nav>
header_fox.twig.php
Gelişmiş Header - Mega menü ve promosyon banner'ı ile
Özellikler:
- Üst promosyon carousel'ı
- Resim desteği ile mega menü
- Katlanabilir arama işlevselliği
- Hesap sidebar'ı
<div class="mega">
<div class="listBox">
<!-- Kategori listeleri -->
{% for category in categories %}
<div class="category-group">
<h5>{{ category.name }}</h5>
{% for subcategory in category.subcategories %}
<a href="{{ subcategory.url }}">{{ subcategory.name }}</a>
{% endfor %}
</div>
{% endfor %}
</div>
<div class="visualBox">
<!-- Kategori resimleri -->
<img src="{{ category.featured_image }}" alt="{{ category.name }}">
</div>
</div>
header_helen.twig.php
Üç Katmanlı Header - Dikey hiyerarşi ile
Özellikler:
- Üst promosyon banner'ı
- Orta bölümde logo ve arama
- Alt navigasyon çubuğu
<div class="top">
<!-- Promosyon carousel'ı -->
</div>
<div class="medium">
<!-- Logo ve arama -->
</div>
<div class="bottom">
<!-- Navigasyon -->
</div>
header_mobile.twig.php
Mobil Header - Offcanvas navigasyon ile optimize edilmiş
Özellikler:
- Offcanvas ile hamburger menü
- Katlanabilir arama
- Mobil dostu layout
- Akordeon kategori menüsü
<div class="offcanvas offcanvas-start" id="staticBackdrop">
<div class="accordion accordion-flush">
{% for category in categories %}
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" data-bs-target="#flush-collapse{{ loop.index }}">
{{ category.name }}
</button>
</h2>
<div id="flush-collapse{{ loop.index }}" class="accordion-collapse collapse">
{% for subcategory in category.subcategories %}
<a href="{{ subcategory.url }}">{{ subcategory.name }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
Ürün Template'leri
📚 İlgili Dokümantasyon: Ürün objesinde kullanılabilir tüm alanlar ve özellikler için Ürün Data Alanları dokümantasyonuna bakınız.
_product_card.twig.php
Ürün Kartı Bileşeni - Listelerde kullanılan yeniden kullanılabilir ürün kartı
Özellikler:
- Lazy loading resimler
- Favori işlevselliği
- Thumbnail'lar ile varyant seçimi
- Sepete ekleme formu
- Ölçü seçimi (paketleme birimleri)
- İndirim desteği ile fiyat gösterimi
<div class="product pnlurun-item product-card-body" id="divUrunKutu_{{ product.id }}">
<div class="pro card">
{# Giriş yapmış kullanıcılar için favori butonu #}
{% if config('ADD_TO_FAVORITE') and is_logged %}
<button class="fav-icon btn-add-to-favorites" data-urunid="{{ product.id }}">
<i class="bi {% if product.is_favorited %} bi-heart-fill text-danger {% else %} bi-heart {% endif %}"></i>
</button>
{% endif %}
{# Ürün resmi ve linki #}
<a href="{{ product.url }}" title="{{ product.title }}">
<img data-src="{{ product.med_image }}" class="mainImg lazyload"
src="{{ product.min_image }}" alt="{{ product.title }}" />
</a>
{# Varyantlar #}
<div class="product-variant-img-cont">
{% for variant in product.variants %}
<div {{ variant['html-data'] | html_data_attributes }}
class="variant-container {{ loop.first ? 'selectedThumb' : '' }}">
<img data-src="{{ variant['image'] }}" src="{{ variant['image_min'] }}"
class="product-color-img lazyload" alt="{{ variant['name'] }}">
<p class="product-color">{{ variant['name'] ?: ' ' }}</p>
</div>
{% endfor %}
</div>
{# Sepete ekleme formu #}
{% if is_logged and not product.sale_disabled %}
<form action="{{ 'ADD_TO_CART' | route }}" method="post" class="frm-add-to-cart">
<input type="hidden" name="urun_id" value="{{ product.id }}"/>
<input type="hidden" name="renk" class="drUrunRenk{{ product.id }}"
value="{{ product.default_variant_id }}"/>
<div class="d-flex align-items-center justify-content-between">
<div class="count-btns d-flex">
<span class="decrease-btn btn-qty-decrease">
<i class="bi bi-dash"></i>
</span>
<input class="count" type="text" name="adet" value="{{ product.package_qty ?: 1 }}">
<span class="increase-btn btn-qty-increase">
<i class="bi bi-plus"></i>
</span>
</div>
<button type="submit" class="cart basket-btn addtocartbtn">
<i class="bi bi-cart-plus"></i>
</button>
</div>
</form>
{% endif %}
</div>
</div>
product.twig.php
Ürün Detay Sayfası - Kapsamlı ürün görüntüleme template'i
Özellikler:
- Zoom işlevselliği ile ürün galerisi
- Resim değiştirme ile varyant seçimi
- Modal ile video desteği
- Miktar kontrolleri ile sepete ekleme formu
- Ürün özellikleri gösterimi
- Benzer ürünler bölümü
- Tam ekran görüntüleme için resim modal'ı
<div class="renkkategori d-flex gap-2">
{% for variant in product.variants_with_gallery %}
<div class="productVariantSelect" data-galeri_index="{{ iiVariant }}">
<img src="{{ variant.image_thumb }}" />
<p>{{ variant.name }}</p>
</div>
{% endfor %}
</div>
{# Ürün galerisi #}
<div class="product-gallery">
<div class="main-image">
<img id="mainProductImage" src="{{ product.main_image }}" data-zoom="{{ product.large_image }}">
</div>
<div class="thumbnail-gallery">
{% for image in product.gallery %}
<img src="{{ image.thumb }}" data-main="{{ image.large }}" class="gallery-thumb">
{% endfor %}
</div>
</div>
{# Video desteği #}
{% if product.video_url %}
<div class="product-video">
<button type="button" data-bs-toggle="modal" data-bs-target="#videoModal">
<i class="bi bi-play-circle"></i> {{ 'video_izle' | t }}
</button>
</div>
{% endif %}
product_list.twig.php
Kategori/Arama Sonuç Listesi - Filtrelenebilir ürün listesi
Özellikler:
- Responsive filtre paneli (masaüstü/mobil)
- Sıralama seçenekleri dropdown'u
- Infinite scroll sayfalama
- Ürün kartları ile grid layout
- Mobil offcanvas filtreler
{# Filtreler ve sıralama #}
<div class="row">
<div class="col-md-3">
{% include 'filters.twig.php' %}
</div>
<div class="col-md-9">
<div class="sorting-options">
<select id="sort-products">
<option value="name">{{ 'isme_gore_sirala' | t }}</option>
<option value="price_asc">{{ 'fiyat_artan' | t }}</option>
<option value="price_desc">{{ 'fiyat_azalan' | t }}</option>
</select>
</div>
{# Ürün listesi #}
<div class="row row-cols-2 row-cols-md-4 urunlistesi">
{% for product in products.getData %}
{% include '_product_card.twig.php' with {'product': product} %}
{% endfor %}
</div>
{# Infinite scroll için loading #}
<div id="loading" class="text-center" style="display: none;">
<div class="spinner-border"></div>
</div>
</div>
</div>
Müşteri Yönetimi Template'leri
customers/login.twig.php
Kullanıcı Giriş Formu - Kimlik doğrulama template'i
Özellikler:
- Email/müşteri kodu ile giriş desteği
- Otomatik tamamlama ile şifre alanı
- Responsive form layout'u
- Kayıt olma ve şifre kurtarma linkleri
<form id="frmLogin" action="{{ 'LOGIN' | route }}" method="post">
<div class="form-group">
<label for="email">{{ 'email_veya_musteri_kodu' | t }}</label>
<input type="email" name="email" id="email" autocomplete="username" required
placeholder="{{ 'email_giriniz' | t }}">
</div>
<div class="form-group">
<label for="password">{{ 'sifre' | t }}</label>
<input type="password" name="sifre" id="password" autocomplete="current-password" required
placeholder="{{ 'sifre_giriniz' | t }}">
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">{{ 'giris_yap' | t }}</button>
<a href="{{ 'register' | url }}">{{ 'kayit_ol' | t }}</a>
<a href="{{ 'forgot_password' | url }}">{{ 'sifremi_unuttum' | t }}</a>
</div>
</form>
customers/register.twig.php
Kullanıcı Kayıt Formu - Kapsamlı kayıt template'i
Özellikler:
- Firma/kişisel bilgi formu
- AJAX ile ülke/şehir seçimi
- Konfigürasyona dayalı koşullu alanlar
- Özel alan entegrasyonu
- reCAPTCHA desteği
- Şartlar ve koşullar onay kutusu
<form id="frmRegister" action="{{ 'REGISTER' | route }}" method="post">
<div class="row">
<div class="col-md-6">
<label for="firma">{{ 'firma_adi' | t }}</label>
<input type="text" name="firma" id="firma" required>
</div>
<div class="col-md-6">
<label for="mail">{{ 'email' | t }}</label>
<input type="email" name="mail" id="mail" required>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label for="ulke">{{ 'ulke' | t }}</label>
<select name="ulke" id="ulke" class="ulkeSecim" required>
<option value="">{{ 'ulke_seciniz' | t }}</option>
{% for ulke in ulkeler %}
<option value="{{ ulke.Id }}">{{ ulke.UlkeAdi }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-6">
<label for="sehir">{{ 'sehir' | t }}</label>
<select name="sehir" id="sehir" class="sehirSecim" required>
<option value="">{{ 'once_ulke_seciniz' | t }}</option>
</select>
</div>
</div>
{# Özel alanlar #}
{% include 'customers/register_customs.twig.php' %}
{# reCAPTCHA #}
{% if config('RECAPTCHA_SITE_KEY') %}
<div class="g-recaptcha" data-sitekey="{{ config('RECAPTCHA_SITE_KEY') }}"></div>
{% endif %}
<div class="form-check">
<input type="checkbox" name="terms" id="terms" required>
<label for="terms">{{ 'sartlari_kabul_ediyorum' | t }}</label>
</div>
<button type="submit" class="btn btn-primary">{{ 'kayit_ol' | t }}</button>
</form>
customers/register_customs.twig.php
Dinamik Özel Alanlar - Kayıt formu için özelleştirilebilir alanlar
Özellikler:
- Çoklu alan tipleri (input, textarea, select, checkbox, file, datepicker)
- Konfigürasyondan dinamik alan üretimi
- Koşullu zorunlu alanlar
{% for key_name, field_data in custom_fields %}
<div class="form-group">
<label for="custom_field_{{ key_name }}">{{ field_data.label }}</label>
{% if field_data.type == 'input' %}
<input type="text" name="custom_field_{{ key_name }}" id="custom_field_{{ key_name }}"
{{ field_data.required ? 'required' : '' }}
placeholder="{{ field_data.placeholder }}">
{% elseif field_data.type == 'textarea' %}
<textarea name="custom_field_{{ key_name }}" id="custom_field_{{ key_name }}"
{{ field_data.required ? 'required' : '' }}
placeholder="{{ field_data.placeholder }}"></textarea>
{% elseif field_data.type == 'select' %}
<select name="custom_field_{{ key_name }}" id="custom_field_{{ key_name }}"
{{ field_data.required ? 'required' : '' }}>
<option value="">{{ 'seciniz' | t }}</option>
{% for option in field_data.options %}
<option value="{{ option }}">{{ option }}</option>
{% endfor %}
</select>
{% elseif field_data.type == 'checkbox' %}
<div class="form-check">
<input type="checkbox" name="custom_field_{{ key_name }}" value="1"
id="custom_field_{{ key_name }}" {{ field_data.required ? 'required' : '' }}>
<label for="custom_field_{{ key_name }}">{{ field_data.label }}</label>
</div>
{% elseif field_data.type == 'file' %}
<input type="file" name="custom_field_{{ key_name }}" id="custom_field_{{ key_name }}"
{{ field_data.required ? 'required' : '' }}
accept="{{ field_data.accept }}">
{% elseif field_data.type == 'datepicker' %}
<input type="date" name="custom_field_{{ key_name }}" id="custom_field_{{ key_name }}"
{{ field_data.required ? 'required' : '' }}>
{% endif %}
</div>
{% endfor %}
Sipariş Yönetimi Template'leri
orders/index.twig.php
Sipariş Geçmişi - Kullanıcının sipariş listesi
Özellikler:
- Tablo formatında sipariş gösterimi
- Sipariş durumu ve tutarlar
- Kargo bilgileri
- Sayfalama desteği
- Sipariş detaylarına linkler
<div class="orders-table-container">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>{{ 'tarih' | t }}</th>
<th>{{ 'siparis_no' | t }}</th>
<th>{{ 'tutar' | t }}</th>
<th>{{ 'durum' | t }}</th>
<th>{{ 'kargo' | t }}</th>
<th>{{ 'islemler' | t }}</th>
</tr>
</thead>
<tbody>
{% for order in orders.data %}
<tr>
<td>{{ order.short_date }}</td>
<td>{{ order.order_number }}</td>
<td>{{ order.amount_text }}</td>
<td>
<span class="badge badge-{{ order.status_class }}">
{{ order.status_text }}
</span>
</td>
<td>{{ order.shipping_info }}</td>
<td>
<a href="{{ order.detail_url }}" class="btn btn-sm btn-outline-primary">
{{ 'detay' | t }}
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{# Sayfalama #}
{% if orders.pagination %}
{{ orders.pagination | raw }}
{% endif %}
</div>