3. dleplugin.xml Referansı

dleplugin.xml (ya da ZIP kökündeki herhangi bir *.xml dosyası), eklentinizin kimlik kartı ve kurulum talimatıdır. Dosya adı serbesttir — önemli olan ZIP'in kökünde bulunması ve içeriğinin doğru şemada olmasıdır.

i
Kurulum yolu önemlidir ZIP'in kökünde herhangi bir *.xml bulunmalıdır. Diğer dosyalar site köküne göreli yerleşir (engine/…, templates/…). upload/ gibi bir sarmalayıcı klasör kullanılmaz.

İskelet

Eksiksiz ama boş bir manifest şöyle görünür:

<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
    <name>Eklentimin Adı</name>
    <description>Kısa açıklama</description>
    <icon>engine/data/emoticons/plugin.png</icon>
    <version>1.0</version>
    <dleversion>21.0</dleversion>
    <versioncompare>greater</versioncompare>

    <!-- Veritabanı blokları -->
    <mysqlinstall><![CDATA[ ]]></mysqlinstall>
    <mysqlupgrade><![CDATA[ ]]></mysqlupgrade>
    <mysqlenable><![CDATA[ ]]></mysqlenable>
    <mysqldisable><![CDATA[ ]]></mysqldisable>
    <mysqldelete><![CDATA[ ]]></mysqldelete>

    <!-- PHP blokları (içine <?php YAZILMAZ) -->
    <phpinstall><![CDATA[ ]]></phpinstall>
    <phpupgrade><![CDATA[ ]]></phpupgrade>
    <phpenable><![CDATA[ ]]></phpenable>
    <phpdisable><![CDATA[ ]]></phpdisable>
    <phpdelete><![CDATA[ ]]></phpdelete>

    <!-- Dosya yamaları -->
    <file name="engine/modules/main.php">
        <operation action="after">
            <searchcode><![CDATA[aranacak_satır]]></searchcode>
            <replacecode><![CDATA[eklenecek_kod]]></replacecode>
            <searchcount>1</searchcount>
            <enabled>1</enabled>
        </operation>
    </file>
</dleplugin>

Üst düzey etiketler

EtiketZorunluAçıklama
<name>EvetEklentinin adı. Benzersiz olmalıdır — aynı adla ikinci eklenti kurulamaz.
<description>HayırPanelde listelenen kısa açıklama.
<icon>HayırPanelde görünen simge yolu. Yalnızca görsel uzantıları kabul edilir (png, jpg, svg, gif, webp, avif, bmp).
<version>HayırSizin eklenti sürümünüz. Sadece gösterim amaçlıdır.
<dleversion>HayırHedef DLE sürümü (örn. 21.0).
<versioncompare>Hayırdleversion ile birlikte çalışır. Aşağıya bakın.
<upgradeurl>HayırGüncelleme adresi. Panelde "güncelleme var" kontrolü için kullanılır.
<needplugin>HayırBağımlı olduğu eklentilerin adları, virgülle ayrılmış.
<filedelete>Hayır1 ise eklenti silinirken kurulumda ZIP ile gelen dosyalar da silinir.
<notice>HayırPanelde eklenti satırında gösterilen bilgi metni (BB kod destekler).
<mnotice>Hayır1 ise notice metni listede görünür. İkisi birlikte gerekir.
<file>HayırDosya yaması. Birden fazla <file> olabilir.

Sürüm kapısı: dleversion + versioncompare

versioncompare yalnızca şu değerleri kabul eder; başka bir değer yazarsanız boş sayılır ve kapı devre dışı kalır:

Yazdığınız değerDLE'nin anladığıAnlamı
greater>=DLE sürümü dleversion'a eşit veya daha yeni olmalı.
less<=DLE sürümü dleversion'a eşit veya daha eski olmalı.
>=>=Doğrudan operatör olarak kullanılır.
<=<=Doğrudan operatör olarak kullanılır.
====Tam eşitlik ister.
!
Kapı tutmazsa eklenti SİLİNMEZ, pasif kurulur Sürüm uyuşmazlığında DLE eklentiyi yine de kurar ama active = 0 yapar. Yani eklenti listede görünür, "pasif" durur. Bu, hata mesajı beklemeyin demektir — sessizce pasif kalır.

needplugin — eklentiler arası bağımlılık

Başka bir eklentiye ihtiyaç duyuyorsanız adını yazın. Birden fazlası virgülle ayrılır:

<needplugin>diger-eklenti,bir-baskasi</needplugin>

