2. Eklenti Mimarisi
DLE eklentileri bağımsız çalışan programlar değildir. Bir eklenti, DLE'nin kendi dosyalarının içine yerleştirilmiş kod parçalarıdır. Bu yüzden bir eklentiyi anlamak için önce şu soruyu cevaplamak gerekir: "Benim kodum, DLE'nin dosyasının içine nasıl giriyor?"
DLEPlugins'tir.
Neden "yama"?
DLE çok geniş bir ürün yelpazesini (haber sitesi, blog, video portalı) tek çekirdekle çalıştırır. Bu yüzden eklenti mimarisi iki ilkeyi gözetir:
- Çekirdeğe dokunma: Orijinal DLE dosyaları asla değiştirilmez. Güncelleme yaptığınızda eklentileriniz kaybolmaz.
- Yalnızca gereken yeri değiştir: Eklenti, hedef dosyayı kopyalar, üzerine yamasını uygular ve o kopyayı çalıştırır.
Sonuç olarak ortaya iki dosya çıkar: el değmemiş orijinal ve eklentili kopya.
DLE çalışırken hangisini çalıştıracağına DLEPlugins::Check() karar verir.
Çalışma zamanı akışı
Bir sayfa açıldığında sırasıyla şunlar olur:
Yani kodunuzun çalışması için iki şart birlikte sağlanmalıdır:
- Hedef dosya
DLEPlugins::Check()üzerinden yükleniyor olmalı, - Eklentinizin yaması başarıyla uygulanmış (çapası tutmuş) olmalı.
Check() tam olarak ne yapar?
engine/classes/plugins.class.php içindeki Check() metodunun gövdesi
şu işi yapar:
public static function Check($source) {
// 1) Eklenti listesi (önbellekten veya diskten) hazırlanır
if (!is_array(self::$plugins)) {
self::$root = ROOT_DIR . '/';
self::pluginsstartup();
}
// 2) Gelen yol, site köküne göreli hale getirilir (örn: engine/modules/main.php)
$check_file = str_ireplace(self::$root, '', (string)$source);
// 3) Bu dosyanın yaması var mı?
if (isset(self::$plugins[$check_file])) {
if (file_exists(ENGINE_DIR . '/cache/system/plugins/' . self::$plugins[$check_file])) {
return ENGINE_DIR . '/cache/system/plugins/' . self::$plugins[$check_file];
}
}
return $source; // yama yok -> orijinal dosya
}
Check() eklentinin AKTİF olup olmadığını kontrol ETMEZ
Metot, tek bir şey yapar: yamalı kopyanın yolunu döndürerek
include edilen dosyayı değiştirir. Aktif/pasif ayrımı yama hazırlanırken
(yani önbellek oluşturulurken) uygulanır. Bu yüzden pasif bir eklentiyi kapattıktan sonra
önbelleğin yenilenmesi gerekir.
Yamalı kopya nerede durur?
Yama diske gerçek bir dosya olarak yazılır. Yolu şu kalıptadır:
Dosya adı, SECURE_AUTH_KEY tuzu ile birlikte md5() alınarak üretilir;
bu sayede dışarıdan tahmin edilemez ve tarayıcıdan doğrudan çağrılamaz. Klasörün
yazılabilir olması zorunludur — değilse DLE eklentileri hiç yüklemez ve
panele bir hata kaydı düşer.
engine/cache/system/ ve engine/cache/system/plugins/ klasörlerine
777 (veya sunucunuzun izin verdiği en yakın değeri) verin. DLE bu klasörü
kendisi oluşturmayı dener, ama başaramazsa sessizce değil — _plugins_logs
tablosuna hata yazar.
Hangi dosyalar yamanabilir?
| Uzantı | Yama uygulanır mı? | Nasıl gönderilir? |
|---|---|---|
.php |
Evet <file><operation> ile |
Yama olarak veya düz dosya olarak |
.lng |
Evet <file><operation> ile |
Yama olarak veya düz dosya olarak |
.tpl / .css / .js / görseller |
Hayır | Yalnızca ZIP içinde normal dosya olarak |
DLE, yama listesini oluştururken hedef yolu clearfilepath($yol, array("php","lng"))
ile süzer. Yani bir .tpl dosyasını <operation> ile değiştirmeye
çalışırsanız hata almazsınız — o işlem sessizce yok sayılır. Şablon
değişikliklerinizi her zaman ZIP içinde dosya olarak gönderin.
Yamanamayan giriş noktaları
Bu, en sık yapılan hatadır. Şu üç dosya Check() ile yüklenmez:
| Dosya | Neden yamanamaz? |
|---|---|
index.php | Yama sistemini başlatan dosyadır; yama motoru daha yokken çalışır. |
admin.php | Aynı sebep — giriş noktasıdır. |
cron.php | Yönetim panelinden bağımsız çalışır; Check() kullanmaz. |
Kodunuzu siteye mümkün olduğunca erken sokmak istiyorsanız en erken
yamalanabilir nokta engine/init.php'dir. Bu dosya, neredeyse tüm DLE
isteklerinde çalışır.
Korumalı dosyalar
Güvenlik nedeniyle birkaç dosya yamalamaya kapalıdır. Bunlar
DLEPlugins::$protected_files listesinde tanımlıdır:
public static $protected_files = array(
"engine/classes/mysql.php", // veritabanı katmanı
"engine/classes/plugins.class.php", // yama motorunun kendisi
"engine/data/config.php", // ana ayarlar
"engine/data/dbconfig.php", // veritabanı bilgileri
"engine/data/socialconfig.php", // sosyal giriş ayarları
"engine/data/videoconfig.php", // video ayarları
);
Özellikle plugins.class.php'nin korunması kritiktir: motor kendi kendini
yamalayabilseydi, hatalı bir eklenti tüm eklenti sistemini çökertebilirdi.
Eklenti aktif / pasif durumu
Her eklenti ve her dosya yaması ayrı ayrı açılıp kapatılabilir. Veritabanında bu durum ters isimli bir sütunda tutulur:
| Sütun | Anlamı |
|---|---|
_plugins.active | Eklentinin tamamı aktif mi? |
_plugins_files.active | Bu yama kaydı kullanılabilir mi? |
_plugins_files.filedisable | Adının tersi 1 = yama uygulanır, 0 = atlanır. Varsayılan 1'dir. |
Manifestinizde <enabled> etiketini hiç vermezseniz yama etkin sayılır;
filedisable sütununun varsayılanı 1 olduğu için "kapalı" demek
istediğinizde açıkça <enabled>0</enabled> yazmanız gerekir.
Kod içinde belirli bir eklentinin aktif olup olmadığını sorgulamak için
CheckIFActive() kullanılır — Check() değil:
// "diger-eklenti" aktifse çalışır, değilse sessizce atlanır
if (DLEPlugins::CheckIFActive('diger-eklenti')) {
// birbirine bağlı eklentiler için ideal
}
Önbellek ne zaman yenilenir?
Tüm yamalar önceden hesaplanıp plugins_infos JSON dosyasına yazılır. Önbellek
şu durumlarda yenilenir:
- Eklenti kurulduğunda,
- Eklenti güncellendiğinde,
- Eklenti pasife alındığında / etkinleştirildiğinde,
- Yama kayıtları düzenlendiğinde,
- Önbellek dosyası silinmişse (ilk istekte yeniden üretilir).
Birden fazla eklenti: uygulama sırası
Aynı dosyaya birden fazla eklenti yama uygulayabilir. Sıra önemlidir, çünkü bir eklentinin yaması diğerinin çapasını bozabilir. DLE sıralamayı şöyle belirler:
- Eklentiler
posi DESC, id ASCile sıralanır (panelden öncelik atanabilir). needpluginişaretli eklentiler ikinci gruba alınır — yani başka bir eklentiye bağımlı olanlar daha sonra yamalanır.- Tek eklenti içindeki yama kayıtları
id ASCile uygulanır.
Özet
| Soru | Kısa cevap |
|---|---|
| Orijinal dosya değişir mi? | Hayır. Kopya üzerinde çalışılır. |
| Yama nerede saklanır? | engine/cache/system/plugins/<md5>.php |
| Kim karar verir? | DLEPlugins::Check() |
| Hangi uzantılar yamanabilir? | Yalnızca .php ve .lng |
| Giriş noktaları yamanabilir mi? | Hayır (index.php, admin.php, cron.php) |
| En erken nokta? | engine/init.php |
Şimdi manifest dosyasının tüm etiketlerine geçebiliriz: dleplugin.xml Referansı.