6. Ön Yüz Modülü

Ön yüz modülü, sitenin görünen yüzünü üreten koddur. DLE'nin kendi modülleri de (haber gösterme, arama, oylama, istatistik) aynı yerde durur ve aynı kurallara uyar — siz de tam olarak onlar gibi bir modül yazacaksınız.

Modüller nerede durur?

Tüm ön yüz modülleri engine/modules/ klasöründedir. DLE 21.0 ile gelen 38 modül vardır:

engine/modules/ ├── main.php # ana sayfa iskeleti (main.tpl'i derler) ├── show.short.php # kısa makale gösterimi ├── show.full.php # tam makale gösterimi ├── show.custom.php # statik sayfa gösterimi ├── comments.php # yorumlar ├── search.php # arama ├── poll.php vote.php stats.php topnews.php ├── register.php lostpassword.php profile.php ├── favorites.php pm.php feedback.php ├── rssinform.php tagscloud.php calendar.php ├── sitelogin.php banned.php offline.php ├── functions.php # yardımcı fonksiyonlar (modül değil) └── … (toplam 38 dosya)

Modüller nasıl yüklenir?

Kalıp her zaman aynıdır: DLEPlugins::Check() ile sarmalanmış bir include.

include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/benim_modulum.php'));

Check(), eklenti varsa yamalı kopyanın yolunu, yoksa orijinal yolu döndürür. DLE'nin kendi modülleri de birbirini böyle çağırır — gerçek örnekler:

// engine/modules/main.php:45-47
if( !is_string($related_buffer) ) {
    include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/show.related.php'));
}

// engine/modules/show.full.php:294
if( $row['votes'] AND $view_template != "print" )
    include_once (DLEPlugins::Check(ENGINE_DIR . '/modules/poll.php'));

// engine/modules/register.php:357
include_once(DLEPlugins::Check(ENGINE_DIR . '/modules/static.php'));
✕
Dosya adı çakışmasın engine/modules/ içine DLE'nin kullandığı bir adla dosya koymayın (stats.php, search.php vb.). Kendi modülünüze benzersiz bir ad verin (örn. benim_kutum.php).

Modülde hazır gelen değişkenler

Modülünüz include edildiğinde değişkenler global kapsamda hazırdır. Başına global yazmanız gerekmez (modül zaten global kapsamda çalışır), ama fonksiyon içinden erişecekseniz global $db; yazmalısınız.

DeğişkenNe işe yarar
$dbVeritabanı nesnesi. Bkz. Veritabanı.
$tplŞablon nesnesi (dle_template). Aşağıya bakın.
$configTüm sistem ayarları (dizi).
$langDil değişkenleri (website.lng).
$member_idOturum açmış üyenin bilgileri (yoksa boş/guest).
$is_loggedtrue ise üye giriş yapmış.
$cat_infoAktif kategorilerin dizisi.
$user_groupÜye gruplarının izinleri.
$_TIME / $_IPSunucu zamanı ve ziyaretçi IP'si.

Şablon API'si — dle_template

Sınıfın adı dle_template'tir ve engine/classes/templates.class.php içindedir. Şablon kökü ROOT_DIR . '/templates/' olarak ayarlanır.

!
İnternette gördüğünüz bazı metotlar YOKTUR set_key(), clear_unused() ve metot olarak copy_template() DLE 21.0 kaynak kodunda bulunmaz. $copy_template yalnızca bir özelliktir, metot değildir. Eski rehberlerde bu isimlere rastlarsanız güvenmeyin.

Gerçekten var olan metotlar

MetotNe yapar?
load_template($tpl_name) templates/<tema>/$tpl_name dosyasını okur ve derlemeye hazırlar. Dosya yoksa veya .tpl değilse false döner.
set($name, $var) Bir etiketi değerle eşler. Değer dizi/nesne de olabilir (özyinelemeli işlenir).
set_block($desen, $deger) Şablondaki bir regex kalıbını değerle değiştirir. Boş değer verilirse o bloğu siler. Gerçek kullanım: $tpl->set_block("'\\[not-comments\\](.*?)\\[/not-comments\\]'si", "") — yani birinci parametre etiket adı değil, kalıptır.
compile($tpl, $compile_if = false, $compile_user_data = true) Etiketleri değiştirir ve sonucu $tpl->result[$tpl] içine ekler.
clear() Etiket verilerini ve yüklü şablonu temizler.
global_clear() clear() + result dizisini de boşaltır.

result bir dizidir: array('info' => '', 'vote' => '', 'speedbar' => '', 'content' => ''). compile() hangi anahtarı verirseniz çıktıyı o kutuya yazar.

compile() parametreleri

  • 2. parametre $compile_if: true verilirse şablondaki [if ...] koşul blokları da işlenir. Koşul kullanıyorsanız mutlaka verin.
  • 3. parametre $compile_user_data: false verilirse kullanıcı ek alanları ilgili bloklar atlanır (performans için). Örneğin AJAX profil çıktısı compile('content', true, false) çağırır.

Doğru kullanım akışı

// 1) Şablonu yükle
$tpl->load_template('benim_kutum.tpl');

// 2) Etiketleri doldur
$tpl->set('{baslik}', htmlspecialchars($row['baslik'], ENT_QUOTES, 'UTF-8'));
$tpl->set('{THEME}', $config['http_home_url'] . 'templates/' . $config['skin']);

// 3) Derle — çıktı bir kutuya yazılır
$tpl->compile('content');   // veya istediğiniz başka bir anahtar