Kurulum anında bu eklentilerden herhangi biri yoksa, sizinki active = 0 olarak kurulur. Ayrıca needplugin işaretli eklentiler, yamalar uygulanırken ikinci sıraya alınır — yani bağımlı olduğunuz eklenti önce yamalanır.

filedelete ve dosya silme

<filedelete>1</filedelete> demek, "eklenti silinince yüklediğim dosyaları da sil" demektir. Ancak bu koşulludur:

  • Silinecek dosya listesi, yalnızca ZIP ile kurulumda otomatik doldurulur. Manifesti kopyala-yapıştır yöntemiyle kurduysanız liste boştur ve hiçbir şey silinmez.
  • DLE, silme sırasında çekirdek dosyalarını korur; listede olsa bile bu dosyalar silinmez.
✓
Dosya silmeyi PHP ile garantiye alın ZIP ile kurulmayan senaryolarda dosyaları silmek için <phpdelete> bloğunu kullanın. Orada @unlink() ile açıkça belirtin.

Veritabanı blokları

Beş blok vardır ve her biri farklı bir anda çalışır:

BlokNe zaman çalışır?
<mysqlinstall>Eklenti ilk kez kurulduğunda.
<mysqlupgrade>Aynı eklenti tekrar yüklendiğinde (güncelleme).
<mysqlenable>Eklenti pasiften aktife alındığında ve kurulumda aktifse.
<mysqldisable>Eklenti pasife alındığında.
<mysqldelete>Eklenti silindiğinde.
✕
Simetrik değiller — bunu ezberleyin
  • Güncelleme, mysqlinstall'ı çalıştırmaz. Tabloyu güncellemede de oluşturmak istiyorsanız ya IF NOT EXISTS kullanın ya da aynı SQL'i mysqlupgrade içine de yazın.
  • Silme, mysqldisable'ı çalıştırmaz. Tabloyu mysqldelete içinde ayrıca düşürmelisiniz.

Kullanılabilir yer tutucular

Bu bloklar str_ireplace ile işlenir; yani yer tutucular büyük/küçük harf duyarsızdır. Kullanabileceğiniz dört yer tutucu:

Yer tutucuYerine geçen
{prefix}DLE tablo ön eki (örn. dle_)
{userprefix}Kullanıcı tablo ön eki
{charset}Veritabanı karakter kümesi — temiz DLE 21.0 kurulumunda utf8mb4
{engine}Tablo motoru — InnoDB

Örnek bir kurulum bloğu:

