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?"

✕
Şu kavramlar DLE'de YOKTUR İnternette sık tekrarlanan "Modern Shell", "sanal dosya sistemi" veya "güvenli kum havuzu" gibi ifadeler DLE 21.0 kaynak kodunda hiç geçmez. DLE'nin gerçek mekanizmasının adı yamalı kopya (patched copy) yöntemidir ve tek sınıfı 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:

site/index.php # giriş noktası — yamalanamaz └─ engine/init.php # ilk yamalanabilir dosya ├─ engine/classes/plugins.class.php # DLEPlugins sınıfı yüklenir ├─ engine/classes/mysql.php # veritabanı (korumalı) ├─ engine/data/config.php # ayarlar (korumalı) └─ engine/modules/main.php # Check() ile yüklenirse yamalı sürüm çalışır

Yani kodunuzun çalışması için iki şart birlikte sağlanmalıdır:

  1. Hedef dosya DLEPlugins::Check() üzerinden yükleniyor olmalı,
  2. 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:

engine/cache/system/plugins/ ├── <md5(SECURE_AUTH_KEY + dosya_adı)>.php # yamalı kopya (her dosya için bir tane) └── <md5(SECURE_AUTH_KEY + 'plugins_infos')>.json # hangi dosya hangi kopyaya gidiyor

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.

✓
İzin sorunu yaşıyorsanız 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:

DosyaNeden yamanamaz?
index.phpYama sistemini başlatan dosyadır; yama motoru daha yokken çalışır.
admin.phpAynı sebep — giriş noktasıdır.
cron.phpYönetim panelinden bağımsız çalışır; Check() kullanmaz.
✕
Tehlikeli yanılsama Bu dosyalara yama yazarsanız DLE yamayı diske başarıyla yazar, hata da vermez. Ama kod hiçbir zaman çalışmaz, çünkü o dosya yamalı kopya üzerinden yüklenmez. "Kurulum başarılı" mesajı sizi yanıltmasın.

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ütunAnlamı
_plugins.activeEklentinin tamamı aktif mi?
_plugins_files.activeBu yama kaydı kullanılabilir mi?
_plugins_files.filedisableAdı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).
!
Şablon değiştirdiyseniz önbelleği düşünün Eklentiyi elle dosya kopyalayarak kurduysanız ya da şablon dosyalarını sonradan düzenlediyseniz, panelden eklentiyi bir kez kaydetmek önbelleği yeniler. Ayrıca DLE'nin genel önbelleğini (sistem önbelleği) temizlemek de gerekebilir.

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:

  1. Eklentiler posi DESC, id ASC ile sıralanır (panelden öncelik atanabilir).
  2. needplugin işaretli eklentiler ikinci gruba alınır — yani başka bir eklentiye bağımlı olanlar daha sonra yamalanır.
  3. Tek eklenti içindeki yama kayıtları id ASC ile uygulanır.
★
Kendi eklentinizi başkasının çapasına bağlamayın Başka bir eklentinin eklediği satırı çapa yaparsanız, o eklenti kapandığında sizinki de sessizce devre dışı kalır. Her zaman DLE çekirdeğine ait, değişmeyen bir satırı çapa seçin.

Özet

SoruKı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ı.