Sablon (template) kezelés

A következőkben egy olyan, általam írt PHP-s függvényt szeretnék bemutatni, amellyel könnyedén és egyszerűen készíthetünk magunknak olyan oldalt, amely támogatja a sablonok (template) kezelését. Ez több szempontból is hasznos lehet:

  • több dizájnunk van a honlapon, és akkor váltunk amikor szeretnék
  • a felhasználók válthatnak akár másik dizájnra
  • a design és maga a kód elkülönül egymástól, átláthatóbb és kezelhetőbb az egész

Vágjunk is bele! Először is szükségünk lesz egy .tpl fájlra. (a kiterjesztése végülis teljesen mindegy, létrehozás: megnyitod a jegyzettömböt, majd elmented pl. template.tpl néven).

A függvényünknek a load_template_file nevet adtam (lehet kicsit hosszú :)):

1
2
3
4
5
6
7
 <?php
 
 function load_template_file() {
 
 }
 
?>

A függvény alkalmazása során szükségünk lesz két változóra. Az egyik a betölteni kívánt template fájl lesz, a másik pedig egy tömb, amely a template fájlban lecserélendő értékeket fogja tartalmazni.

1
2
3
4
5
6
7
<?php
 
 function load_template_file($fajlnev,$tomb) {
 
 }
 
?>

A következő lépés a template fájlunk beolvasása, azonban először ehhez meg is kell nyitnunk:

1
$temp = fopen($fajlnev,"r");

A következő lépésben beolvassuk a $tartalom változóba a megnyitott fájlunk tartalmát, majd lezárjuk a fájlt:

$tartalom = fread($temp, filesize($fajlnev));

Ezek alapján a függvényünk a következő:

1
2
3
4
5
6
7
8
9
<?php
 
 function load_template_file($fajlnev,$tomb) {
     $temp = fopen($fajlnev,"r");
     $tartalom = fread($temp, filesize($fajlnev));
     fclose($temp);
 }
 
?>

Nos a template.tpl fájlunkba a következőt írjuk bele:

1
 {koszones} Methos!

Ezután a preg_replace() nevű php függvényt fogjuk alkalmazni, mellyel lecséljük a tömbünkre a {kulcs} típusú szöveget.

1
$tartalom = preg_replace("/{(.*?)}/si","\" . (\$tomb['\\1']) . \"",$tartalom);

Ezzel sikeresen lecseréltük a bevezetett saját kis jelölési rendszerünket. Azonban ha ilyen formában íratjuk ki a tartalmat, akkor hibás eredményt fogunk kapni, nem a kívánt végeredményt.

Ezért szükségünk van a ismét egy PHP függvényre, mégpedig az eval()-ra. Ez a függvény annyit tesz a $tartalom változónkkal, hogy a tartalmát PHP-kódként értelmezi, így a benne lévő változókat is.

1
 eval("\$tartalom = \"" . addsleshes($tartalom) . "\";");

Ezután nincs más dolgunk, mint a return $tartalom;-al a függvénynek átadni a $tartalom változó értékét.

Ezek alapján a teljes függvény (kiegészítve egy védelemmel: ha a template fájl nem létezik, nem próbálja meg megnyitni):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function load_template_file($fajlnev,$tomb) {
 
   if(file_exists($fajlnev) > 0) {
     $temp = fopen($fajlnev,"r");
     $tartalom = fread($temp, filesize($fajlnev));
     fclose($temp);
 
     $tartalom = preg_replace("/{(.*?)}/si","{\$tomb[\\1]}",$tartalom);
 
     eval("\$tartalom = \"" . addslashes($tartalom) . "\";");
 
     return $tartalom; 
 
   }
 
}

A függvény pontos használata pedig a következő:

Adott ugye egy template.tpl fájlunk a következő tartalommal:

1
2
{koszones1} Methos!
{koszones2} Tutorial.hu!

A függvényt mentsük el egy template.php fájlba. Hozzunk létre egy például egy index.php-t a következő tartalommal:

1
2
3
4
5
6
7
8
9
10
<?php
 
include("template.php"); // Függvény include-olása
 
$array = array('koszones1' => 'Szia',
               'koszones2' => 'Hello');
 
echo load_template_file("template.tpl",$array);
 
?>

(Figyelem! A kulcs-ok kis és nagybetűérzékenyek!)

Ha lefuttatjuk az index.php-t, akkor a a következő kimentet kapjuk:

Szia Methos!
Hello Tutorial.hu!

Remélem a függvény használata a fenti példából egyszerűen kiderül.

És hogyan is építsünk fel így egy oldalt?

Adott egy index.tpl fájlunk például, amiben fel van építve az oldal, és a kívánt helyen (ahová pl. a híreket szeretnénk) be van szúrva a következő:

{TARTALOM}

Ezen kívül van egy másik tpl fájlunk amelyekben a hírek vannak. Íme akkor a módosult index.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
include("template.php"); // Függvény include-olása
 
$array_hirek = array('CIM' => $hircim,
                     'SZOVEG' => $szoveg)
 
$hirek = load_template_file("hirek.tpl",$array_hirek);
 
$array = array('TARTALOM' => $hirek);
 
echo load_template_file("index.tpl",$array);
 
?>

Remélem ebből már mindenki tudja folytatni. Jah és persze a .tpl fájlok egyszerű HTML-ek, tehát bármilyen HTML kód alkalmazható benne. Ha kérdés van megtaláltok a fórumon.

5 HOZZÁSZÓLÁS

  1. Kedves Methos!

    Milyen lesz a kód, ha adatbázisból szedem az adatokat és nem tudom előre, hány köszönés lesz?

  2. Sziasztok. Nem tudom,hogy még aktuális-e a dolog,de a template kezeléssel kapcsolatban lenne kérdésem…

  3. Az nem érdekes, hogy hány köszönés van. Azért számozta be őket, mert különböznek. Ha ugyanaz, akkor természetesen a templateben is ugyanaz fogja jelölni őket. Ez csak lecseréli.

    Pl.:

    {koszon1} Sanyi
    {koszon1} Lali

    Szia Sanyi
    Szia Lali

  4. Szia, nem tudom aktuális-e még, de ezt a hibát kaptam.:

    Notice: Use of undefined constant koszones1 – assumed ‘koszones1’ in C:\xampp\htdocs\tesztek\tpl\template.php(11) : eval()’d code on line 1

    Notice: Use of undefined constant koszones2 – assumed ‘koszones2’ in C:\xampp\htdocs\tesztek\tpl\template.php(11) : eval()’d code on line 2
    Szia Methos! Hello Tutorial.hu!

  5. Sziasztok! Nekem az a probléma, hogy többszörös idézőjel, aposztróf használattal meghal a kód.

    pl: onClick=”minusOne(‘{barcode}’,'{dbszam}’);” után azt kapom, hogy nincs vége a kódnak (javascript) és így néz ki a forráskódban: onClick=”minusOne(“995… ‘,’2’);”=””

    Help please!

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét