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.
*.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
| Etiket | Zorunlu | Açıklama |
|---|---|---|
<name> | Evet | Eklentinin adı. Benzersiz olmalıdır — aynı adla ikinci eklenti kurulamaz. |
<description> | Hayır | Panelde listelenen kısa açıklama. |
<icon> | Hayır | Panelde görünen simge yolu. Yalnızca görsel uzantıları kabul edilir (png, jpg, svg, gif, webp, avif, bmp). |
<version> | Hayır | Sizin eklenti sürümünüz. Sadece gösterim amaçlıdır. |
<dleversion> | Hayır | Hedef DLE sürümü (örn. 21.0). |
<versioncompare> | Hayır | dleversion ile birlikte çalışır. Aşağıya bakın. |
<upgradeurl> | Hayır | Güncelleme adresi. Panelde "güncelleme var" kontrolü için kullanılır. |
<needplugin> | Hayır | Bağımlı olduğu eklentilerin adları, virgülle ayrılmış. |
<filedelete> | Hayır | 1 ise eklenti silinirken kurulumda ZIP ile gelen dosyalar da silinir. |
<notice> | Hayır | Panelde eklenti satırında gösterilen bilgi metni (BB kod destekler). |
<mnotice> | Hayır | 1 ise notice metni listede görünür. İkisi birlikte gerekir. |
<file> | Hayır | Dosya 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ğer | DLE'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. |
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.
<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:
| Blok | Ne 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. |
- Güncelleme,
mysqlinstall'ı çalıştırmaz. Tabloyu güncellemede de oluşturmak istiyorsanız yaIF NOT EXISTSkullanın ya da aynı SQL'imysqlupgradeiçine de yazın. - Silme,
mysqldisable'ı çalıştırmaz. Tabloyumysqldeleteiç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 tutucu | Yerine 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>
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).
<?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>
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>
<file name="engine/modules/main.php"> — yol name
özniteliğinde verilir. Alt etiket olarak <name> yazmak
işe yaramaz.
operation alt etiketleri
| Etiket | Gerekli mi? | Açıklama |
|---|---|---|
action (öznitelik) | Evet | replace, 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ır | Eklemenin 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ır | Bu yama için ayrı sürüm kapısı. |
<versioncompare> | Hayır | Üst düzey etiketle aynı kurallar. |
<enabled> | Hayır | 0 verilmezse yama etkindir. |
action türleri — tam davranış
| action | searchcode | Sonuç |
|---|---|---|
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 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:
| Durum | Ne 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 bitmiyor | Dosya yaması hiç oluşturulmaz. |
| Dosya yolu korumalı listede | Kurulum hata vererek durur. |
<name> boş | Kurulum hata vererek durur. |
| Aynı adla eklenti var | Kurulum hata vererek durur. |
| Çapa dosyada bulunamaz | Kurulum başarılı görünür; yama uygulanmaz ve
_plugins_logs tablosuna kayıt düşer. |
Güvenlik ve sınırlar
- Yama yalnızca
.phpve.lngdosyaları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_ONLYtanımlıysa eklenti kurma/düzenleme/silme tamamen engellenir. - Panelden yapılan tüm eklenti işlemleri hem
user_hashhem referer denetiminden geçer.
Sıradaki ve en zor konu: doğru çapa seçmek. Çapa Sanatı.