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:
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'));
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şken | Ne işe yarar |
|---|---|
$db | Veritabanı nesnesi. Bkz. Veritabanı. |
$tpl | Şablon nesnesi (dle_template). Aşağıya bakın. |
$config | Tüm sistem ayarları (dizi). |
$lang | Dil değişkenleri (website.lng). |
$member_id | Oturum açmış üyenin bilgileri (yoksa boş/guest). |
$is_logged | true ise üye giriş yapmış. |
$cat_info | Aktif kategorilerin dizisi. |
$user_group | Üye gruplarının izinleri. |
$_TIME / $_IP | Sunucu 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.
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
| Metot | Ne 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:trueverilirse şablondaki[if ...]koşul blokları da işlenir. Koşul kullanıyorsanız mutlaka verin. - 3. parametre
$compile_user_data:falseverilirse 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();
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.
$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 _{_ ve _[_ 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ış |
|---|---|
.tpl | Tema klasöründen alt şablon olarak yüklenir ve derlenir. |
.css / .js | Sayfanın CSS/JS listesine eklenir (dosya içeriği gömülmez). |
.php | Yalnı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
PREFIXkullanılmış ve değerlersafesqlile süzülmüş. - Döngüden sonra
$db->free()ve$tpl->clear()çağrılmış. - Şablon etiketi
.tpldosyasında gerçekten var.
Sırada yönetim paneli tarafı var: Admin Panel Modülü.