18. Doğrulama Araçları

DLE eklentilerindeki hataların çoğu sessizdir. Bu yüzden "kurdum, çalışıyor gibi görünüyor" demek yeterli değildir. Bu sayfa, yayına almadan önce kullanabileceğiniz denetim yöntemlerini sıralar.

1. DLE'nin kendi araçları

Kurulumdan hemen sonra şu üç yeri kontrol edin:

AraçNerede?Ne söyler?
PHP hatalarını göster Sistem Ayarları → ilgili onay kutusu Ölümcül PHP hatalarını ve çalışma zamanı sorunlarını görünür yapar.
Hataları göster Eklentiler → Hataları göster Tutmayan çapaları ve başarısız SQL bloklarını listeler.
Panel ana sayfa uyarısı Yönetim Paneli ana sayfası Tek bir hata kaydı bile varsa kırmızı bir kutu gösterir.
i
Manifest bozuksa mesajı buradan okuyun Manifest XML'iniz bozuksa DLE kurulum sırasında XML error: <mesaj> at line <satır> biçiminde bir hata gösterir. Bu, dosyanın ayrıştırılamadığı anlamına gelir — genellikle kaçırılmamış bir & veya kapatılmamış bir etiket yüzündendir.

2. Çapa denetleyici — kendi aracınız

Bu, en çok zaman kazandıran araçtır. Kurulum yapmadan önce, manifestinizdeki her çapanın hedef dosyada gerçekten bulunduğunu söyler. DLE'nin prepare_search() mantığının aynısını kullanır; yani DLE neyi arıyorsa onu arar.

Aşağıdaki dosyayı anchor-check.php olarak kaydedin ve DLE kurulu bir sitede komut satırından çalıştırın:

// Kullanim:  php anchor-check.php eklentim.xml /sitenin/kok/dizini
if (PHP_SAPI !== 'cli') die('Bu araç yalnızca komut satırında çalışır.');

$xmlPath = isset($argv[1]) ? $argv[1] : '';
$root    = isset($argv[2]) ? rtrim($argv[2], '/') : '';

if (!$xmlPath || !$root || !is_file($xmlPath)) {
    die("Kullanim: php anchor-check.php eklentim.xml /sitenin/kok/dizini\n");
}

/** DLE'nin DLEPlugins::prepare_search() metoduyla AYNI regex'i üretir. */
function dle_search_regex($code)
{
    $safe = array();
    foreach (explode("\n", trim($code)) as $line) {
        if (trim($line)) {
            $safe[] = preg_replace("/\s+/u", "\s*", preg_quote(trim($line), '#'));
        }
    }
    if (!$safe) return null;
    return '#' . implode("\s*", $safe) . '#siu';
}

$xml = @simplexml_load_file($xmlPath);
if (!$xml) {
    die("Manifest ayrıştırılamadı. XML söz dizimini kontrol edin.\n");
}

$problems = 0;
$checked  = 0;

foreach ($xml->file as $file) {
    $name   = (string)$file->attributes()->name;
    $target = $root . '/' . $name;

    if (!is_file($target)) {
        echo "DOSYA YOK      : $name\n";
        $problems++;
        continue;
    }

    $src = file_get_contents($target);

    foreach ($file->operation as $op) {

        $action = (string)$op->attributes()->action;

        // Bu iki action çapayı yok sayar; denetlenecek bir şey yok.
        if ($action === 'create' || $action === 'replaceall') {
            echo "ATLANDI (tümünü yazar) : [$action] $name\n";
            continue;
        }

        $anchor = (string)$op->searchcode;
        $count  = (string)$op->searchcount;
        $regex  = dle_search_regex($anchor);

        if (!$regex) {
            echo "ÇAPA BOŞ       : [$action] $name\n";
            $problems++;
            continue;
        }

        $hits = preg_match_all($regex, $src);
        $checked++;

        if ($hits === 0) {
            echo "TUTMADI        : [$action] $name\n";
            echo "   aranan        : " . trim($anchor) . "\n";
            $problems++;
        } elseif ($hits > 1 && !$count) {
            echo "RİSKLİ ($hits kez) : [$action] $name  -> searchcount ekleyin\n";
            echo "   aranan        : " . trim($anchor) . "\n";
            $problems++;
        } else {
            echo "tamam ($hits eşleşme) : [$action] $name\n";
        }
    }
}

echo "\n----------------------------------------\n";
echo $problems
    ? "$problems sorun bulundu ($checked çapa denetlendi).\n"
    : "Tüm çapalar tutuyor ($checked çapa denetlendi).\n";
exit($problems ? 1 : 0);

Örnek çıktı:

tamam (1 eşleşme) : [after] engine/modules/main.php RİSKLİ (7 kez) : [after] engine/modules/show.short.php -> searchcount ekleyin aranan : echo $tpl->result['content']; TUTMADI : [replace] engine/modules/x.php aranan : $tpl->set('{title}', $title); DOSYA YOK : engine/modules/yok.php ---------------------------------------- 3 sorun bulundu (4 çapa denetlendi).
★
Bunu CI/dağıtım adımınıza ekleyin Çıkış kodu sorun varsa 1'dir. Böylece paketleme betiğinizde bu denetimi zorunlu tutabilirsiniz: sorun varsa paket çıkmaz.

3. Manifestin yapısal denetimi

Kurulumdan önce şunları elle doğrulayın:

KontrolNeden?
<name> dolu ve başka bir eklentiyle aynı değilBoş veya yinelenen ad kurulumu durdurur.
Her <file> yolu .php veya .lng ile bitiyorDiğer uzantılar sessizce atlanır.
Hiçbir <file> korumalı listede değilKurulum hata vererek durur.
Hiçbir <file> giriş noktası değilYama yazılır ama hiç çalışmaz.
PHP bloklarında <?php etiketi yokBloklar eval() ile çalışır.
versioncompare izinli değerlerden biriTanınmayan değer sürüm kapısını sessizce kapatır.
action beş izinli değerden biriDiğerleri hiç işlenmez.
XML iyi biçimli (well-formed)Bozuk XML'de kurulum başlamaz.
!
XML'de özel karakterler <![CDATA[ ... ]]> blokları içinde <, > ve & serbesttir. Ama CDATA dışındaki alanlarda (örn. <description>) & karakterini &amp; olarak yazmanız gerekir. En sık yapılan XML hatası budur.

4. Yaşam döngüsü test matrisi

Bir eklenti "kurulunca çalışıyor" demekle bitmez. Beş ayrı senaryoyu test etmelisiniz; çünkü DLE her birinde farklı blokları çalıştırır:

SenaryoÇalışan bloklarBeklenti
İlk kurulum mysqlinstall, phpinstall (+ aktifse *enable) Tablo oluşur, eklenti aktif görünür.
Aynı eklentiyi tekrar yükleme (güncelleme) mysqlupgrade, phpupgrade Tablo korunur, yeni alanlar eklenir. Kayıt kaybı olmaz.
Pasife alma mysqldisable, phpdisable Site etkilenmez; eklenti artık yamalanmaz.
Yeniden etkinleştirme mysqlenable, phpenable Eklenti eskisi gibi çalışır; veriler yerinde kalır.
Silme mysqldelete, phpdelete, önbellek temizliği Tablolar düşer, eklenen dosyalar silinir, menü kaydı kalkar.
✕
En sık atlanan iki test Güncelleme (veri kaybı olmamalı) ve silme (artık kalıntı olmamalı). Bu ikisi test edilmezse, kullanıcılarınız güncelleme sırasında veri kaybeder veya silme sonrası tablo adları çakışır.

5. Uyumluluk testleri

  • Sürüm kapısı: DLE sürümü uyuşmadığında eklenti pasif kurulur, hata vermez. Bunu kasıtlı olarak farklı bir dleversion ile deneyin.
  • Birden fazla eklenti: Sizin eklentinizle aynı dosyaya (özellikle engine/modules/main.php) yama yapan bir eklenti daha kurup sırayı test edin.
  • Dil dosyaları: Yönetim paneli metinleri adminpanel.lng, ön yüz metinleri website.lng içine gider. İkisini karıştırmayın.
  • Temiz kurulum: DLE'yi sıfırdan kurup eklentiyi ilk siz yükleyerek deneyin. Var olan bir tabloya/satıra güvenmek, başka sitelerde kırılmanıza yol açar.
  • Farklı tema: Kendi teması olan bir sitede şablon bloğunuzun göründüğünü doğrulayın.

Yayın öncesi kontrol listesi

  1. Çapaları önceden denetleyin anchor-check.php ile tüm çapaların tuttuğunu ve benzersiz olduğunu doğrulayın.
  2. Temiz DLE'ye kurun Hataları göster ekranı boş olmalı.
  3. Güncellemeyi test edin Aynı ZIP'i ikinci kez yükleyin; verilerin korunduğunu görün.
  4. Pasif/aktif döngüsünü test edin Kapatın, siteyi kontrol edin, açın, tekrar kontrol edin.
  5. Silin ve kalıntı bırakmadığını doğrulayın Tablo, ayar kaydı ve menü girdisi kalmamalı.
  6. PHP hatalarını kapatın Sistem Ayarları'ndan hata göstermeyi kapatıp yayınlayın.

Tuzak listesinin tamamı için: Sık Yapılan Hatalar.