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.
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);
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!
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.
<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>
<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>
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.
DLE içinde geliştirme yaparken, sistemin temel işlevlerini yürüten bazı global objelere, dizilere ve fonksiyonlara her yerden erişebilirsiniz.
$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.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.
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.
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();
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>
/engine/ Klasörlerinin AnatomisiBir 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.
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.
Görevi: Siteninin ö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.
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.
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.
// 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");
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.
// 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}'");if( \$_REQUEST['user_hash'] != \$dle_login_hash ) { die("Hacking attempt!"); }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.
MerhabaDunya/
├── plugin.xml
└── upload/
├── engine/
│ ├── inc/
│ │ └── merhaba.php
│ └── modules/
│ └── merhaba.php
└── templates/
└── Default/
└── merhaba.tpl
<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>
<?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();
?>
<?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();
?>
<div><h1>{mesaj}</h1></div>
MerhabaDunya klasörünü ZIP'leyin ve DLE Yönetim Paneli > Eklenti Yönetimi'nden yükleyin.