PHP.ee
 php.ee   linuxator.com   whee 
29.07.10 / 21:53
  Artiklid
  » Algajaile
  » Andmebaasid
  » Varia
  » Graafika
  » Advanced
Logi sisse:
< nimi
< pass
Unustasid passi?
Kas eelistad võimalusel PHP koodi objektorienteeritult kirjutada?
 Jah, see teeb töö lihtsamaks
 Jah, see on lihtsalt lahe
 Nii ja naa, ei tunne erilist võitu
 Ei, mõttetu ajakulu
 Ei oska objektorienteeritult progeda
Tulemused
Liitu listiga!
Telli PHP uudiskiri
Nimi:
Email
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

O