<mysqlinstall><![CDATA[
CREATE TABLE IF NOT EXISTS `{prefix}_benim_tablom` (
  `id`     INT(11)      NOT NULL AUTO_INCREMENT,
  `baslik` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE={engine} DEFAULT CHARSET={charset};

DELETE FROM `{prefix}_admin_sections` WHERE `name` = 'benim-eklentim';
INSERT INTO `{prefix}_admin_sections`
  (`name`, `title`, `descr`, `icon`, `allow_groups`)
VALUES ('benim-eklentim', 'Benim Eklentim', 'Ayarlar', 'reaction.png', '1');
]]></mysqlinstall>
i
Birden fazla SQL cümlesi yazabilirsiniz Blok olduğu gibi veritabanına gönderilir; aralarına noktalı virgül koymanız yeterlidir. DELETE + INSERT ikilisi, aynı bloğun iki kez çalıştırılması durumunda kayıt çoğalmasını engeller.

PHP blokları

Beş PHP bloğu, SQL bloklarıyla birebir aynı zamanlarda çalışır (phpinstall, phpupgrade, phpenable, phpdisable, phpdelete).

✕
İçine <?php YAZMAYIN Bu bloklar eval() ile çalıştırılır — yani dosyanın içindeymiş gibi yorumlanır. Başına <?php eklerseniz sözdizimi hatası alırsınız. Doğrudan kodun kendisini yazın.
<phpinstall><![CDATA[
// Örnek: şablon etiketini otomatik ekle
$dosya = ROOT_DIR . '/templates/' . $config['skin'] . '/main.tpl';
if (is_file($dosya)) {
    $ic = file_get_contents($dosya);
    if (strpos($ic, '{benim_kutum}') === false) {
        file_put_contents($dosya, str_replace('{content}', "{content}\n{benim_kutum}", $ic));
    }
}
]]></phpinstall>
!
Silme sırasında sıralamaya dikkat phpdelete bloğu, DLE önbellekleri temizlendikten sonra çalışır. Bu yüzden içinde DLE'nin önbellek fonksiyonlarını çağırmanız gerekmez.

Dosya yamaları: file ve operation

Yapı iki katmanlıdır: bir <file> altında birden fazla <operation> bulunabilir.

<file name="engine/modules/main.php">
    <operation action="before">
        <searchcode><![CDATA[ilk çapa]]></searchcode>
        <replacecode><![CDATA[bu üstüne eklenecek]]></replacecode>
        <searchcount>1</searchcount>
        <enabled>1</enabled>
    </operation>
    <operation action="after">
        <searchcode><![CDATA[ikinci çapa]]></searchcode>
        <replacecode><![CDATA[bu altına eklenecek]]></replacecode>
        <enabled>1</enabled>
    </operation>
</file>
!
Dosya yolu bir ÖZNİTELİKTİR <file name="engine/modules/main.php"> — yol name özniteliğinde verilir. Alt etiket olarak <name> yazmak işe yaramaz.

operation alt etiketleri

EtiketGerekli mi?Açıklama
action (öznitelik)Evetreplace, before, after, replaceall, create
<searchcode>action'a bağlıAranacak çapa (referans satır).
<replacecode>action'a bağlıEklenecek/yazılacak kod.
<searchcount>HayırEklemenin kaç kez yapılacağı. Boşsa ve çapa birden fazla geçiyorsa her geçişte eklenir.
<replacecount>Hayırİlk kaç eşleşmenin atlanacağı. Nadiren gerekir.
<dleversion>HayırBu yama için ayrı sürüm kapısı.
<versioncompare>HayırÜst düzey etiketle aynı kurallar.
<enabled>Hayır0 verilmezse yama etkindir.

action türleri — tam davranış

actionsearchcodeSonuç
replace Zorunlu Bulunan çapa silinir, yerine replacecode yazılır.
before Zorunlu Çapa korunur; replacecode çapanın üstüne eklenir.
after Zorunlu Çapa korunur; replacecode çapanın altına eklenir.
replaceall Yok sayılır Dosyanın tüm içeriği replacecode ile değiştirilir.
create Yok sayılır replaceall ile aynı kod yoludur — içerik tamamen değişir.
✕
create bir dosyayı SİLER create ve replaceall, "dosya yoksa oluştur" demek değildir; dosyanın içeriğini tamamen ezer. Var olan bir dosyaya create uygularsanız, o dosyanın geri kalanı yok olur. Yeni dosya üretmek için kullanın; mevcut dosyayı düzenlemek için asla.

Çapa birden fazla geçiyorsa

searchcount vermezseniz DLE, çapayı bulduğu her yerde yamayı uygular. Örneğin echo gibi kısa bir çapayı seçip searchcount'u boş bırakırsanız kodunuz dosyaya onlarca kez eklenir. Bu yüzden:

  • Çapayı mümkün olduğunca uzun ve benzersiz seçin,
  • Yine de <searchcount>1</searchcount> yazın.

Doğrulama kuralları — sessizce atlananlar

DLE manifesti okurken bazı işlemleri hata vermeden atlar. Bu, hata ayıklamayı zorlaştıran en büyük tuzaktır. Bilmeniz gerekenler:

DurumNe olur?
action izinli listede değilİşlem tamamen atlanır.
replace / before / after ve searchcode boşİşlem atlanır.
before / after / replaceall / create ve replacecode boşİşlem atlanır.
Dosya yolu .php veya .lng ile bitmiyorDosya yaması hiç oluşturulmaz.
Dosya yolu korumalı listedeKurulum hata vererek durur.
<name> boşKurulum hata vererek durur.
Aynı adla eklenti varKurulum hata vererek durur.
Çapa dosyada bulunamazKurulum başarılı görünür; yama uygulanmaz ve _plugins_logs tablosuna kayıt düşer.
★
Son satır en kritik olan Çapa tutmadığında hiçbir hata ekranı görmezsiniz. Kontrol için Eklentiler → Hataları göster ekranını açın. Ayrıntısı: Hata Ayıklama.

Güvenlik ve sınırlar

  • Yama yalnızca .php ve .lng dosyalarına uygulanır.
  • Şu dosyalar korumalıdır ve yamalanamaz: engine/classes/mysql.php, engine/classes/plugins.class.php, engine/data/config.php, engine/data/dbconfig.php, engine/data/socialconfig.php, engine/data/videoconfig.php.
  • Sunucuda PLUGINS_READ_ONLY tanımlıysa eklenti kurma/düzenleme/silme tamamen engellenir.
  • Panelden yapılan tüm eklenti işlemleri hem user_hash hem referer denetiminden geçer.

Sıradaki ve en zor konu: doğru çapa seçmek. Çapa Sanatı.