Liquid referansı
Tema geliştiricileri için BorCube'un genel değişkenleri, filtreleri, etiketleri, şablon adları ve hazır parçaları.
Bu sayfa, kendi temanı ya da alt temanı yazarken kullanacağın Liquid değişkenlerini, filtrelerini ve şablon adlarını listeler. Temanın klasör yapısı, theme.json ve alt temalar için önce Kendi temanı geliştirmek makalesini oku.
Temel kurallar#
{{ … }}ile basılan her değer otomatik olarak HTML'e karşı korunur (kaçışlanır). Site sahibinin panelde yazdığı ve kaydederken temizlenen HTML içerikleri (sayfa, blog yazısı, popup metni gibi)| rawile basılır:{{ page.content | raw }}.- Yalnız bu sayfadaki BorCube filtreleri ve Liquid'in standart filtreleri kullanılabilir. Tanınmayan bir filtre içeren şablon geçersiz sayılır ve kaydedilmez.
- Şablonlar yalnız temanın kendi dosyalarını okuyabilir; sunucuda kod çalıştıramaz.
- Bir sayfanın çizimi 1,5 saniyeyi aşarsa yarıda kesilir. Çok büyük döngülerden kaçın.
{% render 'parca' %}ile çağrılan parçalar (snippet) şablonun değişkenlerini görmez; ihtiyaç duyduklarını parametre olarak ver:{% render 'price', price: product.price %}. Aşağıdaki genel değişkenler ise her yerde görünür.
Genel değişkenler#
Bu değişkenler her şablonda, bölümde ve parçada kullanılabilir.
| Değişken | İçerik |
|---|---|
site | Sitenin kimliği ve iletişim bilgileri (aşağıda) |
settings | Temanın özelleştirici ayarları: settings.logo, settings.color_primary… Alanlar theme.json'dan gelir |
theme | Etkin tema: theme.id, theme.name, theme.version |
locale | Sayfanın dili, ör. tr |
user | Giriş yapmış oyuncu, giriş yoksa boş (aşağıda) |
seo | Sayfa başlığı ve paylaşım bilgileri: seo.title, seo.description, seo.image, seo.url… {% render 'seo-meta' %} bunları <head>'e basar |
features | Açık olan site bölümleri (aşağıda) |
menus | Üst ve alt menü: menus.header, menus.footer (aşağıda) |
store | Mağaza: store.enabled, store.credit_name, store.coupons, store.credit_transfer |
cart | Sepet: cart.count |
announcements | Duyuru şeridi: her biri title ve url (boş olabilir) |
popup | Bu sayfada gösterilecek popup ya da boş: title, content, image, button_label, button_url, version |
legal | Sözleşmeler (aşağıda) |
site_prefs | Ziyaretçinin dil ve para birimi seçicisi: languages, currencies, language, currency, base |
discord_server | Discord sunucusunun canlı bilgisi ya da boş: name, online, members, online_text, members_text |
gaming_night | Oyun gecesi: active, ends_at, next_start |
community_goal | Topluluk hedefi ya da boş (mağaza kapalıyken boş) |
notifications | notifications.unread: okunmamış bildirim sayısı |
request | request.path (adres yolu) ve request.query (adres parametreleri) |
csrf_token | Form güvenlik anahtarı; {% render 'security-fields' %} bunu forma ekler |
csp_nonce | Satır içi <script> etiketlerinin taşıması gereken nonce değeri |
turnstile | Bot doğrulaması: turnstile.site_key (kapalıysa boş), turnstile.posts (gönderilerde de açık mı) |
minimal_layout | Bakım sayfası gibi menüsüz sayfalarda doğru |
license_banner | Lisans sorunu varsa sitede gösterilecek uyarı, yoksa boş |
site
| Alan | İçerik |
|---|---|
site.name | Site adı |
site.url | Sitenin adresi |
site.locale | Sayfanın dili |
site.server_ip | Sunucu IP'si |
site.nav | Menüde gösterilmesi seçilen sayfalar: her biri title, url |
site.year | İçinde bulunulan yıl |
site.branding | "Powered by BorCube" yazısı gösterilmeli mi |
site.bedrock_prefix | Bedrock oyuncularının ad öneki, kapalıysa boş |
site.registration_open | Yeni kayıtlar açık mı |
site.can_register | "Kayıt ol" bağlantısı gösterilmeli mi (kayıtlar açık ve kimse giriş yapmamış) |
site.socials | Doldurulmuş sosyal medya hesapları: her biri id, name, url |
site.discord_url | Discord daveti, yoksa boş |
site.footer_about | Alt bilgideki tanıtım yazısı (düz metin) |
site.footer_note | Telif satırının yanındaki yazı |
site.footer_legal | Sözleşme bağlantıları alt bilgide bir sütun olarak gösterilsin mi |
site.footer_about düz metindir; satır sonlarını korumak için {{ site.footer_about | escape | newline_to_br | raw }} kullan.
user
Giriş yoksa user boştur; {% if user %} ile denetle.
| Alan | İçerik |
|---|---|
user.username | Oyuncu adı |
user.email | E-posta adresi |
user.email_placeholder | Oyundan aktarılmış ve henüz gerçek e-postası olmayan hesaplarda doğru |
user.email_verified | E-posta doğrulanmış mı |
user.two_factor | İki adımlı doğrulama açık mı |
user.member_since | Kayıt tarihi |
user.roles | Roller: her biri name, color |
user.is_staff | Panele girebilen bir yetkili mi |
user.credits | Kredi bakiyesi (kuruş cinsinden; | credits ile bas) |
user.game_verified | Oyun hesabını doğrulamış mı |
user.game_verified_at | Doğrulama tarihi, yoksa boş |
features
Her alan doğru ya da yanlıştır. Bir bölüm panelde kapalıysa ya da lisans paketin içermiyorsa yanlış olur; temalar o bölümün bağlantılarını gizlemelidir.
features.blog, features.support, features.help, features.changelog, features.downloads, features.forms, features.wheel, features.gaming_night, features.members, features.staff, features.forum, features.suggestions, features.leaderboards, features.punishments, features.vote, features.games, features.bazaar, features.play
menus
menus.header bir bağlantı listesidir. Her bağlantıda title, url, icon (boş olabilir), new_tab, external, active (şu anki sayfa mı) ve live (süren oyun gecesi) bulunur. Üst menü öğelerinde ayrıca dropdown ve children (alt bağlantılar) vardır.
menus.footer sütunlardan oluşur: her sütunda title, icon ve links bulunur.
Menüleri site sahibi Yönetim paneli → Görünüm → Üst menü ve Alt menü sayfalarından düzenler; kapalı bölümlerin bağlantıları listeye zaten girmez (Menüler ve Ek CSS).
legal
| Alan | İçerik |
|---|---|
legal.docs | Her sözleşme rolünün sayfası ya da boş: legal.docs.rules, terms, privacy, sales, refund. Her biri key, title, url |
legal.links | Seçilmiş sözleşmelerin listesi (alt bilgi için) |
legal.privacy | Kayıt ve kredi yükleme formlarının altında bağlantısı gösterilen gizlilik metni ya da boş |
legal.forms | register, topup, checkout formlarının onay kutusu: required ve docs |
Onay kutusunu kendin yazmak yerine {% render 'legal-accept', scope: 'register', form: form %} kullan. Sözleşmeler için: Sözleşmeler.
Sayfa değişkenleri#
Genel değişkenlerin yanında her şablon kendi verisini alır. Örneğin özel sayfalar (page şablonu) şunları alır:
| Alan | İçerik |
|---|---|
page.title | Sayfa başlığı |
page.content | Sayfanın içeriği (HTML; | raw ile bas) |
page.description | SEO açıklaması |
page.updated_at | Son güncelleme tarihi |
page.draft | Yayında değilse doğru (yalnız yetkililer görür) |
Form içeren sayfalarda bir form nesnesi gelir: form.error ve form.success (mesajlar), form.values (gönderilen değerler, hatada formu yeniden doldurmak için) ve form.errors (alan adına göre hata). {% render 'form-alert', form: form %} mesajları basar.
Ana sayfa şablonunda content_for_index, site sahibinin özelleştiricide dizdiği bölümlerin çıktısıdır: {{ content_for_index | raw }}. Bölüm dosyalarında section.id, section.type ve section.settings kullanılır.
Bir şablonun aldığı bütün değişkenleri görmenin en kolay yolu, Bor temasındaki aynı adlı şablonu Görünüm → Kod düzenleyici'de açmaktır. Alt tema yazıyorsan değiştirmediğin şablonlar zaten Bor'dan gelir.
Filtreler#
BorCube'un eklediği filtreler:
| Filtre | Örnek | Sonuç |
|---|---|---|
t | {{ 'store.checkout' | t }} | Temanın dil dosyasındaki yazı. Site sahibinin Ayarlar → Diller'de yaptığı değişiklik önce gelir. Yazı bulunamazsa anahtarın kendisi basılır |
t (değişkenli) | {{ 'home.registered' | t: n: stats.users }} | Yazıdaki {n} yerine değeri koyar |
asset_url | {{ 'css/theme.css' | asset_url }} | assets/ içindeki dosyanın adresi; tema sürümüne göre önbellek anahtarı eklenir |
credits | {{ product.price | credits }} | 1250 → 12,50 Kredi (kredi adı mağaza ayarından gelir) |
credit_amount | {{ user.credits | credit_amount }} | 1250 → 12,50 (birimsiz) |
money | {{ payment.amount | money }} | 1250 → ₺12,50, sitenin para biriminde. Ziyaretçi başka bir para birimi seçtiyse yanına yaklaşık karşılığı eklenir |
money (para birimli) | {{ payment.amount | money: payment.currency }} | Kendi para birimini taşıyan bir kayıt için |
local_date | {{ post.published_at | local_date }} | 8 Ekim 2026, sitenin saat diliminde |
local_date (biçimli) | | local_date: 'datetime' | 'datetime' saatle birlikte, 'short' → 08.10.2026, 'month' → gün ve kısa ay, 'relative' → 3 gün önce |
avatar_url | {{ user.username | avatar_url: 32 }} | Oyuncunun kafa görseli (varsayılan 64 piksel, 8–512 arası) |
body_url | {{ name | body_url }} | Oyuncunun tam boy görseli (varsayılan 128 piksel) |
safe_url | {{ link | safe_url }} | Yalnız güvenli bağlantıları geçirir, javascript: gibi adresleri boşaltır |
linkify | {{ message | linkify | raw }} | Oyuncunun yazdığı metindeki web adreslerini bağlantıya çevirir; metni de kaçışlar |
Tutarlar her yerde tam sayıdır ve kuruş cinsindendir (1250 = 12,50); onları her zaman credits, credit_amount ya da money ile bas. Kafa ve gövde görselleri sitenin kendi /mc/… adresinden gelir; ziyaretçinin IP adresi başka bir siteye gitmez. Geçersiz oyuncu adlarında Steve görseli kullanılır.
Liquid'in standart filtreleri de kullanılabilir: escape, url_encode, newline_to_br, strip_html, truncate, upcase, downcase, default, size, first, last, join, split, where, sort, map, plus, minus, times, divided_by, date ve diğerleri. raw kaçışlamayı kapatır; yalnız güvendiğin içerikte kullan.
Etiketler#
Liquid'in standart etiketleri (if, unless, case, for, assign, capture, comment, raw, render…) kullanılabilir. BorCube'un eklediği etiket:
| Etiket | Ne yapar |
|---|---|
{% section 'header' %} | Sabit bir bölümü ("static": true) layout'a yerleştirir. Bölüm adı tırnak içinde yazılır |
Parçaları {% render 'ad' %} ile çağır; snippets/ad.liquid dosyası çizilir.
Şablonlar#
templates/ klasöründeki dosyalar ve kullanıldıkları sayfalar. Bağımsız bir temada layout/theme.liquid, templates/index.liquid ve templates/404.liquid zorunludur; diğer şablonlardan eksik olanı kullanan sayfa hata verir.
| Şablon | Sayfa |
|---|---|
index | Ana sayfa (/) |
page | Panelde oluşturulan sayfalar (/sayfa-adresi) |
404 | Bulunamayan sayfa |
maintenance | Bakım sayfası |
auth/login | Giriş (/giris) |
auth/register | Kayıt (/kayit) |
auth/two-factor | Girişte iki adımlı doğrulama kodu |
auth/forgot-password | Şifremi unuttum (/sifremi-unuttum) |
auth/reset-password | Yeni şifre (/sifre-sifirla) |
auth/message | Bilgi sayfaları (ör. "E-postanı doğrula", "Kayıtlar kapalı"): message.title, message.body |
profile | Profil (/profil) |
profile/security | Hesap güvenliği (/profil/guvenlik) |
profile/orders | Siparişlerim (/profil/siparisler) |
profile/order | Sipariş ayrıntısı (/profil/siparisler/<no>) |
profile/credits | Kredi geçmişi (/profil/kredi) |
profile/notifications | Bildirimler (/bildirimler) |
profile/applications | Başvurularım (/profil/basvurular) |
store/index | Mağaza (/magaza) |
store/category | Mağaza kategorisi (/magaza/<kategori>) |
store/product | Ürün (/urun/<ürün>) |
store/cart | Sepet (/sepet) |
store/topup | Kredi yükleme (/kredi-yukle) |
store/payment | Ödeme adımı (/kredi-yukle/odeme) |
store/payment-result | Ödeme sonucu (/kredi-yukle/sonuc) |
store/chest | Sandık (/sandik) |
store/gift-code | Hediye kodu (/hediye-kodu) |
store/transfer | Kredi gönderme (/kredi-gonder) |
store/wheels | Çarklar (/cark) |
store/wheel | Çark (/cark/<çark>) |
store/gaming-night | Oyun gecesi (/oyun-gecesi) |
blog/index | Blog, kategori ve etiket sayfaları (/blog, /blog/kategori/<…>, /blog/etiket/<…>) |
blog/post | Blog yazısı (/blog/<yazı>) |
changelog | Değişiklik günlüğü (/degisiklikler) |
downloads | İndirmeler (/indirmeler) |
help/index | Yardım merkezi (/yardim) |
help/topic | Yardım konusu (/yardim/<konu>) |
help/article | Yardım makalesi (/yardim/<konu>/<makale>) |
help/search | Yardım araması (/yardim/ara) |
support/index | Destek taleplerim (/destek) |
support/new | Yeni talep (/destek/yeni) |
support/ticket | Talep (/destek/<no>) |
forms/index | Başvurular (/basvurular) |
forms/form | Bir başvuru formu (/basvurular/<form>) |
community/members | Üyeler (/uyeler) |
community/member | Oyuncu profili (/oyuncu/<ad>) |
community/staff | Yetkililer (/yetkililer) |
forum/index | Forum (/forum) |
forum/category | Forum kategorisi (/forum/kategori/<…>) |
forum/thread | Konu (/forum/konu/<no>) |
forum/compose | Yeni konu, konu ve mesaj düzenleme |
forum/search | Forum araması (/forum/ara) |
suggestions/index | Öneriler ve öneri kategorileri (/oneriler) |
suggestions/show | Öneri (/oneriler/<no>) |
suggestions/compose | Yeni öneri, öneri ve yanıt düzenleme |
leaderboards | Sıralamalar (/siralamalar, /siralamalar/<…>) |
punishments | Cezalar (/cezalar ve alt sayfaları) |
vote | Oy ver (/oy-ver) |
play | Nasıl oynanır (/nasil-oynanir) |
games/index | Oyun modları (/oyun-modlari) |
games/show | Oyun modu (/oyun-modlari/<…>) |
bazaar/index | Pazar (/pazar) |
bazaar/item | Pazar eşyası (/pazar/esya/<no>) |
bazaar/storage | Pazar deposu (/pazar/depom) |
Layout'ta {{ content_for_layout | raw }} şablonun çıktısını basar.
Bor'un hazır parçaları#
Bor'u genişleten bir alt tema bu parçaları doğrudan kullanabilir. Bağımsız bir tema yazıyorsan aynı adlarla kendininkini yazabilirsin; ilk üçü güvenlik ve yasal zorunluluklar için gereklidir.
| Parça | Kullanım |
|---|---|
security-fields | Her POST formunda: {% render 'security-fields' %}. Form güvenlik anahtarını ekler. Giriş, kayıt ve şifre formlarında captcha: true ile bot doğrulamasını da gösterir |
legal-accept | Kayıt, kredi yükleme ve sepet formlarında sözleşme kutusu: {% render 'legal-accept', scope: 'register', form: form %} (scope: register, topup, checkout) |
seo-meta | <head> içinde, <title>'dan sonra: arama motoru ve paylaşım etiketleri |
post-captcha | Konu, öneri, talep ve yorum formlarında, gönder düğmesinin üstünde: gönderilerde bot doğrulaması açıksa gösterilir |
form-alert | {% render 'form-alert', form: form %}: formun hata ya da başarı mesajı |
popup | {% render 'popup', popup: popup %}: panelden ayarlanan popup |
price | {% render 'price', price: product.price, original: product.original_price, percent: product.discount_percent %}: indirimli fiyat gösterimi |
pager | {% render 'pager', page: page, page_count: page_count %}: sayfalama |
icon | {% render 'icon', name: 'store' %}: çizgi simgeler |
socials | {% render 'socials' %}: sosyal medya simgeleri |
site-prefs | {% render 'site-prefs' %}: dil ve para birimi seçicisi (yalnız seçenek varsa görünür) |
member-name | {% render 'member-name', name: item.username %}: üyeler sayfası açıksa profile bağlantılı oyuncu adı |
Örnek: kendi kartın#
<article class="kart">
<img src="{{ product.image | default: settings.logo }}" alt="">
<h3>{{ product.name }}</h3>
{% render 'price', price: product.price, original: product.original_price, percent: product.discount_percent %}
{%- if user -%}
<p>{{ 'store.balance' | t }}: {{ user.credits | credits }}</p>
{%- else -%}
<a href="/giris">{{ 'nav.login' | t }}</a>
{%- endif -%}
</article>Örnekteki store.balance ve nav.login Bor'un dil dosyasındaki anahtarlardır. Kendi yazıların için locales/tr.json dosyana yeni anahtarlar ekle; bulunamayan bir anahtar sayfada olduğu gibi görünür.
Bir yanlış ya da eksik mi gördün? Discord’dan haber ver, hemen düzeltelim.