1. Geliştirici Ortamı ve Hata Ayıklama (Debugging)
Eklenti yazarken en sık karşılaşılan durum "beyaz sayfa" veya beklenmedik hatalardır. Sorunu bulmak için geliştirme ortamınızı doğru şekilde yapılandırmalısınız.
PHP Hata Raporlamasını Aktif Etme
Geliştirme aşamasında, DLE'nin ana index.php ve admin.php dosyalarının en başına (<?php'den hemen sonra) aşağıdaki kodları geçici olarak ekleyin. İşiniz bittiğinde bu kodları mutlaka silin!
@ini_set('display_errors', '1');
@error_reporting(E_ALL);
DLE Veritabanı Hata Modu
Hatalı SQL sorgularını görmek için /engine/classes/mysql.php dosyasını açın ve var $show_error = false; satırını var $show_error = true; olarak değiştirin. İşiniz bittiğinde mutlaka geri alın!
2. `plugin.xml`: Eklentinizin Anayasası
DLE 16+ sürümlerinde eklentinin kurulumu, DLE'ye müdahalesi, veritabanı işlemleri ve dosya operasyonları, DLE'ye ne yapacağını adım adım anlatan bir talimat listesi olan plugin.xml dosyası üzerinden yönetilir.
XML Yaşam Döngüsü Etiketleri
<mysqlinstall><![CDATA[ CREATE TABLE `{prefix}_mytable` ... ; ]]></mysqlinstall>
<mysqlenable><![CDATA[ REPLACE INTO `{prefix}_admin_sections` ... ; ]]></mysqlenable>
<mysqldisable><![CDATA[ DELETE FROM `{prefix}_admin_sections` ... ; ]]></mysqldisable>
<mysqlupgrade><![CDATA[ ALTER TABLE `{prefix}_mytable` ADD `new_col` ... ; ]]></mysqlupgrade>
<mysqldelete><![CDATA[ DROP TABLE IF EXISTS `{prefix}_mytable`; ]]></mysqldelete>
Çekirdek Dosyalara Müdahale: <operation> ve DLEPlugins::Check()
Bu, eklenti sisteminin en güçlü ve esnek özelliğidir. DLE'nin herhangi bir PHP dosyasının içine, fiziksel olarak o dosyayı değiştirmeden kod enjekte etmenizi sağlar.
<file name="engine/modules/main.php">
<operation action="after">
<searchcode><![CDATA[ // Müdahale edilecek kod satırı ]]></searchcode>
<replacecode><![CDATA[ include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/my_hook.php')); ]]></replacecode>
</operation>
</file>
DİKKAT: DLEPlugins::Check() Neden Zorunludur?
Bir eklenti pasif durumdayken, dosyaları sunucuda hala mevcuttur. Eğer include_once komutunu DLEPlugins::Check() ile sarmalamazsanız, DLE eklenti pasif olsa bile o dosyayı dahil etmeye çalışır. Bu, genellikle diğer eklentilerle çakışmalara veya ölümcül PHP hatalarına yol açar. Bu fonksiyon, "sadece bu eklenti aktifse bu dosyayı dahil et" diyerek bu sorunu önler. Bu fonksiyonu kullanmamak, amatörce bir hatadır.
3. Global DLE Objeleri ve Fonksiyonları: Araç Kutunuz
DLE içinde geliştirme yaparken, sistemin temel işlevlerini yürüten bazı global objelere, dizilere ve fonksiyonlara her yerden erişebilirsiniz.
Temel Objeler ve Diziler
$db(Obje): Veritabanı ile tüm etkileşimler için kullanılır.$tpl(Obje): DLE'nin şablon motorudur.$config(Dizi): Sitenizin tüm ayarlarını içerir.
$member_id(Dizi): Giriş yapmış kullanıcının tüm bilgilerini içerir.$is_logged(Boolean): Kullanıcının giriş yapıp yapmadığını belirtir.$dle_login_hash(String): CSRF koruması için güvenlik anahtarıdır.
Sık Kullanılan Global Fonksiyonlar
msg(): Yönetim panelinde standart DLE stilinde başarı, hata veya bilgi mesajları göstermek için kullanılır.echoheader() / echofooter(): Yönetim paneli sayfalarınızın standart DLE başlık ve altbilgi şablonunu basar.create_cache() / dle_cache(): Sık değişmeyen sorgu sonuçlarını önbelleğe almak ve okumak için kullanılır.
4. Eklenti Panelinin Frontend Yapısı (Bootstrap 3)
DLE yönetim paneli, arayüz iskeleti olarak Bootstrap 3 sözdizimini temel alan bir yapı kullanır. Bu, topluluk standardıdır ve tüm profesyonel eklentiler bu yapıya uyar.
Temel Panel Yapısı ve Sekmeler (Tabs)
echoheader("<i class='fa fa-puzzle-piece'></i> Eklenti Adı", "Açıklama");
echo <<<HTML
<div class="panel panel-default">
<div class="panel-heading">
<ul class="nav nav-tabs">
<li class="active"><a href="#tab1" data-toggle="tab">Genel Ayarlar</a></li>
<li><a href="#tab2" data-toggle="tab">Veri Listesi</a></li>
</ul>
</div>
<div class="panel-body">
<div class="tab-content">
<div class="tab-pane active" id="tab1">...</div>
<div class="tab-pane" id="tab2">...</div>
</div>
</div>
</div>
HTML;
echofooter();
Modern Açma-Kapama Anahtarı (Toggle Switch)
Evet/Hayır seçenekleri için standart checkbox yerine DLE'nin modern "toggle switch" anahtarını kullanmak için, checkbox input'una class="icheck" eklemeniz yeterlidir.
// Ayar değerine göre 'checked' durumunu belirle
\$module_enabled_checked = (\$config['module_enabled'] == 1) ? 'checked' : '';
// Form içinde HTML'i oluştur
<div class="form-group">
<label class="control-label col-sm-3">Modül Aktif:</label>
<div class="col-sm-9">
<div class="checkbox"><label>
<input class="icheck" type="checkbox" name="save_con[module_enabled]" value="1" {\$module_enabled_checked}>
</label></div>
</div>
</div>
5. /engine/ Klasörlerinin Anatomisi
Bir DLE eklentisi, farklı amaçlara hizmet eden dosyalardan oluşur. Bu dosyaları doğru klasörlere yerleştirmek, DLE'nin onları tanıması ve çalıştırması için zorunludur.
/engine/inc/ - Yönetim Panelinizin Kalbi
Görevi: Eklentinizin yönetim paneli arayüzünü barındırır. /admin.php?mod=eklentiadi adresiyle erişilir. Tüm ayar formları, veri listeleri ve yönetimsel işlemler burada kodlanır.
/engine/modules/ - Ziyaretçiye Görünen Yüz
Görevi: Sitenin ön yüzünde (frontend), genellikle tam sayfa olarak çalışan modülleri barındırır. /index.php?do=moduladi adresiyle erişilir. "İletişim Formu", "SSS" gibi özel sayfalar oluşturmak için kullanılır.
/engine/ajax/ - Arka Planda Çalışan İşçi
Görevi: Sayfa yenilenmeden arka planda çalışan AJAX isteklerini karşılar. Modern ve güvenli yöntem, JavaScript'ten isteği DLE'nin /engine/ajax/controller.php?mod=dosya_adi adresine yapmaktır. Bu, AJAX dosyanızda $db, $member_id gibi global objeleri güvenli bir şekilde kullanabilmenizi sağlar.
6. `DLEPush` JavaScript Objesi: Anlık Arayüz Bildirimleri
DLE'nin yönetim paneli, kullanıcılara anlık ve modern geri bildirimler (hata, başarı, bilgi) göstermek için yerleşik bir JavaScript objesine sahiptir: DLEPush. Bu, PHP'deki msg() fonksiyonunun aksine, sayfa yenilenmeden çalışan, sağ üstte beliren ve birkaç saniye sonra kaybolan bildirim kutucukları oluşturur.
Pratik Kullanım Örnekleri:
// Başarılı bildirimi göstermek için:
DLEPush.success("Ayarlar başarıyla kaydedildi!", "Başarılı");
// Hata bildirimi göstermek için:
if(document.addnews.title.value == ''){
DLEPush.error("Haber başlığı boş bırakılamaz!", "Hata");
return false;
}
// Bilgi bildirimi göstermek için:
DLEPush.info("Veriler dışa aktarılıyor, lütfen bekleyin...", "Bilgi");
7. Güvenlik ve En İyi Uygulamalar (Zorunlu)
Kötü yazılmış bir eklenti, tüm sitenin güvenliğini tehlikeye atabilir. Aşağıdaki kurallara uymak bir seçenek değil, zorunluluktur.
SQL Injection Koruması
// YANLIŞ VE ÇOK TEHLİKELİ!
\$db->query("SELECT * FROM " . USERPREFIX . "_users WHERE user_id = {\$_GET['id']}");
// DOĞRU VE GÜVENLİ
\$user_id = intval(\$_GET['id']);
\$db->query("SELECT * FROM " . USERPREFIX . "_users WHERE user_id = '{\$user_id}'");CSRF Koruması
if( \$_REQUEST['user_hash'] != \$dle_login_hash ) { die("Hacking attempt!"); }8. Adım Adım Pratik Örnek: "Merhaba Dünya" Eklentisi
Tüm bu teorik bilgileri birleştirelim. Amacımız: Yönetim panelinde bir metin kutusuna mesaj yazacağımız, bu mesajı sitenin ön yüzünde /index.php?do=merhaba adresinde göstereceğimiz basit bir eklenti yapmak.
Adım 1: Dosya Yapısı
MerhabaDunya/
├── plugin.xml
└── upload/
├── engine/
│ ├── inc/
│ │ └── merhaba.php
│ └── modules/
│ └── merhaba.php
└── templates/
└── Default/
└── merhaba.tpl
Adım 2: `plugin.xml`
<dleplugin>
<name>Merhaba Dünya</name>
<filedir>upload</filedir>
<mysqlinstall><![CDATA[
CREATE TABLE IF NOT EXISTS `{prefix}_merhaba_dunya` (`mesaj` TEXT NOT NULL);
INSERT INTO `{prefix}_merhaba_dunya` VALUES ('Merhaba Dünya!');
]]></mysqlinstall>
<mysqlenable><![CDATA[
REPLACE INTO `{prefix}_admin_sections` (`name`, `title`) VALUES ('merhaba', 'Merhaba Eklentisi');
]]></mysqlenable>
<mysqldelete><![CDATA[
DROP TABLE IF EXISTS `{prefix}_merhaba_dunya`;
DELETE FROM `{prefix}_admin_sections` WHERE name='merhaba';
]]></mysqldelete>
</dleplugin>
Adım 3: Yönetim Paneli (`/inc/merhaba.php`)
<?php
if(!defined('DATALIFEENGINE')||!$is_logged||$member_id['user_group']!=1)die("Hacking attempt!");
if(isset(\$_POST['save'])){
if(\$_POST['user_hash']!=\$dle_login_hash)die("Hacking attempt!");
\$mesaj=\$db->safesql(\$_POST['mesaj']);
\$db->query("UPDATE ".PREFIX."_merhaba_dunya SET mesaj='{\$mesaj}'");
msg("success","Başarılı","Mesaj kaydedildi.");
}
\$mevcut_mesaj=$db->super_query("SELECT mesaj FROM ".PREFIX."_merhaba_dunya");
echoheader("Merhaba Dünya","Mesajı düzenle.");
echo '<form action="?mod=merhaba" method="post">
<div class="panel panel-default"><div class="panel-body">
<textarea name="mesaj" class="form-control" rows="5">'.htmlspecialchars($mevcut_mesaj['mesaj']).'</textarea>
</div><div class="panel-footer">
<input type="hidden" name="user_hash" value="'.\$dle_login_hash.'">
<button type="submit" name="save" class="btn btn-success">Kaydet</button>
</div></div></form>';
echofooter();
?>
Adım 4: Ön Yüz Modülü (`/modules/merhaba.php`)
<?php
if(!defined('DATALIFEENGINE'))die("Hacking attempt!");
\$tpl->load_template('merhaba.tpl');
\$mesaj=$db->super_query("SELECT mesaj FROM ".PREFIX."_merhaba_dunya");
\$tpl->set('{mesaj}', \$mesaj['mesaj']);
\$tpl->compile('content');
\$tpl->clear();
?>
Adım 5: TPL Şablonu (`/templates/Default/merhaba.tpl`)
<div><h1>{mesaj}</h1></div>
Adım 6: Paketle ve Kur
MerhabaDunya klasörünü ZIP'leyin ve DLE Yönetim Paneli > Eklenti Yönetimi'nden yükleyin.