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.