Dar vieno analitiko svetainė

Petras Kudaras

Labai paprasti PHP šablonai

Šiandien kažkas PHP konferencijoj išreiškė mintį, kad kiekvienas save gerbiantis PHP programuotojas turi būti pasirašęs savo lankytojų skaitliuką, duomenų bazės abstrakcijos klasę ir šablonų klasę. Na, skaitliukas turbūt lengviausia :) Duomenų bazės šiokią tokią abstrakciją irgi esu rašęs, šablonus taip pat, tad turbūt galiu prisirašyti save prie tų „save gerbiančių PHP programuotojų“ ;)

Tiesa, jokiu būdu nesu šablonų ekspertas. Teko man naudotis tik pukomuko phemplate, bei savo kurtais šablonais (kurie dabar šiek tiek juokingai atrodo, mat rašiau lygiai prieš metus. Metai programavimo suteikia daug žinių ;). Vienintelis dalykas, kuris man nepatinka phemplate yra tas kad tie šablonai ganėtinai neintuityvūs ir sudėtingi naudoti (suprantu, kad tai kodo greičio sumetimais) palyginus su Perlo HTML::Template, kurią pastaruoju metu naudoju dažniausiai. Ten labai man patinka tai, kad užtenka „pririšti“ masyvą prie šablono ir visi šablono parametrai bus imami būtent iš šio masyvo. Tai labai praverčia validuojant formas: automatiškai pririši per POST gaunamų reikšmių masyvą su šablonu ir nereikia kiekvienam laukui nustatyti atskiro kintamojo. Panašiai galima padaryti ir su iš duomenų bazės gaunamais duomenimis: dvimatį iš duombazės gaunamą masyvą pririši prie šablono ciklo <LOOP> ir duomenys automagiškai susidėlioja į vietas. Aišku tam nebūtinai reikia „pririšimo“, juk galima tiesiog perduoti šablonui visą masyvą ir tiek, tačiau „pririšimas“ suteikia gana įdomių savybių, kurios galbūt kažkam gali būti labai naudingos (pirmas didelis pliusas yra greitis, kadangi perduodamas ne visas masyvas, o tik nuoroda į jį).

Žodžiu visas šitas kodas kol kas yra „proof of concept“, nes realaus pritaikymo dar nelabai sugalvojau šitam „pririšimui“ ;)

Pirmiausia pasirašiau labai primityvią šablonų klasę, kuri sugeba pakeisti tik <VAR vardas> ir išsaugojau kaip sablonas.php:

<?php
class sablonas
{
        var $out = '';
        var $vars = array();

        function sablonas($byla = 'index.html')
        {
                if(is_file($byla)) {
                        $this->out = implode('', file($byla));
                } else {
                        die("Nera tokios bylos '$byla'");
                }
        }

        function tie(&$masyvas)
        {
                $this->vars = &$masyvas;
        }

        function output()
        {
                while(($pos = strpos($this->out, '<VAR ')) !== false) {
                        $varlength = strpos($this->out, '>', $pos) - $pos;
                        $varname = substr($this->out, $pos + 5, $varlength - 5);
                        $this->out = substr($this->out, 0, $pos) . 
                                htmlspecialchars($this->vars[$varname]) . 
                                substr($this->out, $varlength + $pos + 1);
                }
                return $this->out;
        }

}
?>

Vienintelė magija čia atliekama funkcijoje tie(), kur $this->vars yra priskiriamas $masyvas adresas. Faktiškai Perle tai prilygtų typeglobų sulyginimui (**vars = masyvas). Po šio sulyginimo tiek $this->vars, tiek $masyvas rodo į tą patį įrašą simbolių lentelėje (ar kaip tas daiktas PHP vadinasi… čia gal kiek per daug Perl terminologiją taikau ;) Žodžiu esmė tame kad tie patys duomenys gali būti pasiekiami dviem vardais.

Pasirašiau paprastą šabloną index.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Pavadinimas </TITLE>
</HEAD>
<BODY>
<FORM ACTION="test.php" METHOD="POST">
<P><B>A:</B> <INPUT TYPE="TEXT" NAME="a" VALUE="<VAR a>"></P>
<P><B>B:</B> <INPUT TYPE="TEXT" NAME="b" VALUE="<VAR b>"></P>
<INPUT TYPE="HIDDEN" NAME="count" VALUE="<VAR count>">
<P><INPUT TYPE="SUBMIT"></P></FORM>
<P>Forma rodoma kartu: <VAR count></P>
</BODY>
</HTML>

O štai ir test.php:

<?php
include 'sablonas.php';
$foo =& new sablonas();
$foo->tie($_POST);
$_POST['count']++;
print $foo->output();
?>

Tas $_POST[‘count’]++ atrodytų jog vyksta jau PO masyvo perdavimo šablonui, bet šablone šie pokyčiai irgi atsispindi, mat perduodami ne duomenys, o tik nuoroda į juos. Kadangi $_POST[] surišama su šablonu, tai šablone formai be didelių vargų suteikiamos tokios reikšmės, kurios jau ir buvo perduotos.

Ech, man aišku tokiais eksperimentais pasireškia IRC trūkumas turbūt. Visiškai nenaudinga, bet bent jau man įdomu. Ir aišku nesu PHP guru – tuoj kas nors komentaruose kokį nors geresnį būdą automatiniam formų pildymui. Vat automagiškai susieti šabloną su SQL selectu būtų žymiai įdomiau ir naudingiau, bet dabar reik eit civilinės ir darbo teisės mokytis