DataLife Engine için eklenti geliştirirken izlenmesi gereken en iyi uygulamalar, kurallar ve teknikler bu dokümanla açıklanmıştır.
Her eklentinin temelini plugin.xml dosyası oluşturur. Bu dosyada eklentinin adı, sürümü, ikonu ve en önemlisi desteklediği DLE sürümleri belirtilmelidir.
<?xml version="1.0" encoding="utf-8"?>
<plugin>
<name>My Plugin</name>
<description>Eklentimin açıklaması.</description>
<icon>icon.png</icon>
<version>1.0</version>
<dleversion>17.0</dleversion>
</plugin>
Eklentinizi Yönetim Paneli menüsünde göstermek için {prefix}_admin_sections tablosuna kayıt eklemelisiniz. Bu işlem, eklenti kurulurken, güncellenirken, aktif/pasif edilirken ve silinirken doğru SQL sorguları ile yönetilmelidir.
XML İçinde Eklenti Veritabanı Döngüsü Sorguları:
<!-- Eklenti Kurulurken Çalışır -->
<mysqlinstall><![CDATA[
INSERT INTO `{prefix}_admin_sections` (`name`, `title`, `descr`, `icon`, `allow_groups`)
VALUES ('mymod', 'Test Eklentisi', 'Test eklentisinin açıklaması', 'mymod.png', '1');
]]></mysqlinstall>
<!-- Eklenti Aktif Edildiğinde Çalışır -->
<mysqlenable><![CDATA[
REPLACE INTO `{prefix}_admin_sections` (`name`, `title`, `descr`, `icon`, `allow_groups`)
VALUES ('mymod', 'Dizi Yönetimi', 'TMDB API ile dizi yönetim sistemi', 'fa-film', '1');
]]></mysqlenable>
<!-- Eklenti Pasif Edildiğinde Çalışır -->
<mysqldisable><![CDATA[
DELETE FROM `{prefix}_admin_sections` WHERE name IN ('mymod');
]]></mysqldisable>
<!-- Eklenti Tamamen Silindiğinde Çalışır -->
<mysqldelete><![CDATA[
DELETE FROM `{prefix}_admin_sections` WHERE name = 'mymod';
DROP TABLE IF EXISTS `{prefix}_mymod_ayarlar`;
]]></mysqldelete>
<!-- Eklenti Güncellenirken Çalışır -->
<mysqlupgrade><![CDATA[
ALTER TABLE `{prefix}_mymod_ayarlar` ADD `yeni_ayar` VARCHAR(255) NOT NULL;
]]></mysqlupgrade>
Eklenti dosyalarınızı başka bir dosyaya dahil ederken çakışmaları önlemek için her zaman DLEPlugins::Check() fonksiyonunu kullanın:
include_once(DLEPlugins::Check(ENGINE_DIR . '/inc/mymodule.php'));
Çekirdek dosyalara müdahale etmeniz gerektiğinde, dosyayı doğrudan düzenlemek yerine plugin.xml içindeki <operation> etiketini kullanın:
<operation action="after">
<searchcode><![CDATA[
if( !$allow_addnews ) msg( "error", ... );
]]></searchcode>
<replacecode><![CDATA[
include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/mymod_hook.php'));
]]></replacecode>
</operation>
Eklentinizle birlikte yeni PHP dosyaları oluşturmak için <file> etiketini kullanabilirsiniz:
<file name="engine/ajax/mymod_ajax.php">
<operation action="create">
<replacecode><![CDATA[<?php
// AJAX dosya içeriği buraya gelir
?>]]></replacecode>
</operation>
</file>
engine/ajax/controller.php içinde mod= parametresi ile AJAX fonksiyonu oluşturun. JS tarafında çağırmak için örnek:
$.post("engine/ajax/controller.php?mod=example_plugin", { data: "test" }, function(result) {
console.log(result);
});
PHP tarafında oluşturduğunuz verileri .tpl dosyasında göstermek için DLE'nin şablon motorunu kullanın. Bu sayede kod ve tasarım ayrı kalır.
engine/modules/mymod.php)$tpl->load_template('mymod.tpl');
$tpl->set('{plugin_adi}', 'Benim Harika Eklentim');
if ($is_logged) {
$tpl->set('[logged]', "");
$tpl->set('[/logged]', "");
$tpl->set_block("'\\[not-logged\\](.*?)\\[/not-logged\\]'si", "");
} else {
$tpl->set('[not-logged]', "");
$tpl->set('[/not-logged]', "");
$tpl->set_block("'\\[logged\\](.*?)\\[/logged\\]'si", "");
}
$tpl->compile('content');
templates/skin-adi/mymod.tpl)<h2>{plugin_adi}</h2>
[logged]<p>Hoş geldin üye!</p>[/logged]
[not-logged]<p>Lütfen giriş yapın.</p>[/not-logged]
Yukarıdaki tüm kuralları bir araya getiren, daha sağlam ve DLE standartlarına uygun bir eklenti yapılandırma dosyası örneği.
<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
<name>Ornek Eklenti</name>
<description>Bu eklenti, DLE eklenti geliştirme standartlarına uygun olarak hazırlanmıştır.</description>
<icon>example_icon.png</icon>
<version>1.0</version>
<dleversion>18.0</dleversion>
<versioncompare>greater</versioncompare>
<!-- Veritabanı kurulumu -->
<mysqlinstall>
<![CDATA[
CREATE TABLE IF NOT EXISTS `{prefix}_pluginconfig` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`setting_key` VARCHAR(50) NOT NULL UNIQUE,
`setting_value` TEXT NOT NULL
);
INSERT IGNORE INTO `{prefix}_pluginconfig` (`setting_key`, `setting_value`) VALUES ('enable_feature', '1');
]]>
</mysqlinstall>
<!-- Eklenti Aktif Edildiğinde -->
<mysqlenable>
<![CDATA[
REPLACE INTO `{prefix}_admin_sections` (`name`, `title`, `descr`, `icon`, `allow_groups`)
VALUES ('example_plugin', 'Örnek Eklenti', 'Örnek eklenti ayar sayfası', 'example_icon.png', '1');
]]>
</mysqlenable>
<!-- Eklenti Pasif Edildiğinde -->
<mysqldisable>
<![CDATA[
DELETE FROM `{prefix}_admin_sections` WHERE name='example_plugin';
]]>
</mysqldisable>
<!-- Eklenti Tamamen Silindiğinde -->
<mysqldelete>
<![CDATA[
DROP TABLE IF EXISTS `{prefix}_pluginconfig`;
DELETE FROM `{prefix}_admin_sections` WHERE name='example_plugin';
]]>
</mysqldelete>
<!-- Çekirdek dosyalara müdahale örneği -->
<file name="engine/modules/main.php">
<operation action="after">
<searchcode><![CDATA[
if( !$allow_addnews ) msg( "error", $lang['addnews_denied'], $lang['addnews_denied'] );
]]></searchcode>
<replacecode><![CDATA[
include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/example_plugin_hook.php'));
]]></replacecode>
</operation>
</file>
<!-- Eklentinin oluşturacağı yeni dosyalar -->
<file name="engine/inc/example_plugin.php">
<operation action="create">
<replacecode><![CDATA[<?php
if (!defined('DATALIFEENGINE') OR !defined('LOGGED_ADMIN')) { die("Hacking attempt!"); }
echo "<h1>Örnek Eklenti Yönetim Paneli</h1>";
?>]]></replacecode>
</operation>
</file>
<file name="engine/modules/example_plugin_hook.php">
<operation action="create">
<replacecode><![CDATA[<?php
if (!defined('DATALIFEENGINE')) { die("Hacking attempt!"); }
// Bu dosya, main.php'deki belirtilen noktada çalışacaktır.
?>]]></replacecode>
</operation>
</file>
</dleplugin>