| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Aika simppeli template engine (ASTE)empty 13.05.04 13:30 Yksinkertainen template engine, jonka tarkoitus on erottaa käyttöliittymä ja sovelluslogiikka toisistaan. (lisätty cache-ominaisuus))
<?php /** * Template * @file Template_class.php * @author Jaakko S * @version 0.2 * @access public **/ class Template{ var $_muuttujat; var $_cached; var $_cachedir; function Template(){ $this->_muuttujat=array(); $this->_cached = false; $this->_cachedir = 'cache/'; } /** * Asettaa cachen päälle/pois * **/ function setCached($arvo=false){ $this->_cached = $arvo; } function isCached(){ return $this->_cached; } /** * Asettaa hakemiston johon kakutetut templatet tallennetaan. * **/ function setCachedir($arvo){ if (strlen(strrchr($arvo,'/'))!=1) { $arvo .= '/'; } $this->_cachedir = $arvo; } /** * Tyhjentää cachen, eli poistaa kaikki cache päätteiset tiedostot * $this->_cachedir muuttujan määrittelemästä hakemistosta **/ function tyhjenna_cache(){ if (is_dir($this->_cachedir)) { if ($d = opendir($this->_cachedir)) { while (($f = readdir($d)) !== false) { //Poistetaan ainoastaan tiedostot joiden pääte on .cache if (is_file($this->_cachedir.$f) && substr($f, strrpos($f, '.') + 1)=='cache') unlink($this->_cachedir.$f); } closedir($d); } } } /** * * Tallentaa parametrina annetun muuttujan templaten muuttujataulukkoon. * $arvo parametri voi olla mikä tahansa muuttuja, taulukko tai olio. * $nimi on templatelle näkyvä muuttujan nimi * **/ function aseta_muuttuja($arvo,$nimi){ $this->_muuttujat[$nimi]=$arvo; } /** * * Lisää parametrina annetun taulukon alkiot templaten muuttujataulukkoon. * **/ function aseta_muuttujat_taulukkona($taulukko){ $this->_muuttujat = array_merge($this->_muuttujat,$taulukko); } /** * * Käy läpi muuttujataulukon rekursiivisesti ja muuntaa mahdolliset erikoismerkit html-entiteeteiksi. * **/ function muunna_erikoismerkit(){ function magic_entities($element){ if (is_array($element)){ return array_map("magic_entities", $element); } elseif (is_object($element)){ $jasenet = get_object_vars($element); foreach($jasenet as $nimi => $arvo ){ if (is_string($element->$nimi)) { $element->$nimi = htmlentities($arvo); } } return $element; } else{ return htmlentities($element); } } $this->_muuttujat = array_map("magic_entities", $this->_muuttujat); } /** * * Suorittaa/tulostaa parametrina annetun templatetiedoston. * Jos cache on päällä ensimmäisellä kerralla tallennetaan template cacheen * Ja seuraavilla kerroilla käytetään cachesta löytynyttä templatea **/ function suorita($template){ // Tähän voidaan listätä funktiokirjastoja jotka halutaan templatetiedostojen käyttöön. // require_once(html_generointi.inc.php'); if ($this->_cached) { $cachetemplate = $this->_cachedir.basename($template).'.cache'; if (file_exists($cachetemplate)) { require_once($cachetemplate); return; } else{ extract($this->muuttujat,EXTR_REFS); ob_start(); require_once($template); $f = fopen($cachetemplate,'w'); fwrite($f, ob_get_flush()); fclose($f); return; } } extract($this->_muuttujat,EXTR_REFS); require_once($template); } } ?> ************** ESIMERKKI ***************** (jossa ei ole mitään järkeä) <?php require_once('template_class.php'); $t =& new Template(); $taulukko = array('1' => 'yksi','2' => 'kaksi','3'=> 'kolme','4'=> 'neljä'); $olio->muuttuja = 'Tähän erikoismerkkejä <textarea> </textarea>'; //Alustetaan muuttujat templatelle $t->aseta_muuttuja('oletusarvo','syote'); $t->aseta_muuttuja($olio,'olio'); $t->aseta_muuttuja('Otsikkohan tämä','otsikko'); $t->aseta_muuttuja($taulukko,'numerot'); //Jos syöte on 'testi' muutetaan otsikkoa if (isset($_POST['syote']) && $_POST['syote'] == 'testi') { $t->aseta_muuttuja('Näin se homma etenee.','otsikko'); }else{ //Muuten jätetään arvo entiselleen. $t->aseta_muuttujat_taulukkona($_POST); //Kaikki POST taulukon muuttujat templaten käyttöön. } $t->muunna_erikoismerkit(); //Muunnetaan html-entiteetit $t->suorita('esimerkki.tpl.php'); ?> ********** TEMPLATE TIEDOSTO ************* esimerkki.tpl.php <HTML> <HEAD> <TITLE><?=$otsikko?></TITLE> </HEAD> <BODY> <h2><?=$otsikko?></h2> <?php foreach($numerot as $numero){ ?> <br><?=$numero ?> <?php } ?> <br> <br> <?=$olio->muuttuja?> <FORM action="<?=$_SERVER['PHP_SELF']?>" method="post"> Arvo tulee POST taulukosta: <INPUT type="text" name="syote" value="<?=$syote?>"/> <INPUT type="submit" name="laheta" value="Laheta" /> </FORM> </BODY> </HTML> ctrl+alt+del 19:45 13.5.04 Mikäs template engine tämä oikein on missä on php-koodia html:n seassa? Templaten idea on nimenomaan ERISTÄÄ html ja php erilleen. Siis ei sanaakaan php:tä html:n seassa eikä ainuttakaan print-funktiota php:ssä. Nyt tämä toteutuu vain puolittain. empty 20:35 13.5.04 Tämä on mielipide kysymys. Omasta mielestäni templatejen tarkoitus on eristää käyttöliittymä ja muu sovelluslogiikka toisistaan, eikä php ja html. Veikkaan että teidänkin templatesysteemissänne on jonkinlaisia ohjausrakenteita html:n seassa. Onko siinä nyt sitten niin iso ero, onko ne kirjoitettu PHP:lla vai jollain itse keksityllä syntaksilla. ctrl+alt+del 21:14 13.5.04 Miksi html:n sekaan pitäisi kirjoittaa ohjausrakenteita? Siellä on vain tietyillä merkkipareilla erotettuja avainsanoja, jotka toimivat php:n puolella globaalin arrayn avaimina. Kyse on aivan perinteisestä stringien parsinnasta, jossa etsitään ensin noita merkkipareja (tagipari) ja löydettäessä korvataan merkkijono toisella. Mutta tuossa olet oikeassa, mielipiteistä on aivan turha lähteä taittamaan peistä, kaikki saavat tehdä kuten parhaalta tuntuu. empty 11:47 14.5.04 Stringien parsintaan ne Smartyt sun muutkin perustuu. Mutta noilla ohjausrakenteilla tarkoitan sitä, että joskus on kätevää saada templateenkin jonkinlaista logiikkaa, esim. dynaamisia taulukoita tulostettaessa. Smartyynhan on kehitetty oma syntaksinsa tälläisiä tilanteita varten, joka on mielestäni aika typerää kun PHP:lla voi tehdä saman. esim. Smarty: {include file="header.tpl"} php: <?php include("header.tpl") ?> tai {section name=id loop=$nimet} id: {$nimet[id]}<br> {/section} <?php foreach($nimet as $nimi){ ?> id:<?=$nimi ?> <br /> <?php } ?> editoitu: 15:48 4.7.04 maddell 15:46 4.7.04 Mielestäni tämä on juuri paras tapa tehdä template systeemejä. Eli siis se että tpl filet on php:tä. En tiedä onko koodinkirjoittaja ikinä kuullut Savant:ista. Tekee juuri saman ja on vielä parempi. Käytän itse sitä ja on muuten paljon nopeempi kuin Smarty. No joo mutta kattokaa ihmeessä http://phpsavant.com/. Tarkoitushan on juuri "separate business logic from display logic". EDIT: Se täytyy vielä sanoa että en tykkää cachettamisesta eikä Savantinkan tarkotus ole cachettaa. Ezku 21:39 14.6.05 Äh. Meinasin sanoa jotain viisasta, mutta JaskaS ja maddell hoitivatkin sen puolestani. JaskaS, mitäs jos pistäisit esille MVC-esimerkin, se ActionController-juttusi näytti mielenkiintoiselta (<SitePoint). Kaksois-W 23:36 26.9.05 Onko tää sama kuin php:n Smarty? Siis tekeekö tämä samaa? http://smarty.php.net/ |
![]() Haku
|