Giriş
DataLife Engine (DLE), kullanıcılarına sadece güçlü bir içerik yönetim sistemi sunmakla kalmaz, aynı zamanda geliştiriciler için güvenli, organize ve modern bir altyapı sağlar. Yönetim panelinin hızlı ve kullanıcı dostu olmasının arkasında, dikkatle tasarlanmış bir JavaScript mimarisi yatar. Bu makalede, bu mimarinin iki temel taşını inceleyeceğiz:
- Merkezi AJAX Yöneticisi (
engine/ajax/controller.php): Tüm asenkron sunucu isteklerinin nasıl tek bir noktadan, güvenli bir şekilde yönetildiği. DLEPushBildirim Sistemi: Kullanıcıya anlık ve etkileşimli geri bildirimler sunan modern bildirim altyapısı.
Bu iki sistem, DLE'nin yönetim panelini nasıl daha güvenli, sürdürülebilir ve interaktif hale getirdiğini anlamak için kritik öneme sahiptir.
Bölüm 1: Merkezi AJAX Yöneticisi - engine/ajax/controller.php Mimarisi
DLE'de, addnews.php gibi sayfalarda yapılan JavaScript çağrılarının genellikle engine/ajax/controller.php?mod=... gibi bir adrese yapıldığını fark etmişsinizdir. Bu, "Front Controller" (Ön Denetleyici) adı verilen bir yazılım tasarım deseninin bilinçli bir uygulamasıdır.
Nedir Bu Yapı?
Front Controller deseni, gelen tüm istekleri tek bir "giriş kapısı" üzerinden karşılamayı ve ardından isteği ilgili işlemciye yönlendirmeyi hedefler. DLE'nin AJAX altyapısı için bu giriş kapısı controller.php dosyasıdır.
URL'yi inceleyelim: engine/ajax/controller.php?mod=find_relates
controller.php: Tüm AJAX isteklerinin ulaştığı merkezi dosyadır.mod=find_relates: Bu dosyanın hangi görevi yerine getireceğini belirten bir komuttur.mod(modül) parametresi, çalıştırılacak spesifik işlevin adını (bu örnektefind_relates) taşır.
Neden Her İşlem İçin Ayrı Bir Dosya Yerine Tek Bir Merkezi Nokta Kullanılıyor?
Bu mimarinin sağladığı avantajlar, modern web geliştirmenin temelini oluşturur:
- Üst Düzey Güvenlik: Bu, en kritik avantajdır. Tüm istekler
controller.phpüzerinden geçtiği için, her modül çalıştırılmadan önce aşağıdaki gibi merkezi güvenlik denetimleri uygulanabilir:- Kimlik Doğrulama: Kullanıcının sisteme giriş yapıp yapmadığı kontrol edilir.
- Yetkilendirme: Kullanıcının bu işlemi yapmaya yetkisi olup olmadığı denetlenir.
- Güvenlik Anahtarı (Hash) Doğrulaması: CSRF (Siteler Arası İstek Sahtekarlığı) saldırılarını önlemek için
user_hashgibi güvenlik belirteçlerinin geçerliliği doğrulanır.
Eğer her işlem için
find_relates.php,delete_image.phpgibi ayrı dosyalar olsaydı, bu hayati güvenlik kontrollerinin her bir dosyaya tek tek eklenmesi gerekirdi. Bu, hem kod tekrarına yol açar hem de bir dosyada unutulması durumunda ciddi güvenlik açıkları oluştururdu. - Kod Organizasyonu ve Yönetilebilirlik:
- Tüm AJAX mantığı tek bir çatı altında toplanır. Yeni bir AJAX işlevi eklemek,
controller.phpdosyasına yeni bircaseeklemek kadar kolaydır. - Veritabanı bağlantısı, yapılandırma dosyalarını yükleme gibi temel işlemler bir kez yapılır ve tüm modüller bu hazır altyapıyı kullanır. Bu, "Kendini Tekrar Etme" (Don't Repeat Yourself - DRY) prensibine tam uyum sağlar.
- Tüm AJAX mantığı tek bir çatı altında toplanır. Yeni bir AJAX işlevi eklemek,
- Standartlaşma ve Tutarlılık: Tüm AJAX çağrılarının aynı formatta olması, kod tabanında bir standart oluşturur. Bu, hem DLE çekirdek geliştiricileri hem de üçüncü parti eklenti geliştiricileri için öngörülebilir ve anlaşılır bir yapı sunar.
Pratik Bir Örnek: mod=find_relates İşleyişi
- İstemci (Tarayıcı): Kullanıcı "Benzer Haberleri Bul" butonuna tıklar. JavaScript, haber başlığını da içeren bir AJAX isteğini
...controller.php?mod=find_relatesadresine gönderir. - Sunucu (
controller.php): İstek bu merkezi dosyaya ulaşır. - Güvenlik Kontrolü: Dosya, ilk olarak gelen isteğin geçerli bir kullanıcıdan ve oturumdan geldiğini doğrular.
- Yönlendirme:
modparametresininfind_relatesolduğunu görür ve ilgili PHP kod bloğunu veya dosyasını çalıştırır. - İşlem:
find_relatesmantığı çalışır, veritabanında benzer başlıklara sahip haberleri arar ve sonuçları bir HTML listesi olarak formatlar. - Yanıt: Oluşturulan HTML, AJAX yanıtı olarak istemciye geri gönderilir.
- Arayüz Güncellemesi: JavaScript, gelen bu HTML'i alır ve sayfanın ilgili bölümüne (
#related_newsdiv'i içine) yerleştirir. Tüm bu işlemler sayfa yenilenmeden gerçekleşir.
Bölüm 2: Kullanıcı Dostu Bildirimler - DLEPush Sistemi
Kullanıcıya geri bildirim vermek, modern bir arayüzün vazgeçilmezidir. Geleneksel JavaScript alert() fonksiyonu, tarayıcıyı kilitlemesi ve özelleştirilemez yapısı nedeniyle artık tercih edilmemektedir. DLE, bu ihtiyacı karşılamak için DLEPush adında kendi bildirim sistemini geliştirmiştir.
Neden Standart alert() Yerine DLEPush?
Aşağıdaki tablo, iki sistem arasındaki temel farkları net bir şekilde ortaya koymaktadır:
| Özellik | Standart alert() |
DLE DLEPush Sistemi |
|---|---|---|
| Kullanıcı Deneyimi | Kötü. Tarayıcıyı tamamen kilitler. Kullanıcı "Tamam" demeden başka işlem yapamaz. | İyi. Bildirimler ekranın köşesinde belirir, arayüzü engellemez ve genellikle kendiliğinden kaybolur. |
| Görünüm | Standart ve Çirkin. CSS ile stil verilemez ve her tarayıcıda farklı görünebilir. | Modern ve Özelleştirilebilir. Sistemin temasıyla uyumludur ve CSS ile tamamen şekillendirilebilir. |
| İşlevsellik | Sadece metin gösterebilir. | Farklı bildirim türleri (error, success, warning), başlık, ikon ve özel zaman aşımı gibi gelişmiş özellikler sunar. |
DLEPush Kullanım Şekilleri ve Parametreler
DLEPush, kullanımı son derece basit ve esnek bir yapıya sahiptir. Temel sözdizimi şöyledir:
DLEPush.type('Mesaj Metni', 'Başlık', zaman_asimi_ms);
type: Bildirimin türünü belirtir. Dört ana türü vardır:DLEPush.error: Hata bildirimleri için (genellikle kırmızı).DLEPush.success: Başarılı işlem bildirimleri için (genellikle yeşil).DLEPush.warning: Uyarı bildirimleri için (genellikle sarı/turuncu).DLEPush.info: Bilgilendirme amaçlı bildirimler için (genellikle mavi).
'Mesaj Metni': Bildirimde gösterilecek ana metindir. Genellikle DLE'nin dil dosyalarından ($lang[...]) gelir.'Başlık'(İsteğe Bağlı): Bildirim kutucuğu için bir başlık belirler.zaman_asimi_ms(İsteğe Bağlı): Bildirimin ekranda kaç milisaniye kalacağını belirler. Belirtilmezse varsayılan bir süre kullanılır.
Koddan Pratik Örnekler
// Başlık alanının boş olması durumunda bir hata mesajı gösterir.
if (document.entryform.title.value == '') {
DLEPush.error('{$lang['add_err_7']}'); // $lang['add_err_7'] = "Başlık boş bırakılamaz."
return false;
}
// Bir haberin başka bir kullanıcı tarafından düzenlendiğine dair bir uyarı gösterir.
// Bu uyarı 20 saniye (20000 ms) ekranda kalır.
DLEPush.warning('{$lang['edit_news_alert']}', '', 20000);