MegaforBB Tema geliştirme kılavuzu
Bu kılavuz, MegaforBB forum yazılımında Twig tabanlı tema sistemini kullanarak nasıl tema geliştirebileceğinizi adım adım ve tüm teknik detaylarıyla anlatır. Çekirdek dosyalara dokunmadan yalnızca tema klasörü ve şablonlarla çalışırsınız.
İçindekiler
1. Tema Sistemine Giriş
MegaforBB'de ön yüz ve admin paneli ayrı tema sistemleriyle çalışır:
- Ön yüz temaları: Forumun ziyaretçilere görünen kısmı.
templates/frontend/altında her klasör bir temadır. - Admin temaları: Yönetim panelinin görünümü.
templates/admin/altında tanımlanır.
Tema motoru Twig şablon dilini kullanır. Aktif tema, yönetim panelinden İçerik → Tema Yönetimi bölümünden seçilir. Sistem önce aktif temanın şablonlarına bakar; bulamadığı dosyaları default temadan alır. Bu sayede tüm sayfaları yeniden yazmadan sadece değiştirmek istediğiniz şablonları override edebilirsiniz.
2. Tema Klasör Yapısı
Ön yüz teması için standart yapı aşağıdaki gibidir. Klasör adı (slug) tema listesinde ve ayarlarda kullanılır; yalnızca harf, rakam, tire ve alt çizgi kullanın (örn. benim-temam).
templates/frontend/benim-temam/
├── theme.json # Zorunlu — tema bilgisi (yoksa listede görünmez)
├── screenshot.png # İsteğe bağlı — tema önizleme resmi (veya screenshot.jpg)
├── views/ # Zorunlu — Twig şablonları (.html.twig)
│ ├── base.html.twig # Ana iskelet (header, footer, content alanı)
│ ├── index.html.twig # Forum ana sayfa içeriği
│ ├── showthread.html.twig
│ └── ...
└── assets/ # İsteğe bağlı — CSS, JS, resimler
├── css/
│ ├── theme.css
│ └── ...
├── js/
│ └── theme.js
└── images/- views/ — Tüm sayfa şablonları burada yer alır. Sadece değiştirmek istediğiniz dosyaları kopyalayıp düzenlemeniz yeterlidir; diğer sayfalar otomatik olarak default temadan kullanılır.
- assets/ — Tema özelinde CSS, JavaScript ve resimler. Bu klasör yoksa veya bir dosya yoksa sistem default temanın aynı yoldaki dosyasına düşer. Böylece tüm asset'leri kopyalamak zorunda kalmazsınız.
3. theme.json ve Tema Tanımı
Her tema klasöründe theme.json dosyası bulunmalıdır; yoksa tema yönetim sayfasında listelenmez ve etkinleştirilemez.
Örnek theme.json:
{
"name": "Benim Tema Adım",
"version": "1.0.0",
"author": "Adınız",
"description": "Kısa tema açıklaması; liste görünümünde kullanılır."
}| Alan | Zorunlu | Açıklama |
|---|---|---|
| name | Evet | Tema listesinde görünen ad. |
| version | Hayır | Sürüm bilgisi (örn. 1.0.0). |
| author | Hayır | Tema yazarı. |
| description | Hayır | Bir satırlık açıklama. |
Dosya UTF-8 ve geçerli JSON olmalıdır.
4. Şablon (Twig) Çalışma Mantığı
- Sistem önce aktif temanın
views/klasörüne bakar. - İstenen şablon orada yoksa default temanın
views/klasörüne bakılır. - Aynı isimli şablon hem sizin temanızda hem default'ta varsa sizin temanızdaki kullanılır.
Bu sayede:
- Sadece base.html.twig ve index.html.twig ekleyerek bile yeni bir tema oluşturabilirsiniz; diğer tüm sayfalar default'tan gelir.
- İstediğiniz sayfayı tek tek kopyalayıp özelleştirebilirsiniz.
Şablon dosya isimleri, çekirdeğin kullandığı view isimleriyle aynı olmalıdır (örn. showthread.html.twig, profile.html.twig). Sayfa şablonları listesi Bölüm 6'da verilmiştir.
5. Asset (CSS, JS, Resim) Kullanımı
Tema içinde CSS, JavaScript veya resim dosyalarınıza Twig'den şu fonksiyonla link verirsiniz:
{{ theme_asset_url('css/theme.css') }}
{{ theme_asset_url('js/theme.js') }}
{{ theme_asset_url('images/logo.png') }}- URL her zaman
/theme-assets/...formatındadır. - Önce aktif temanın
assets/klasörüne bakılır. - Dosya orada yoksa default temanın
assets/klasöründeki aynı yol kullanılır.
Böylece kendi temanızda yalnızca değiştirdiğiniz CSS/JS dosyalarını tutabilir; diğerleri (örn. tailwind.css, theme.js) default'tan gelir.
Örnek (base.html.twig içinde):
6. Sayfa Şablonları Listesi
Aşağıdaki view isimleri, çekirdeğin kullandığı sayfa şablonlarına karşılık gelir. Şablon dosya adı {view}.html.twig veya alt dizinde alt/view.html.twig şeklindedir. Hepsini override etmek zorunda değilsiniz; sadece değiştirmek istediklerinizi temanıza ekleyin.
Genel ve giriş sayfaları:404, index, portal, login, register, register_pending, reactivate-account, forgot_password, maintenance, security-check
Forum ve konular:forum_display, topics/create, showthread, topic/private_topic, topic/single_post, topics/edit, topics/move, topics/merge, posts/edit, edit_history
Üyeler ve profil:members/index, profile, member/subscriptions, member/topics, member/posts, member/likes, member/reputation, profile/edit, profile/password, profile/account, profile/preferences
Makaleler:article/index, article/show, article/create
Mesajlar ve bildirimler:conversations/index, conversations/show, conversations/new, notifications/index
Diğer:search, moderation/reports, moderation/approvals, documentation/index, documentation/show, online/index, timeline/index, page, contact/index
7. Layout'a Gelen Değişkenler
Tüm layout sayfalarında (base şablonu kullanan sayfalarda) aşağıdaki değişkenler çekirdek tarafından sağlanır. İçerik şablonuna özel ek değişkenler (ör. konu sayfasında topic, posts) ilgili controller'dan gelir.
Genel
| Değişken | Açıklama |
|---|---|
pageTitle | Sayfa başlığı. |
locale | Aktif dil kodu (örn. tr, en). |
user | Giriş yapmış kullanıcı nesnesi veya null. |
isStaff | Kullanıcı admin veya moderatör mü (true/false). |
Bildirim ve mesaj
| Değişken | Açıklama |
|---|---|
unreadNotifications | Okunmamış bildirim sayısı. |
unreadMessages | Okunmamış özel mesaj sayısı. |
messagesEnabled, notificationsEnabled, notificationToastEnabled | İlgili özelliğin açık olup olmadığı. |
staffPendingReports, staffPendingApprovals | Yetkili kullanıcı için bekleyen rapor/onay sayıları. |
Site ve SEO
| Değişken | Açıklama |
|---|---|
site_name | Site adı. |
seo_description, seo_keywords | Meta açıklama ve anahtar kelimeler. |
canonical_url | Sayfanın canonical URL'i. |
og_title, og_description, og_image, og_type | Open Graph alanları. |
schema_json | JSON-LD için ham veri (varsa). |
forum_logo_url, forum_favicon_url | Logo ve favicon URL'leri. |
Menüler
| Değişken | Açıklama |
|---|---|
top_menu_items | Üst menü ağacı: label, href, children (alt menü). |
footer_menu_items | Footer menü öğeleri. |
footer_quick_links_items | Footer hızlı linkler (icon, label, url, href). |
Özellik bayrakları
| Değişken | Açıklama |
|---|---|
members_list_enabled | Üye listesi açık mı. |
documentation_enabled | Dokümantasyon modülü açık mı. |
portal_enabled | Portal/ana sayfa tipi. |
İstatistik ve içerik
| Değişken | Açıklama |
|---|---|
stats | Genel istatistik nesnesi. |
onlineStats | Çevrimiçi istatistik. |
online | Çevrimiçi üye listesi. |
ads | Reklam alanları (pozisyona göre). |
announcements | Aktif duyurular. |
Hero alanı
| Değişken | Açıklama |
|---|---|
hero_visible | Hero bölümü gösterilsin mi. |
hero_title, hero_description | Hero başlık ve açıklama. |
hero_f1_icon, hero_f1_title, hero_f1_desc (f2, f3, f4 için de aynı) | Hero özellik kutuları. |
Sidebar ve hook'lar
| Değişken | Açıklama |
|---|---|
withSidebar | Sayfada sidebar kullanılsın mı. |
topTags | Sidebar için popüler etiketler (withSidebar true ise). |
sidebar_blocks | Eklenti/hook ile eklenen sidebar HTML'i. |
header_extra | Eklenti/hook ile head sonuna eklenen HTML. |
footer_extra | Eklenti/hook ile body sonuna eklenen HTML. |
modal_forums | "Yeni konu" modal'ı için forum listesi. |
Tema ve script ayarları
| Değişken | Açıklama |
|---|---|
theme_primary_color | Tema ana rengi (ayarlardan). |
custom_css, custom_js | Sistem ayarlarından gelen ek CSS/JS. |
jquery_enabled, ajax_enabled | jQuery ve AJAX kullanımı açık mı. |
Şablonlarda bu değişkenlere doğrudan erişirsiniz (örn. {{ pageTitle }}, {{ user.username }}). Tanımsız olabilecekler için |default(...) kullanabilirsiniz: {{ forum_logo_url|default('') }}.
8. Twig Fonksiyonları
Tema şablonları içinde aşağıdaki fonksiyonlar kullanılabilir.
URL'ler
| Fonksiyon | Kullanım | Açıklama |
|---|---|---|
core_url(path) | core_url('forum') | Site içi URL üretir. |
base_url(path) | base_url('theme-assets/css/theme.css') | Base path ile URL. |
full_site_url(...) | — | Tam site URL'i (parametreli). |
theme_asset_url(path) | theme_asset_url('css/theme.css') | Tema asset URL'i (aktif tema, yoksa default). |
asset_url(path) | asset_url(user.avatar_path) | Yüklenen dosya (avatar, kapak vb.) URL'i. |
Konu, mesaj, üye URL'leri
| Fonksiyon | Açıklama |
|---|---|
topic_url_path(topic) | Konu için URL path. |
topic_url_path_by_id(id) | Konu id ile URL path. |
topic_url(topic) | Konu tam URL'i. |
post_url_path(...), post_url_path_by_id(...) | Mesaj URL path. |
conversation_url_path(...), conversation_url_path_by_id(...) | Özel mesaj konuşması. |
notification_url_path(...) | Bildirim. |
member_url_path(user) | Üye profil URL path. |
article_url_path_by_id(id) | Makale URL path. |
attachment_url_path(...) | Ek dosya URL path. |
Çeviri ve metin
| Fonksiyon | Kullanım | Açıklama |
|---|---|---|
core__(key) | core__('common.home') | Çekirdek dil anahtarı. |
admin__(key) | admin__('footer.copyright') | Admin panel çevirisi. |
lang(key, params) | lang('topic.title') | Uygulama dil dosyasından çeviri. |
core_e(s) | core_e(pageTitle) | Metni HTML için escape eder. |
avatar_display_name(username) | — | Avatar/gösterim için isim. |
Güvenlik ve form
| Fonksiyon | Kullanım | Açıklama |
|---|---|---|
core_csrf_token(name) | core_csrf_token('login') | CSRF token değeri. |
core_csrf_field(name) | core_csrf_field('login') | input type="hidden" alanı. |
core_redirect_url_safe(...) | — | Güvenli yönlendirme URL'i. |
İçerik işleme
| Fonksiyon | Açıklama |
|---|---|
core_sanitize_html(s) | HTML güvenli hale getirir. |
core_quote_bb_to_html(s) | BB kodunu HTML'e çevirir. |
core_process_mentions(s) | Mention'ları işler. |
core_process_post_refs(s, topicId) | Mesaj referanslarını işler. |
Diğer
| Fonksiyon | Açıklama |
|---|---|
core_config(key, default) | Config değeri okur. |
env(key, default) | Ortam değişkeni. |
hook(name, payload) | Şablonlardan event tetikler (eklenti dinleyebilir). |
flash(key) | Flash mesaj (örn. başarı/hata). |
attachment_icon(mimeType, originalName) | Ek dosya ikon sınıfı (Font Awesome). |
attachment_format_size(bytes) | Dosya boyutunu "1.5 MB" gibi metne çevirir. |
Örnek kullanımlar:
{{ core_e(pageTitle) }} - {{ core_e(site_name) }}
{{ core__('common.forum') }}
{{ core_csrf_field('login') }} ... 9. Twig Filtreleri
| Filtre | Kullanım | Açıklama |
|---|---|---|
time_ago | {{ post.created_at|time_ago }} | "Az önce", "5 dakika önce" vb. |
schema_ld_json | {{ schema_json|schema_ld_json }} | JSON-LD için güvenli çıktı. |
clamp | {{ value|clamp(0, 100) }} | Sayıyı min–max aralığına sınırlar. |
url_encode | {{ name|url_encode }} | URL için encode. |
json_decode_array | {{ jsonString|json_decode_array }} | JSON string'i diziye çevirir. |
filter_visible_columns | — | Sütun görünürlük filtreleri (tablolarda). |
smileys | {{ text|smileys }} | Smiley metnini işler. |
rtrim | {{ s|rtrim('/') }} | Sağdan karakter siler. |
Twig'in standart filtreleri (default, length, upper, lower, join, slice, date vb.) de kullanılabilir.
10. Base Şablon ve Bloklar
Tüm sayfa şablonları (index, showthread, profile vb.) base.html.twig'i extend eder ve content blokunu doldurur. Tema geliştirirken base'i override ederek tüm sayfalarda ortak header, footer ve yapıyı kontrol edersiniz.
Override edebileceğiniz bloklar:
| Blok | Yer | Açıklama |
|---|---|---|
head_extra | içi | Ek CSS, meta etiketleri, script. |
body_class | Body'ye verilecek ek CSS sınıfları. | |
content | Ana alan | İçerik şablonları burayı doldurur. |
Değişkenler (hook çıktıları):
header_extra: Head bölümünün sonuna eklenecek HTML (örn. eklenti script'leri).footer_extra: Sayfa sonuna, öncesi eklenecek HTML.
Bunlar base şablonunda zaten kullanılıyorsa, kendi base override'ınızda aynı yerlere yazmak yeterlidir:
{% if header_extra is defined and header_extra is not empty %}{{ header_extra|raw }}{% endif %}
...
{% if footer_extra is defined and footer_extra is not empty %}{{ footer_extra|raw }}{% endif %}Örnek içerik şablonu (index.html.twig):
{% extends 'base.html.twig' %}
{% block content %}
{{ core_e(site_name) }}
...
{% endblock %}11. Yeni Tema Oluşturma Adımları
- Klasör oluşturun —
templates/frontend/benim-temam/(slug'ı kendi adınızla değiştirin). - theme.json ekleyin — En az
namealanı olacak şekilde tema adı, sürüm, yazar, açıklama yazın. - views/ klasörü oluşturun — İçine en azından override etmek istediğiniz şablonları koyun. Yeni başlıyorsanız
base.html.twigveindex.html.twigile başlamak yeterlidir; diğer sayfalar default'tan gelir. - base.html.twig — Default temadaki base.html.twig'i kopyalayıp kendi tasarımınıza göre düzenleyin.
{% block content %},header_extra,footer_extrave menü/istatistik değişkenlerini kullanın. - Asset'ler (isteğe bağlı) — Sadece değiştirdiğiniz CSS/JS dosyalarını
assets/css/,assets/js/altına koyun. Diğerleri default'tan yüklenecektir. Şablonlardatheme_asset_url('css/theme.css')gibi kullanın. - Önizleme (isteğe bağlı) —
screenshot.pngveyascreenshot.jpgekleyerek tema listesinde önizleme gösterebilirsiniz. - Temayı etkinleştirin — Yönetim paneli → İçerik → Tema Yönetimi → Ön yüz temalarından Aktifleştir ile seçin.
Tema listesinde görünmesi için theme.json'ın geçerli ve tema klasörünün templates/frontend/ altında olması yeterlidir.
12. Admin Paneli Teması
Admin temaları templates/admin/{slug}/ altında, aynı mantıkla (views + theme.json) tanımlanır. Şablon arama sırası yine önce aktif admin teması, sonra default'tır.
- Admin paneli görünümü büyük ölçüde Tabler tabanlıdır; özel admin temasında sadece şablonları override edebilirsiniz.
- Admin tarafı için ayrı bir theme asset route'u (örn. /admin-theme-assets/...) yoktur. Özel admin CSS/JS eklemek için Sistem Ayarları içindeki Özel CSS ve Özel JS alanlarını kullanabilirsiniz; bu alanlar tüm admin sayfalarına enjekte edilir.
13. Sık Sorulan Sorular
S: Tüm şablonları kopyalamak zorunda mıyım?
Hayır. Sadece değiştirmek istediğiniz şablonları kendi tema klasörünüze kopyalayıp düzenlemeniz yeterli. Diğer sayfalar default temadan kullanılır.
S: CSS/JS dosyalarımın hepsini tema klasörüne koymalı mıyım?
Hayır. Sadece eklediğiniz veya değiştirdiğiniz dosyaları assets/ altına koyun. theme_asset_url() önce sizin temanıza, bulamazsa default temaya bakar.
S: Tema listesinde görünmüyor.theme.json dosyasının tema klasörünün içinde, geçerli JSON ve en az "name" alanıyla olduğundan emin olun.
S: Bir sayfa boş veya hatalı görünüyor.
O sayfa için kullandığınız şablon dosya adının çekirdeğin beklediği view adıyla aynı olduğunu kontrol edin (Bölüm 6'daki listeye bakın). Eksik veya yanlış değişken kullanımı için şablonu inceleyin; tanımsız değişkenlerde |default(...) kullanın.
S: Çevirileri nasıl kullanırım?core__('anahtar') çekirdek dil dosyalarından, lang('anahtar') uygulama dil dosyalarından çeviri döndürür. Parametreli kullanım için lang('anahtar', { 'param': deger }) kullanılabilir.
S: Eklenti view'larına nasıl referans verilir?
Eklenti şablonları @EklentiAdi/view.html.twig şeklinde namespace ile yüklenir. Tema içinden {% include '@EklentiAdi/partial.html.twig' %} gibi kullanabilirsiniz (eklenti buna izin veriyorsa).
Bu kılavuz MegaforBB tema sisteminin güncel sürümüne göre hazırlanmıştır. Güncellemeler için resmi dokümantasyonu ve forum duyurularını takip edebilirsiniz.
