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

10 Comments

  1. Ne, nu tu pavarai, o tai ką čia tokio naujo parodei?

    <form method=post>

    <input type=text name="a" value="{forma.a}>

    <input type=text name="a" value="{forma.b}>

    <input type=text name="a" value="{forma.c}>

    <input type=submit>

    </form>

    Su phemplate tuomet:

    <?php

    $tpl=&new phemplate("./","remove_nonjs"); //berods taip antras flagas

    $tpl->set_file('sablonas','sablonas.html');

    $tpl->set_var('forma',$_POST);

    echo $tpl->process('','sablonas');

    ?>

    Ir gausi ta pati Š be jokių papildomų klasių, o kad užpildyti vieną formą, tai manau čia greičio reikia tai… :)))

    Gi ne google.lt ar yahoo.com darai :)

  2. hehe, jo, taigi sakiau kad čia šiaip sau darausi eksperimentuodamas ;)

    Realiai tai ten aš dėl referencų viską dariau, čia tas masyvas formai buvo lyg nevykęs bandymas pateisint savo pusvalandžio darbą ;)

  3. nu as pamasciau teorishkai gi nieks netrukdo ir ant phemplate su referencais daryti, galbut sekancioje versijoje taip ir bus. :)

  4. Vienintelė problemą, kurią matau su referencais yra ta kad gali nesinorėt teršt tų spec. masyvų $_POST ir panašių su tarpiniais templeitų handlais, kurie neišvengiamai atsiranda kai parsini ciklus ir t.t.

    Anyway, reiktų miegučio eit ;)

  5. moxliuk,

    na kiek gi galima rašyti apie PHP?!

    geriau rašytum apie Perla ir bandytum atvesti liaudi į tikrąjį kelią. ;)

  6. aciu moksliuk uz tavo straipsniuka – lameris (spekit kas) suprato kas yra sablonizatorius:)

  7. moxliuk, nebuk kiaule,

    per 3 dienas tik vienas straipsnis.

    nebuk uzsispaudes ir dalinkis ispudziais su visuomene.

  8. aha, nes ateini ir tas pats.. vel ateini vel tas pats… ar tau gal yra belekokia nauda is to kad parodymu daugiau, nes vistiek dazbiau tikrinu ir galvoju, gal jau ka parase :)

  9. Haha, pasirodo ne vien prie IRC priprantama, bet ir prie moxliuko sapaliojimų programavimo srityje ;)

    Na nieko, antradienį paskutinis egzas, po to bus daugiau laiko ir prie programavimo ir prie svetainės pasėdėt ;)

    Pažadu ;)

Comments are closed.