JekCMS tema sistemini tasarlarken WordPress, Ghost, Kirby, Statamic, October CMS ve Bolt'un kullandığı altı farklı mimari yaklaşımı değerlendirdik. Karar kıldığımız yapı — şablonlar, parçalı bileşenler ve kanca kaydıyla birlikte gelen functions.php — basitliği değil öngörülebilirliği esas alarak seçildi.
WordPress temaları sunum ve iş mantığını aynı dosyada bir araya getiriyor; bu durum yeni başlayanlar için erişilebilir olsa da büyük ölçekte test edilmesini ve bakımını zorlaştırıyor.
Ghost'un Handlebars şablonları katı bir veri-sunum ayrımı dayatıyor ancak bunun bedeli ifade gücü oluyor: bir yardımcı fonksiyon olmadan Handlebars şablonunda koşullu mantık yapmak son derece güç. JekCMS orta yolu seçiyor: şablonlar tam ifade gücüne sahip PHP dosyaları ancak iş mantığı şablon içinde değil, kayıtlı hook fonksiyonlarında yaşıyor.
functions.php ve Hook Sistemi
Tema kökündeki functions.php dosyası, herhangi bir şablon oluşturma başlamadan önce istek döngüsünde erken yükleniyor. Tam hook API'sine erişimi var: add_action, add_filter, remove_action ve remove_filter. Bu fonksiyon imzaları kasıtlı olarak WordPress'in hook sistemiyle özdeş; WordPress'i zaten bilen çok sayıda geliştirici için öğrenme eğrisini azaltmak amacıyla alınan bilinçli bir tasarım kararı.
Kapsamlı Veri Geçişiyle Parçalı Bileşenler
Parçalı bileşenler templates/partials/ dizininde yaşıyor ve get_partial('ad') yardımcısıyla yükleniyor. WordPress'in get_template_part() fonksiyonundan farklı olarak, JekCMS uygulaması global değişkenler gerektirmeden doğrudan parçalı bileşenin kapsamına veri geçiren ikinci bir argüman kabul ediyor. Bu, parçalı bileşenlerin yalıtılmış olarak test edilmesini kolaylaştırıyor ve global duruma olan bağımlılığı azaltıyor.
Nesneler Yerine Diziler
Sorgu katmanı — get_posts(), get_post(), get_categories() — nesneler yerine düz PHP dizileri döndüren fonksiyonlar sunuyor. Düz diziler daha kolay serileştiriliyor, fonksiyonlar arasında geçiriliyor ve önbelleğe alınıyor. Dizi erişim sözdiziminin ($post['title']) nesne özelliği erişiminden ($post->title) biraz daha ayrıntılı olması bir ödün olmakla birlikte, kazanılan öngörülebilirlik bunu haklı kılıyor.
Hook Kayit Ornegi
Tipik bir functions.php dosyasi tema karmasikligina gore 5-15 arasinda hook kaydeder. Hooks belirli calisma noktalarinda isimle tetiklendigi icin kayit sirasi onemli degildir, ancak iliskili hook'lari gruplamak okunabilirligi artirir.
// functions.php
add_filter('the_content', 'tema_icerik_tablosu', 10);
add_filter('the_content', 'tema_tembel_gorseller', 20);
add_action('before_header', 'tema_schema_isaretleme');
add_action('after_footer', 'tema_analitik_betikleri');
function tema_icerik_tablosu($content) {
if (substr_count($content, '<h2') < 3) return $content;
return $toc . $content;
}
Oncelik parametresi (10, 20) ayni hook'a birden fazla fonksiyon baglandiginda calisma sirasini kontrol eder. Dusuk sayilar once calisir. Tembel gorsel enjeksiyonu, icerik tablosu olusturucudan sonra calistirilmalidir.
Sablon Hiyerarsisi
JekCMS sablonlari, belirlilik ile basitlik arasinda denge kuran bir geri donus zinciri ile cozumler. Motor once en spesifik sablonu arar, bulamazsa daha genel olanlara doner.
single-{slug}.php— belirli bir gonderiyle slug uzerinden eslesirsingle-{kategori}.php— belirli bir kategorideki gonderilerle eslesirsingle.php— tum tekil gonderi gorunumleri icin varsayilanindex.php— her rota icin nihai geri donus
Kategori arsivleri ayni kalibi izler: category-{slug}.php once category.php'ye, sonra archive.php'ye, sonra index.php'ye doner. Bir uretim temasi genellikle 6-8 sablon dosyasi tanimlar.
Pratikte Dizin Yapisi
Eksiksiz bir JekCMS tema dizini, karmasikliga bagli olarak 15 ile 30 arasinda dosya icerir. Zorunlu dizin yapisi her temanin ayni kurallara uymasini saglar.
themes/tema-adi/
+-- functions.php # Hook kaydi (ilk yuklenir)
+-- style.css # Tema meta verisi + ana stiller
+-- index.php # Nihai geri donus sablonu
+-- single.php # Tekil gonderi gorunumu
+-- page.php # Statik sayfa gorunumu
+-- category.php # Kategori arsivi
+-- templates/partials/
+-- header.php, footer.php, post-card.php, sidebar.php
+-- assets/
+-- css/, js/, fonts/, images/
Neden Blade veya Twig Degil?
Blade (Laravel) ve Twig (Symfony) potansiyel sablon motorlari olarak degerlendirildi. Her ikisi de onbelleklenmis PHP dosyalari ureten bir derleme adimi ekliyor; bu da paylasimli hostingde onbellek gecersizlestirme sorunlari yaratiyor. Duz PHP sablonlari kendilerini derler — kirilabilecek bir ara adim yoktur. 100 sablon render testinde duz PHP ortalama 2,1 ms, Twig ise 2,4 ms surdu. Render basina 0,3 ms fark toplam 40-80 ms'de sayfa sunan bir CMS icin anlamli degildir.
Tema Gelistiricileri Icin Pratik Ipuclari
functions.phpdosyasini 200 satirin altinda tutun — buyuk hook'lariincludes/dizininde ayri dosyalara bolerek dahil edin- Parcali bilesen adlarini gorsel rolleriyle adlandirin (
post-card.php,author-bio.php) - Karanlik mod, yan panel gibi yetenekleri bildirmek icin
theme_supports()fonksiyonunu kullanin - Parcali bilesen'lere her zaman acik veri gecirin, ust kapsamdaki degiskenlere guvenmeyin
- Tanimsiz degisken uyarilarini yakalamak icin
JEKCMS_DEBUG=trueile test edin
Varlik Hatti: CSS ve JavaScript
Tema varliklari tema dizinindeki assets/css/ ve assets/js/ klasorlerinde yasir. Gelistirme modunda dosyalar onbellekleme olmadan dogrudan sunulur. Production'da JekCMS dosyanin son degistirilme zamanindan uretilen bir versiyon karma sorgu parametresi (?v=a3f8c1) ekler.
Bu, 1 yillik sure sonu basliklariyla agresif tarayici onbelleklemesine olanak tanirken ziyaretcilerin bir dagitimdan sonra her zaman guncellenmis dosyalari almasini saglar.
Karma istek basina bir kez hesaplanir ve bellekte onbelleğe alinir; sayfa olusturmaya sifir ek yuk ekler. Tum CSS'i tek bir dosyada birlestiren derleme araci yaklasimlarinin aksine JekCMS stil sayfalarini ayri tutar; boylece kategoriye veya sablona ozel CSS yalnizca ihtiyac duyan sayfalarda yuklenir ve herhangi bir sayfadaki kullanilmayan CSS'i %40-60 azaltir.