16. Paketleme ve Yayın

Eklentiniz çalışıyor. Şimdi onu başkalarına (veya başka sitelere) kurulabilir bir paket hâline getirmek kaldı. Bu sayfa, DLE'nin ZIP yükleme akışının tam kurallarını anlatır.

Paketin kökü site köküdür

En sık yapılan hata: dosyaları upload/ gibi bir sarmalayıcı klasörün içine koymak. DLE böyle bir sarmalayıcı beklemez. ZIP içindeki yollar site köküne görelidir.

benim-eklentim.zip ├── benim-eklentim.xml # MANİFEST — ZIP kökünde olmalı ├── engine/ │ ├── inc/ │ │ └── benim-eklentim.php # panel modülü │ ├── modules/ │ │ └── benim_kutum.php # ön yüz modülü │ ├── ajax/ │ │ └── benim-eklentim.php # AJAX işleyicisi │ └── data/emoticons/ │ └── benim-simge.png # manifest ikonu ├── language/ │ └── Turkish/ │ └── benim_eklentim.lng # eklenti dili └── templates/ └── Default/ └── benim_kutum.tpl # şablon parçası
✕
Şu yapı YANLIŞTIR
benim-eklentim.zip └── upload/ # ← BU SARMALAYICI OLMAMALI └── engine/ …
DLE, upload/engine/modules/… gibi bir yola yazamaz; eklenti kurulur ama hiçbir dosya yerine oturmaz.

Manifest nasıl bulunur?

DLE, ZIP içindeki dosyaları tek tek tarar ve şu iki koşulu sağlayan ilk dosyayı manifest kabul eder:

  1. Uzantısı xml,
  2. Adında / yok — yani ZIP'in kökünde.
// engine/ajax/plugins.php:543-550 (özet)
$filename_arr = explode( ".", $file['name'] );
$type = strtolower(end( $filename_arr ));

if( $type == "xml" AND strpos($file['name'], "/") == false ) {
    $plugin_file = $zip->getFromIndex($i);
    $plugin_file_index = $i;
    continue;
}

Bunun anlamı:

  • Manifest dosyasının adı serbesttir (dleplugin.xml olmak zorunda değil).
  • Kök dışındaki XML dosyaları manifest sayılmaz — alt klasörlerdeki XML'ler normal dosya olarak kopyalanır.
  • Kökükte birden fazla XML varsa ilki kullanılır; diğerleri normal dosya olarak açılır.
  • Manifest bulunamazsa kurulum plugins_errors_9 hatasıyla durur.

Yükleme kuralları

KuralAyrıntı
Dosya uzantısı Yalnızca .zip veya .xml kabul edilir. Başka bir uzantı doğrudan reddedilir.
PHP gereksinimi Sunucuda ZipArchive eklentisi kurulu olmalıdır; değilse ZIP kurulumu hiç başlamaz.
ZIP bütünlüğü Arşiv ZIPARCHIVE::CHECKCONS ile açılır. Bozuk/eksik bir ZIP reddedilir.
Klasörler ZIP içindeki klasör kayıtları atlanır; yalnızca dosyalar işlenir.
Çekirdek dosya koruması DLE'nin antivirus sınıfının korumalı listesindeki bir yolu pakete koyarsanız kurulum hata vererek durur.
Yazma izni yoksa engine/ veya language/ yazılamıyorsa DLE sizden FTP bilgileri ister ve dosyaları FTP ile yükler (needftp yanıtı).
Hata kayıtları Dosya çıkarma sırasındaki hatalar _plugins_logs tablosuna type = 'upload' olarak yazılır.

filelist ve filedelete ilişkisi

ZIP kurulumunda, manifest hariç tüm dosyaların adları bir listeye toplanır ve {prefix}_plugins.filelist sütununa yazılır:

if(in_array("./" . $file['name'], $antivirus->good_files)) {
    echo_error ($lang['plugins_errors_10']);
} else $file_list[] = $file['name'];

Bu liste, eklenti silinirken <filedelete>1</filedelete> verildiyse kullanılır. Yani:

  • filelist yalnızca ZIP kurulumunda dolar (XML yapıştırarak kurulumda boştur).
  • Silme sırasında korumalı dosyalar listede olsa bile atlanır.

