 |
|
 |
Templeidid
Anti Veeranna
Templeitide kasutamine võimaldab hoiduda konstruktsioonidest:
PHP kood:
print "<table border=\"0\" width="\100%\"><tr><td
class=\"line1\">$name</td></tr><tr><td
class=\"line2\">$surname</td></tr></table>";
ja paigutada kogu HTML eraldi faili, mis oleks näiteks sellise sisuga:
<table border="0" width="100%"> <tr> <td class="line1"> {VAR:name} </td> </tr> <tr> <td class="line2"> {VAR:name} </td> </tr> </table>
Miks templeidid kasulikud on?
1) Kood ja disain on lahus. 2) Kood (ja HTML) näeb parem välja
Kui programeerja ja kujundaja on 2 eri isikut, siis saab kumbki keskenduda oma tööle: 1) programmeerija saab oma aega maksimaalselt ära kulutada parema koodi loomiseks 2) kujundaja saab luua või muuta disaini, ilma et peaks seejuures programeerijat segama või - mis veel hullem - koodi kirjutamise süntaksi omandama.
Et lühemate skriptijuppide juures on tavaliselt ikkagi lihtsam kirjutada html ja php kood segamini, siis vaatleme siinkohal templeitide kasutamist ühe primitiivse külalisteraamatu näitel.
Meil on kaks faili templeitidega.
Esimene neist - guestbook.tpl - sisaldab külalisteraamatu "raami", ehk päist ja jalust koos pealkirja, uue kommentaari lisamise vormi ja muude kujunduselementidega.
Teine fail - entry.tpl - sisaldab ühe külalisteraamatusse jäetud teate sisestamiseks vajalikku kujundust - iga sissekanne kuvatakse seda faili kasutades, tulemus liidetakse kokku ja paigutatakse raamtempleidi sisse.
Templeidifailid on sisult enam-vähem tavalised HTML failid, mis sisaldavad mõningaid spetsiaalseid tage kujul {VAR:muutuja}, mille asemele allpool vaadeldav kood paigutab vajalikud andmed.
template.php sisaldab funktsioone, mis faili sisse loevad, selles muutujad asendavad ja tulemuse väljastavad.
PHP kood:
<?php
// template.php - algelised templeitide kasutamise funktsioonid
// Autor: Anti Veeranna (duke@struktuur.ee)
// read_template - loeb templeidifaili ja tagastab selle sisu
// $path(string) - kataloog, kust faili otsida
// $filename(string) - faili nimi, mida lugeda
function read_template($path,$filename)
{
// proovime templeidifaili sisu kätte saada ja selle stringi
// paigutada.
$source = join("",file($path . "/" . $filename));
// kui muutuja pikkus on 0, siis ilmselt templeidi lugemine ei õnnestunud,
// katkestame programmi töö
if (strlen($source) == 0)
{
die("Templatefaili ei õnnestud avada!");
};
// tagastame source
return $source;
};
// parse_template - asendab muutujas (mis nüüd sisaldab templeidifaili sisu) tagid nende
// väärtustega
// $source(string) - templeidi sisu (näiteks read_templeidi tulemus)
// $vars(array) - massiiv muutujatest ja nende väärtustest
function parse_template($source,$vars)
{
// kontrollime, kas $vars argument on ikka array
if (is_array($vars))
{
// tsükkel üle $vars kõigi elementide
foreach($vars as $key => $value)
{
// moodustame tagi nime. Kui $key väärtuseks on näiteks "name",
// siis tagi nimeks saab "{VAR:name}"
$tag = "{VAR:" . $key . "}";
// asendame tagi tema väärtusega
$source = str_replace($tag,$value,$source);
};
};
// tagastame $source, kus tagid on nüüd juba nende väärtustega asendatud
return $source;
}
?>
guestbook.php - põhiprogramm, loeb teated messages.txt failist ja kuvab need.
PHP kood:
<?php
// guestbook.php - algeline templeite kasutav külalisteraamat
// Autor: Anti Veeranna (duke@struktuur.ee)
// defineerime mõned muutujad
// külalisteraamatu pealkiri
$title = "Külalisteraamat";
// siia kirjuta selle kataloogi nimi, kus Sinul kõik need failid asuvad
$dir = "/home/duke/dweb/public/pub/template";
// siia salvestame sissekanded. Sellele failile pead andma piisavalt õigusi,
// et veebiserver (PHP) sellesse kirjutada saaks.
$msgfile = "messages.txt";
// -------- siit algab programm ise ---------------
// loeme sisse templeitide käsitlemiseks vajalikud funktsioonid
include("template.php");
// loeme teated sisse, arraysse
$messages = file($msgfile);
// teate kuvamiseks vajalik templeit
$message_tpl = read_template($dir,"entry.tpl");
// sellesse muutujase salvestame parsitud teated
$msgs = "";
// seda kasutame teadete parsimisel arve pidamiseks, kas parajasti loetava rea puhul on tegemist uue teate algusega
$new_msg = 1;
// tsükkel üle kõigi teadete
foreach($messages as $line)
{
// eemaldame reavahetuse rea lõpust
$line = rtrim($line);
// uus teade käsil, nullime kõik sisumuutujad.
if ($new_msg == 1)
{
// andmed, mis teate seest tulevad
$vars = array();
// mitmes rida teate algusest käsil on?
$linenum = 0;
// flag maha
$new_msg = 0;
};
// kui real oli sissekannete eraldaja, siis parsime ühe sissekande ära
if ($line == "---###---")
{
$msgs .= parse_template($message_tpl,$vars);
// järgmisel real hakkab kõik otsast peale
$new_msg = 1;
}
else
{
$linenum++;
switch($linenum)
{
// nimi
case 1:
$vars["name"] = $line;
break;
// epost
case 2:
$vars["email"] = $line;
break;
// time
case 3:
$vars["date"] = date("d-m-Y H:i",$line);
break;
// teade
default:
$vars["message"] .= $line . "\n";
};
};
};
// loeme saidi raami
$frame_tpl = read_template($dir,"guestbook.tpl");
// moodustame muutujatest array parse_template jaoks
$vars = array("msgs" => $msgs, "title" => $title);
// parsime saidi raami
$site_html = parse_template($frame_tpl,$vars);
// ja lõpuks väljastame kogu värgi
print $site_html;
// THE END
?>
post.php - kutsutakse välja guestbook.php väljastatud teate lisamise vormist, teostab mõned lihtsamad kontrollid ja nende läbimisel lisab uue teate külalisteraamatusse.
PHP kood:
<?php
// post.php - Lisab uue teate külalisteraamatusse
// Autor: Anti Veeranna (duke@struktuur.ee)
extract($HTTP_POST_VARS);
$msgfile = "messages.txt";
//eemaldame HTML jm sodi, mis pahatahtlik tegelane võib sisestada
$name = strip_tags($name);
$email = strip_tags($email);
$message = strip_tags($message);
// kui kasutaja sisestas nime ja teade on vähemalt 5 märki pikk, siis
lisame
// selle külalisteraamatusse
if ( $name && (strlen($message) > 5) )
{
// avame teadete faili lisamiseks
$fp = fopen($msgfile,"a+");
// fail lukku, et kaks protsessi samal ajal kirjutada ei saaks
flock($fp,LOCK_EX);
fwrite($fp,$name . "\n");
fwrite($fp,$email . "\n");
// ajana kasutame timestampi
fwrite($fp,time() . "\n");
fwrite($fp,$message . "\n");
// teadete eraldaja
fwrite($fp,"---###---\n");
// faili kinni
fclose($fp);
};
// suuname kasutaja tagasi külalisteraamatusse
// selline suunamine välistab ka sama teate uuesti postitamist brauseri reloadi vajutades
header("Location: guestbook.php");
?>
Ja see ongi kõik. Töötamas saab seda külalisteraamatut näha siin: http://duke.struktuur.ee/pub/template/guestbook.php
Kõiki faile sisaldava ZIP faili saab tõmmata siit.
Kui soovid seda külalisteraamatut täiendada, siis siin on mõned ideed, mille teostamist võiks proovida: 1) sissekanded üle ühe teise taustavärviga kuvada 2) uuemad sissekanded külalisteraamatu algusse 3) teate lisamise vorm eraldi lehel 4) sissekannete lehtedeks jaotamine ( 1 2 3 next>> ) 5) teate jätja IP aadressi salvestamine
Ka templeidifunktsioone on võimalik edasi arendada, näiteks lisada talle ühes failis asuvate alamtempleitide toetuse - see oleks siis mingi tekstiblokk, mida korratakse vastavalt vajadusele.
Loodetavasti andis see artikkel Sulle uusi põnevaid ideid :)
-- Anti duke@struktuur.ee
Artikli kommentaarid
|