// 4) Temizle
$tpl->clear();

Bu akış DLE'nin kendi modüllerinde birebir böyledir. Örnek — engine/modules/stats.php:

$tpl->load_template( 'stats.tpl' );
// … $tpl->set(...) çağrıları …
$tpl->compile( 'content' );
$tpl->clear();
i
Aynı etiketi birden çok kez kullanıyorsanız Klasik DLE kalıbı, döngüde şablonu bir kez yükleyip her kayıt için set + compile yapmak, sonunda clear() çağırmaktır. compile() sonucu eklediği için her turda çıktı birikir.

Çıktı nereye gider?

main.php, ana şablonu (main.tpl) derlerken {content} etiketini $tpl->result['content'] ile değiştirir:

// engine/modules/main.php:403-408
$tpl->set ( '{info}',  $tpl->result['info'] );
$tpl->set ( '{content}', $tpl->result['content'] );
$tpl->compile ( 'main' );

Yani engine/modules/… zincirinde üretilen her şey, sonunda main.tpl'in {content} yerine oturur.

✕
Şablon etiketi yoksa hiçbir şey görünmez $tpl->set('{benim_kutum}', …) yalnızca benim_kutum.tpl içinde {benim_kutum} varsa işe yarar. Aynı şekilde ara sonuç {content} yerine oturmadan görünmez. Şablon bloğunu kurulumda otomatik eklemek için phpinstall bloğunu kullanın.

İnce tuzak: set() parantezleri kaçırır

set() metodu, verdiğiniz değerin içindeki { ve [ karakterlerini geçici olarak _&#123;_ ve _&#91;_ biçimine çevirir. Bu, kullanıcı içeriğinin yanlışlıkla etiket sanılmasını engeller.

Bu kaçışlar compile() sırasında otomatik geri açılır. Tek istisna main'dir: orada geri açma, engine/modules/main.php içinde ayrıca yapılır. Pratikte kullanıcıya giden HTML'de parantezler normal görünür — yani kullanıcının yazdığı { } karakterleri şablonu bozmaz.

✕
[block] diye bir etiket YOKTUR İnternette geçen [block] etiketi ve blocks/ klasörü DLE 21.0 kaynak kodunda bulunmaz. Şablonu parçalara ayırmanın doğru yolu {include} etiketidir (aşağıda).

Şablonu parçalara ayırmak: {include}

Tema geliştirirken tek bir main.tpl dosyasına her şeyi yazmak yerine parçalara bölebilirsiniz:

{include file="modules/sidebar.tpl"}
{include file="modules/footer.tpl"}

{include} etiketi üç tür dosya kabul eder:

UzantıDavranış
.tplTema klasöründen alt şablon olarak yüklenir ve derlenir.
.css / .jsSayfanın CSS/JS listesine eklenir (dosya içeriği gömülmez).
.phpYalnızca sınırlı durumlarda çalışır; templates/, uploads/ ve engine/ gibi klasörler yasaktır.

Hazır temalarda bu yöntem kullanılır; örneğin main.tpl içinde {include file="modules/sidebar.tpl"} satırı bulunur.

Tam örnek: haber altına kutu

engine/modules/benim_kutum.php:

if (!defined('DATALIFEENGINE')) die('Hacking attempt!');

// Hazır gelenler: $db, $tpl, $config, $lang, $member_id

$limit = isset($config['benim_kutum_limit']) ? intval($config['benim_kutum_limit']) : 5;
$rows  = array();

$db->query("SELECT id, baslik FROM " . PREFIX . "_benim_kutum ORDER BY id DESC LIMIT " . $limit);
while ($row = $db->get_row()) {
    $rows[] = $row;
}
$db->free();

if (!$rows) return; // gösterilecek bir şey yok

$tpl->load_template('benim_kutum.tpl');

foreach ($rows as $row) {
    $tpl->set('{baslik}', htmlspecialchars($row['baslik'], ENT_QUOTES, 'UTF-8'));
    $tpl->set('{link}', $config['http_home_url'] . 'index.php?do=benim_kutum&id=' . intval($row['id']));
    $tpl->compile('content');
}

$tpl->clear();

Şablon dosyası templates/<tema>/benim_kutum.tpl:

<div class="benim-kutum">
    <a href="{link}">{baslik}</a>
</div>

Kendi sayfasını üreten modüller

Bazı modüller ana şablonu kullanmaz; kendi başlık/alt bilgisini basar. Bunun için echoheader() ve echofooter() kullanılır (engine/inc/include/functions.inc.php):

echoheader($headers['title'], $headers['description']);

// … sayfa içeriği …

echofooter();

echoheader($header_title, $header_subtitle) tam olarak bu iki parametreyi alır; echofooter() parametre almaz. Örnek kullanım: engine/modules/register.php, engine/modules/lostpassword.php.

Modül kontrol listesi

  • Dosya engine/modules/ altında ve adı benzersiz.
  • Yükleme bir DLEPlugins::Check() ile sarmalanmış.
  • Modül çıktısı bir şablona dayanıyor (load_template), HTML koda gömülü değil.
  • Kullanıcıdan gelen veriler htmlspecialchars() ile kaçırılmış.
  • SQL'de PREFIX kullanılmış ve değerler safesql ile süzülmüş.
  • Döngüden sonra $db->free() ve $tpl->clear() çağrılmış.
  • Şablon etiketi .tpl dosyasında gerçekten var.

Sırada yönetim paneli tarafı var: Admin Panel Modülü.