Sürümleme ve adlandırma

ÖğeÖneri
Paket dosya adıbenim-eklentim-1.2.0.zip — sürümü dosya adına yazın.
<name>Benzersiz ve sürümden bağımsız olmalı. Aynı adla ikinci eklenti kurulamaz.
<version>Her yayında artırın. Panelde gösterilir.
<dleversion> + <versioncompare>Desteklediğiniz en eski DLE sürümünü belirtin (greater).
<upgradeurl>Güncelleme denetimi istiyorsanız doldurun.
!
Var olan eklentiyi güncellerken name DEĞİŞMEMELİ Güncelleme, eklentiyi adından tanır (aynı ad → güncelleme, farklı ad → yeni eklenti). Adı değiştirirseniz eski kayıt kalır ve iki eklenti oluşur.

Paketleme adımları

  1. Geçici bir test sitesi kullanın Canlı sitenizde denemeyin. Temiz bir DLE 21.0 kurulumu ideal.
  2. Tabloları ön ekle yazın {prefix}_ kullanın; ön eksiz tablo adları başka eklentilerle çakışır.
  3. Manifesti köke koyun ZIP kökünde tek bir *.xml olsun.
  4. Yolları kök-göreli yapın engine/…, language/…, templates/… — sarmalayıcı yok.
  5. Gereksiz dosyaları atın Kaynak kontrol dosyaları, notlar, node_modules, .DS_Store, yedekler…
  6. ZIP'i oluşturun ve içeriğini doğrulayın Arşivi açıp kökte manifest olduğunu ve yolların doğru olduğunu gözle kontrol edin.

Kurulum test döngüsü

Her yayından önce şu beş senaryoyu çalıştırın (ayrıntı: Doğrulama Araçları):

TestBeklenti
1. Temiz kurulumKurulum hatasız; Hataları göster ekranı boş.
2. Yeniden yüklemeGüncelleme çalışır; veriler korunur.
3. Pasife alma / etkinleştirmeSite normal çalışır; eklenti iz bırakmaz/açılınca geri gelir.
4. SilmeTablo, ayar ve menü kaydı temizlenir.
5. Farklı DLE sürümüDesteklenmeyen sürümde eklenti pasif kurulur.
★
Kurulum sonrası ilk bakılacak yer Eklentiler → Hataları göster. Bu ekran boşsa hem çapalar tutmuş hem SQL blokları çalışmış demektir.

Sık karşılaşılan kurulum hataları

BelirtiSebep
Kurulum reddedildiDosya uzantısı .zip/.xml değil.
"You need the PHP 'ZipArchive' extension installed"Sunucuda ZipArchive yok.
ZIP açılamadıArşiv bozuk (CHECKCONS başarısız) — yaygın sebep: hatalı bir arşivleyici.
Manifest bulunamadıKökükte *.xml yok (alt klasörde olabilir).
Çekirdek dosya hatasıPaketinizde DLE'nin korumalı dosyalarından biri var.
needftp isteniyorengine/ veya language/ yazılamıyor; izinleri düzeltin veya FTP bilgisi verin.
Kuruldu, çalışmıyorÇapa tutmadı → Hataları göster ekranına bakın.
Kuruldu, pasif görünüyordleversion/versioncompare veya needplugin uyuşmadı.

Yayın öncesi kontrol listesi

  • Manifest ZIP kökünde, adı *.xml.
  • Tüm dosya yolları kök-göreli; upload/ sarmalayıcısı yok.
  • Manifestte <name>, <version>, <dleversion> dolu.
  • Panel modülü admin_sections'a kaydediliyor ve silmede kaldırılıyor.
  • Tüm çapalar önceden denetlendi (anchor-check.php).
  • Beş kurulum senaryosu test edildi.
  • Pakette gereksiz dosya yok.
  • Yayın notlarında sürüm ve değişiklikler yazılı.
i
Eklenti geliştirme bölümünün sonu Bu 18 sayfalık bölüm, DLE'nin resmî dokümanında 3 sayfaya sığdırılan konuları kapsar. Bir sorunla karşılaşırsanız önce Sık Yapılan Hatalar ve Hata Ayıklama sayfalarına bakın.