Copyright PHP Conf., 2003, Szabó Dénes A Smarty sablon rendszer bemutatása Szabó Dénes Első magyarországi PHP Konferencia március 29.
Copyright PHP Conf., 2003, Szabó DénesTartalom Bevezető A feladat Sablon megoldások Smarty jellemzői (1) Smarty jellemzői (2) Miért jó sablon rendszert használni? Egy egyszerű példa Változó módosítók Asszociatív tömbök Indexelt tömbök használata If/elseif/then/else szerkezet Foreach Plugin rendszer Saját módosító példa Elő szűrő példa Utó szűrő példa Kimenet szűrő példa Fordításról Miért használjuk a Smarty-t? Applikációs, és megjelenítési logika Logika a sablonban Logika a sablonban (2) Érvek és ellenérvek
Copyright PHP Conf., 2003, Szabó DénesBevezető Webes alkalmazás fejlesztés Elmélet Grafikus - design, felület – HTML Programozó - feltölti a HTML-t a megfelelő programmal (business logic) Gyakorlat megrendelő változtat változik a logika, változik a megjelenés Ki dolgozik, és ki vár a másikra?
Copyright PHP Conf., 2003, Szabó Dénes A feladat Feladat: függetlenné tenni a PHP programot a megjelenítéstől Ellentmondás: a PHP „ HTML-be ágyazott szkript nyelv ” Különválasztani a megjelenítést a kódtól „ jó dolog ” (Good Thing TM ) Külön programozó, és külön grafikus alkalmazása
Copyright PHP Conf., 2003, Szabó Dénes Miért jó sablon rendszert használni? A kód és a megjelenítés szétválasztása általában külön feladat, külön ember több rétegű alkalmazások készítése (MVC modell) Tisztább, logikusabb szerkezet Biztonság (a grafikus nem fér hozzá semmiképp a kódhoz) Gyors felület csere
Copyright PHP Conf., 2003, Szabó Dénes Sablon megoldások Sablon rendszerek általában alapvető változó behelyettesítés, egyszerű tag-ek dinamikus blokk funkciók (alapvető ciklusok) minden oldal letöltéskor megtörténik a sablon értelmezése sebesség növelése: a kész, behelyettesített sablon cache-elése PHP nyelven írodott
Copyright PHP Conf., 2003, Szabó Dénes Smarty jellemzői (1) PHP nyelven íródott (PHP osztály) Nagyon gyors Nincs felesleges sablon értelmezés, csak az első lekéréskor fordítás Kiterjeszhetőség saját funkciókkal, módosítókkal Szekciók végtelen egymásba ágyazhatósága (if,foreach, section)
Copyright PHP Conf., 2003, Szabó Dénes Smarty jellemzői (2) A tag elválasztók átdefiniálhatóak ( {},, ) Beépített cache rendszer Saját cache funkciók is beilleszthetőek Többféle sablon forrás (file, db) Plugin rendszer Hatékony Egyszerű szintakszis
Copyright PHP Conf., 2003, Szabó Dénes Egyszerű változó kiíratás Egy egyszerű példa {$title} {$title} Include_once('Smarty.class.php'); define('TPL', 'file:'. APPROOT. 'template1.tpl'); $smarty = new Smarty; $smarty->assign('title', 'Hello PHP konf!' ); $smarty->display( TPL ); Include_once('Smarty.class.php'); define('TPL', 'file:'. APPROOT. 'template1.tpl'); $smarty = new Smarty; $smarty->assign('title', 'Hello PHP konf!' ); $smarty->display( TPL ); Hello PHP konf! Hello PHP konf!
Copyright PHP Conf., 2003, Szabó Dénes Változó módosítók A változó módosítók megváltoztatják a változó tartalmát {$title|upper} {$title|upper} HELLO PHP KONF! HELLO PHP KONF! {$title|spacify} H e l l o P H P k o n f ! {$title|spacify|upper} H E L L O P H P K O N F !
Copyright PHP Conf., 2003, Szabó Dénes Asszociatív tömbök Asszociatív tömbök kezelése $smarty->assign('konf', array( 'hely' => 'Budapest, Cházár A. u. 10.', 'ido' => '2003. március 29. szombat', ' ' => array( 'szervezo' => 'info' => ) ); $smarty->assign('konf', array( 'hely' => 'Budapest, Cházár A. u. 10.', 'ido' => '2003. március 29. szombat', ' ' => array( 'szervezo' => 'info' => ) ); {$konf.ido} {$konf.hely} {$konf. .szervezo} {$konf. .info} {$konf.ido} {$konf.hely} {$konf. .szervezo} {$konf. .info} március 29. szombat Budapest, Cházár A. u március 29. szombat Budapest, Cházár A. u. 10.
Copyright PHP Conf., 2003, Szabó Dénes Indexelt tömbök Indexelt tömbök kezelése $smarty->assign('konf', array( 'Budapest, Cházár A. u. 10.', '2003. március 29. szombat', array( ) ); $smarty->assign('konf', array( 'Budapest, Cházár A. u. 10.', '2003. március 29. szombat', array( ) ); {$konf[0]} {$konf[1]} {$konf[2][0]} {$konf[2][1]} {$konf[0]} {$konf[1]} {$konf[2][0]} {$konf[2][1]} Budapest, Cházár A. u március 29. szombat Budapest, Cházár A. u március 29. szombat
Copyright PHP Conf., 2003, Szabó Dénes If/elseif/then/else szerkezet Üres változónak értékadás {if $name eq "boss"} Szia Admin! {elseif $name ne ""} Szia Kedves felhasználó! {else} Még nem vagy bejelentkezve! {/if} {if $name eq "boss"} Szia Admin! {elseif $name ne ""} Szia Kedves felhasználó! {else} Még nem vagy bejelentkezve! {/if} {if $name eq ""} {assign var="name" value="Ismeretlen"} {/if} {if $name eq ""} {assign var="name" value="Ismeretlen"} {/if} {$name|default:"Ismeretlen"}
Copyright PHP Conf., 2003, Szabó DénesForeach Tömb értékek kiíratása ciklusban $smarty->assign('users', array( array('name' => 'bob', 'phone' => ' '), array('name' => 'jim', 'phone' => ' '), array('name' => 'joe', 'phone' => ' '), array('name' => 'jerry', 'phone' => ' '), array('name' => 'fred', 'phone' => ' ') )); $smarty->assign('users', array( array('name' => 'bob', 'phone' => ' '), array('name' => 'jim', 'phone' => ' '), array('name' => 'joe', 'phone' => ' '), array('name' => 'jerry', 'phone' => ' '), array('name' => 'fred', 'phone' => ' ') )); {foreach name=ulist from=$users item=user key=row} {$user.name} {$user.phone} {/foreach} {foreach name=ulist from=$users item=user key=row} {$user.name} {$user.phone} {/foreach} bob jim joe jerry fred bob jim joe jerry fred
Copyright PHP Conf., 2003, Szabó Dénes Plugin rendszer Smarty sajátosság Plugin típusok Funkciók (cycle) Módosítók (upper, capitalise) Szűrők Fordítás előtti (pre filters) Fordítás utáni (post filters) Kimeneti szűrők (output filters) A szűrőket kell csak külön betölteni
Copyright PHP Conf., 2003, Szabó Dénes Saját módosító példa Egy egyszerű példa módosító pluginre Function smarty_modifier_hu_article($string, $firstupper=FALSE) { $consonants = array( 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' ); $str =strtolower( ltrim( $string ) ); if ( $firstupper ) { $a = 'A';} else { $a= 'a';} if ( in_array( $str[0], $consonants) ) { return $a. ' '. $string; } return $a. 'z '. $string; } Function smarty_modifier_hu_article($string, $firstupper=FALSE) { $consonants = array( 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z' ); $str =strtolower( ltrim( $string ) ); if ( $firstupper ) { $a = 'A';} else { $a= 'a';} if ( in_array( $str[0], $consonants) ) { return $a. ' '. $string; } return $a. 'z '. $string; } {assign var="fiu" value="Géza"} {assign var="lany" value="Erzsébet"} {$fiu|hu_article:true} férfi név. {$lany|hu_article:true} női név. {assign var="fiu" value="Géza"} {assign var="lany" value="Erzsébet"} {$fiu|hu_article:true} férfi név. {$lany|hu_article:true} női név. A Géza férfi név. Az Erzsébet női név. A Géza férfi név. Az Erzsébet női név.
Copyright PHP Conf., 2003, Szabó Dénes Elő szűrő példa Megjegyéseket eltávolító szűrő A funkció elnevezésének kötött a szintakszisa Külön bejegyzés kell a Smartynak a funkcióról Csak egyszer végzi el a tisztázást Function _smarty_remove_dw_comments($tpl_source, &$smarty) { $pattern = array( "/ \s*?/Us", ); $item = array ( '', ); return preg_replace($pattern, $item, $tpl_source); } $smarty->register_prefilter("_smarty_remove_dw_comments"); Function _smarty_remove_dw_comments($tpl_source, &$smarty) { $pattern = array( "/ \s*?/Us", ); $item = array ( '', ); return preg_replace($pattern, $item, $tpl_source); } $smarty->register_prefilter("_smarty_remove_dw_comments");
Copyright PHP Conf., 2003, Szabó Dénes Utó szűrő példa Megjegyés beillesztése a lefordított sablonba A funkció elnevezésének kötött a szintakszisa Külön bejegyzés kell a Smartynak a funkcióról Csak egyszer végzi el a tisztázást function add_header_comment($tpl_source, &$smarty) { return " \n\" ?>\n".$tpl_source; } // register the postfilter $smarty->register_postfilter("add_header_comment"); function add_header_comment($tpl_source, &$smarty) { return " \n\" ?>\n".$tpl_source; } // register the postfilter $smarty->register_postfilter("add_header_comment"); {* a sablon többi része *} {* a sablon többi része *}
Copyright PHP Conf., 2003, Szabó Dénes Kimenet szűrő példa címek védelme A funkció elnevezésének kötött a szintakszisa Külön bejegyzés kell a Smartynak a funkcióról Minden lapletöltéskor dolgozik a szűrő Function protect_ ($tpl_output, &$smarty) { $tpl_output = preg_replace( '$1@$2', $tpl_output); return $tpl_output; } // register the outputfilter $smarty->register_outputfilter("protect_ "); $smarty->assign(' ', ); Function protect_ ($tpl_output, &$smarty) { $tpl_output = preg_replace( '$1@$2', $tpl_output); return $tpl_output; } // register the outputfilter $smarty->register_outputfilter("protect_ "); $smarty->assign(' ', ); szerverzok@phpconf.hu
Copyright PHP Conf., 2003, Szabó DénesFordításról Értelmezi a sablon állományt és lefordítja PHP kódra, de csak azt használja, ami kell Gyakorlatilag tiszta PHP fut A fordítás automatikusan történik A fordítás sablon változáskor automatikus Lefordított sablon a templates_c/ könyvtárban Csökken a szerver terheltsége Megmarad a PHP sebessége _load_plugins(array( array('function', 'assign', 'file:/mnt/cipelo/public_html/phpconf- smarty/template-outputfilter- .tpl', 8, false), array('modifier', 'hu_article', 'file:/mnt/cipelo/public_html/phpconf- smarty/template-outputfilter- .tpl', 10, false),)); ?> Smarty _plugins['function']['assign'][0](array('var' => 'fiu','value' => 'Béla'), $this) ; ?> _plugins['function']['assign'][0](array('var' => 'lany','value' => 'Erzsébet'), $this) ; ?> _run_mod_handler('hu_article', true, $this- >_tpl_vars['fiu'], true); ?> férfi név. _run_mod_handler('hu_article', true, $this- >_tpl_vars['lany'], true); ?> női név. _tpl_vars[' ']; ?> _load_plugins(array( array('function', 'assign', 'file:/mnt/cipelo/public_html/phpconf- smarty/template-outputfilter- .tpl', 8, false), array('modifier', 'hu_article', 'file:/mnt/cipelo/public_html/phpconf- smarty/template-outputfilter- .tpl', 10, false),)); ?> Smarty _plugins['function']['assign'][0](array('var' => 'fiu','value' => 'Béla'), $this) ; ?> _plugins['function']['assign'][0](array('var' => 'lany','value' => 'Erzsébet'), $this) ; ?> _run_mod_handler('hu_article', true, $this- >_tpl_vars['fiu'], true); ?> férfi név. _run_mod_handler('hu_article', true, $this- >_tpl_vars['lany'], true); ?> női név. _tpl_vars[' ']; ?>
Copyright PHP Conf., 2003, Szabó Dénes Miért használjuk a Smarty-t? Grafikus nem tud megzavarni az alkalmazás logikát Különválasztott prezentációs szint, prezentációs logika. Egyszerű új felület építés Programozónak nem kell a megjelenítéssel foglalkoznia Grafikusnak nem kell törődnie azzal, hogy az átadott tartalom hogyan jut el a sablonba Nincs lehetőség a szerveren nem ellenőrzött kód futtatására (biztonság)
Copyright PHP Conf., 2003, Szabó Dénes Applikációs, és megjelenítési logika A kód szétválasztás nem jelenti a logika szétválasztását is! Külön megjelenítési logika (táblázat sor színek) A megjelenítési logika az, amivel a programozónak nem kell törődnie A programozó átadja a tartalmat a megjelenítési rétegnek Sablon tartalmazza a megjelenítési logikát
Copyright PHP Conf., 2003, Szabó Dénes Logika a sablonban A logika szétválasztás nem jelenti azt, hogy nem lehet alkalmazás logika a kódban rossz megoldás Applikációs kód, döntések a grafikusnál jó megoldás döntés belül történik az alkalmazásban {if $smarty.session.user and ( $editor_flag eq "Y" or $user_type eq "admin" )} {/if} {if $smarty.session.user and ( $editor_flag eq "Y" or $user_type eq "admin" )} {/if} {if $display_edit_section } {/if} {if $display_edit_section } {/if}
Copyright PHP Conf., 2003, Szabó Dénes Logika a sablonban, saját funkciók Saját funkciókkal le lehet egyszerüsíteni a grafikus dolgát Változik a kód, de nem változik a sablon Változott a hivatkozás {html_link type="article" id="artcl123" text="Ugrás a címlapra"} Ugrás a címlapra {html_link type="article" id="artcl123" text="Ugrás a címlapra"} Ugrás a címlapra {html_link type="article" id="artcl123" text="Ugrás a címlapra"} Ugrás a címlapra {html_link type="article" id="artcl123" text="Ugrás a címlapra"} Ugrás a címlapra
Copyright PHP Conf., 2003, Szabó Dénes Érvek és ellenérvek Miért használjam? {$title}, jobb mint az A sablon értelmezése lassítja a programot Túl bonyolult a használata Miért tanuljak meg még egy nyelvet (YAL) Bonyolult több állományt karbantartani Az szerkesztőm nem támogatja a Smarty-t, nem tetszik a { }
Copyright PHP Conf., 2003, Szabó Dénes Köszönöm Szabó Dénes Első magyarországi PHP Konferencia március 29. A Smarty sablon rendszer bemutatása