İçeriğe geç

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) | raw ile 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
siteSitenin kimliği ve iletişim bilgileri (aşağıda)
settingsTemanın özelleştirici ayarları: settings.logo, settings.color_primary… Alanlar theme.json'dan gelir
themeEtkin tema: theme.id, theme.name, theme.version
localeSayfanın dili, ör. tr
userGiriş yapmış oyuncu, giriş yoksa boş (aşağıda)
seoSayfa başlığı ve paylaşım bilgileri: seo.title, seo.description, seo.image, seo.url… {% render 'seo-meta' %} bunları <head>'e basar
featuresAçık olan site bölümleri (aşağıda)
menusÜst ve alt menü: menus.header, menus.footer (aşağıda)
storeMağaza: store.enabled, store.credit_name, store.coupons, store.credit_transfer
cartSepet: cart.count
announcementsDuyuru şeridi: her biri title ve url (boş olabilir)
popupBu sayfada gösterilecek popup ya da boş: title, content, image, button_label, button_url, version
legalSözleşmeler (aşağıda)
site_prefsZiyaretçinin dil ve para birimi seçicisi: languages, currencies, language, currency, base
discord_serverDiscord sunucusunun canlı bilgisi ya da boş: name, online, members, online_text, members_text
gaming_nightOyun gecesi: active, ends_at, next_start
community_goalTopluluk hedefi ya da boş (mağaza kapalıyken boş)
notificationsnotifications.unread: okunmamış bildirim sayısı
requestrequest.path (adres yolu) ve request.query (adres parametreleri)
csrf_tokenForm güvenlik anahtarı; {% render 'security-fields' %} bunu forma ekler
csp_nonceSatır içi <script> etiketlerinin taşıması gereken nonce değeri
turnstileBot doğrulaması: turnstile.site_key (kapalıysa boş), turnstile.posts (gönderilerde de açık mı)
minimal_layoutBakım sayfası gibi menüsüz sayfalarda doğru
license_bannerLisans sorunu varsa sitede gösterilecek uyarı, yoksa boş

site

Alanİçerik
site.nameSite adı
site.urlSitenin adresi
site.localeSayfanın dili
site.server_ipSunucu IP'si
site.navMenü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_prefixBedrock oyuncularının ad öneki, kapalıysa boş
site.registration_openYeni 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.socialsDoldurulmuş sosyal medya hesapları: her biri id, name, url
site.discord_urlDiscord daveti, yoksa boş
site.footer_aboutAlt bilgideki tanıtım yazısı (düz metin)
site.footer_noteTelif satırının yanındaki yazı
site.footer_legalSö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.usernameOyuncu adı
user.emailE-posta adresi
user.email_placeholderOyundan aktarılmış ve henüz gerçek e-postası olmayan hesaplarda doğru
user.email_verifiedE-posta doğrulanmış mı
user.two_factorİki adımlı doğrulama açık mı
user.member_sinceKayıt tarihi
user.rolesRoller: her biri name, color
user.is_staffPanele girebilen bir yetkili mi
user.creditsKredi bakiyesi (kuruş cinsinden; | credits ile bas)
user.game_verifiedOyun hesabını doğrulamış mı
user.game_verified_atDoğ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.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).

Alanİçerik
legal.docsHer sözleşme rolünün sayfası ya da boş: legal.docs.rules, terms, privacy, sales, refund. Her biri key, title, url
legal.linksSeçilmiş sözleşmelerin listesi (alt bilgi için)
legal.privacyKayıt ve kredi yükleme formlarının altında bağlantısı gösterilen gizlilik metni ya da boş
legal.formsregister, 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.titleSayfa başlığı
page.contentSayfanın içeriği (HTML; | raw ile bas)
page.descriptionSEO açıklaması
page.updated_atSon güncelleme tarihi
page.draftYayı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ÖrnekSonuç
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:

EtiketNe 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.

ŞablonSayfa
indexAna sayfa (/)
pagePanelde oluşturulan sayfalar (/sayfa-adresi)
404Bulunamayan sayfa
maintenanceBakım sayfası
auth/loginGiriş (/giris)
auth/registerKayıt (/kayit)
auth/two-factorGirişte iki adımlı doğrulama kodu
auth/forgot-passwordŞifremi unuttum (/sifremi-unuttum)
auth/reset-passwordYeni şifre (/sifre-sifirla)
auth/messageBilgi sayfaları (ör. "E-postanı doğrula", "Kayıtlar kapalı"): message.title, message.body
profileProfil (/profil)
profile/securityHesap güvenliği (/profil/guvenlik)
profile/ordersSiparişlerim (/profil/siparisler)
profile/orderSipariş ayrıntısı (/profil/siparisler/<no>)
profile/creditsKredi geçmişi (/profil/kredi)
profile/notificationsBildirimler (/bildirimler)
profile/applicationsBaşvurularım (/profil/basvurular)
store/indexMağaza (/magaza)
store/categoryMağaza kategorisi (/magaza/<kategori>)
store/productÜrün (/urun/<ürün>)
store/cartSepet (/sepet)
store/topupKredi yükleme (/kredi-yukle)
store/paymentÖdeme adımı (/kredi-yukle/odeme)
store/payment-resultÖdeme sonucu (/kredi-yukle/sonuc)
store/chestSandık (/sandik)
store/gift-codeHediye kodu (/hediye-kodu)
store/transferKredi gönderme (/kredi-gonder)
store/wheelsÇarklar (/cark)
store/wheelÇark (/cark/<çark>)
store/gaming-nightOyun gecesi (/oyun-gecesi)
blog/indexBlog, kategori ve etiket sayfaları (/blog, /blog/kategori/<…>, /blog/etiket/<…>)
blog/postBlog yazısı (/blog/<yazı>)
changelogDeğişiklik günlüğü (/degisiklikler)
downloadsİndirmeler (/indirmeler)
help/indexYardım merkezi (/yardim)
help/topicYardım konusu (/yardim/<konu>)
help/articleYardım makalesi (/yardim/<konu>/<makale>)
help/searchYardım araması (/yardim/ara)
support/indexDestek taleplerim (/destek)
support/newYeni talep (/destek/yeni)
support/ticketTalep (/destek/<no>)
forms/indexBaşvurular (/basvurular)
forms/formBir başvuru formu (/basvurular/<form>)
community/membersÜyeler (/uyeler)
community/memberOyuncu profili (/oyuncu/<ad>)
community/staffYetkililer (/yetkililer)
forum/indexForum (/forum)
forum/categoryForum kategorisi (/forum/kategori/<…>)
forum/threadKonu (/forum/konu/<no>)
forum/composeYeni konu, konu ve mesaj düzenleme
forum/searchForum araması (/forum/ara)
suggestions/indexÖneriler ve öneri kategorileri (/oneriler)
suggestions/showÖneri (/oneriler/<no>)
suggestions/composeYeni öneri, öneri ve yanıt düzenleme
leaderboardsSıralamalar (/siralamalar, /siralamalar/<…>)
punishmentsCezalar (/cezalar ve alt sayfaları)
voteOy ver (/oy-ver)
playNasıl oynanır (/nasil-oynanir)
games/indexOyun modları (/oyun-modlari)
games/showOyun modu (/oyun-modlari/<…>)
bazaar/indexPazar (/pazar)
bazaar/itemPazar eşyası (/pazar/esya/<no>)
bazaar/storagePazar 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çaKullanım
security-fieldsHer 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-acceptKayı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-captchaKonu, ö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#

Liquid
<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.