260 likes | 453 Views
A Smarty sablon rendszer bemutatása. Szabó Dénes szabo.denes@internode.hu Első magyarországi PHP Konferencia 2003. március 29. Tartalom. Foreach. Bevezető. A feladat. Plugin rendszer. Saját módosító példa. Miért jó sablon rendszert használni?. Elő szűrő példa. Utó szűrő példa.
E N D
A Smarty sablonrendszer bemutatása Szabó Dénes szabo.denes@internode.hu Első magyarországi PHP Konferencia 2003. március 29.
Tartalom Foreach Bevezető A feladat Plugin rendszer Saját módosító példa Miért jó sablon rendszert használni? Elő szűrő példa Utó szűrő példa Sablon megoldások Kimenet szűrő példa Smarty jellemzői (1) Fordításról Smarty jellemzői (2) Miért használjuk a Smarty-t? Egy egyszerű példa Applikációs, és megjelenítési logika Változó módosítók Asszociatív tömbök Logika a sablonban Indexelt tömbök használata Logika a sablonban (2) Érvek és ellenérvek If/elseif/then/else szerkezet
Bevezető 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?
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 ThingTM) • Külön programozó, és külön grafikus alkalmazása
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
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
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)
Smarty jellemzői (2) • A tag elválasztók átdefiniálhatóak ( {}, <{ }>, <smarty: > ) • 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
Egy egyszerű példa • Egyszerű változó kiíratás Include_once('Smarty.class.php'); define('TPL', 'file:' . APPROOT . 'template1.tpl'); $smarty=new Smarty; $smarty->assign('title', 'HelloPHPkonf!' ); $smarty->display( TPL ); <html><head></head> <body> {$title} </body> </html> <html><head></head> <body> Hello PHP konf! </body> </html>
Változó módosítók • A változó módosítók megváltoztatják a változó tartalmát <html> <body> {$title|upper} </body> </html> <html><head></head> <body> HELLO PHP KONF! </body></html> {$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 !
Asszociatív tömbök • Asszociatív tömbök kezelése $smarty->assign('konf',array( 'hely'=>'Budapest,CházárA.u.10.', 'ido'=>'2003.március29.szombat', 'email'=>array( 'szervezo'=>'szervezok@phpconf.hu', 'info'=>'info@phpconf.hu' ) ) ); {$konf.ido}<br> {$konf.hely}<br> {$konf.email.szervezo}<br> {$konf.email.info}<br> 2003. március 29. szombat Budapest, Cházár A. u. 10. szervezok@phpconf.hu info@phpconf.hu
Indexelt tömbök • Indexelt tömbök kezelése $smarty->assign('konf',array( 'Budapest,CházárA.u.10.', '2003.március29.szombat', array( 'szervezok@phpconf.hu', 'info@phpconf.hu' ) ) ); {$konf[0]}<br> {$konf[1]}<br> {$konf[2][0]}<br> {$konf[2][1]}<br> Budapest, Cházár A. u. 10. 2003. március 29. szombat szervezok@phpconf.hu info@phpconf.hu
If/elseif/then/else szerkezet • If/elseif/then/else szerkezet • Üres változónak értékadás {if$nameeq"boss"} Szia Admin! {elseif$name ne""} Szia Kedves felhasználó! {else} Még nem vagy bejelentkezve! {/if} {if$nameeq""} {assign var="name" value="Ismeretlen"} {/if} {$name|default:"Ismeretlen"}
Foreach <table> <tr bgcolor="#EEEEEE"> <td>bob</td> <td>555-3425</td> </tr> <tr bgcolor="#E8E8E8"> <td>jim</td> <td>555-4364</td> </tr> <tr bgcolor="#EEEEEE"> <td>joe</td> <td>555-3422</td> </tr> <tr bgcolor="#E8E8E8"> <td>jerry</td> <td>555-4973</td> </tr> <tr bgcolor="#EEEEEE"> <td>fred</td> <td>555-3235</td> </tr> </table> • Tömb értékek kiíratása ciklusban $smarty->assign('users',array( array('name'=>'bob','phone'=>'555-3425'), array('name'=>'jim','phone'=>'555-4364'), array('name'=>'joe','phone'=>'555-3422'), array('name'=>'jerry','phone'=>'555-4973'), array('name'=>'fred','phone'=>'555-3235') )); {foreachname=ulistfrom=$usersitem=userkey=row} <trbgcolor="{cyclevalues="#EEEEEE,#E8E8E8"}"> <td>{$user.name}</td> <td>{$user.phone}</td> </tr> {/foreach}
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
Saját módosító példa • Egy egyszerű példa módosító pluginre Functionsmarty_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; } {assignvar="fiu"value="Géza"} {assignvar="lany"value="Erzsébet"} {$fiu|hu_article:true} férfi név.<br> {$lany|hu_article:true} női név.<br> A Géza férfi név. Az Erzsébet női név.
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*?(#|InstanceBegin)*.*-->\s*?/Us", ); $item=array ( '', ); returnpreg_replace($pattern,$item,$tpl_source); } $smarty->register_prefilter("_smarty_remove_dw_comments");
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 "<?php echo \"<!-- Created by Smarty! -->\n\" ?>\n".$tpl_source; } // register the postfilter $smarty->register_postfilter("add_header_comment"); <!-- Created by Smarty! --> {* a sablon többi része *}
Kimenet szűrő példa • E-mail 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ő Functionprotect_email($tpl_output, &$smarty) { $tpl_output= preg_replace( '!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!','$1@$2',$tpl_output); return$tpl_output; } //registertheoutputfilter $smarty->register_outputfilter("protect_email"); $smarty->assign('email','szerverzok@phpconf.hu' ); szerverzok@phpconf.hu szerverzok@phpconf.hu
Fordításról <?php$this->_load_plugins(array( array('function','assign','file:/mnt/cipelo/public_html/phpconf-smarty/template-outputfilter-email.tpl',8,false), array('modifier','hu_article','file:/mnt/cipelo/public_html/phpconf-smarty/template-outputfilter-email.tpl',10,false),));?><html> <head> <title>Smarty</title> <metahttp-equiv="Content-Type"content="text/html;charset=iso-8859-2"> </head> <body> <table> <?phpecho$this->_plugins['function']['assign'][0](array('var'=>'fiu','value'=>'Béla'),$this) ;?> <?phpecho$this->_plugins['function']['assign'][0](array('var'=>'lany','value'=>'Erzsébet'),$this) ;?> <?phpecho$this->_run_mod_handler('hu_article',true,$this->_tpl_vars['fiu'],true);?> férfi név.<br> <?phpecho$this->_run_mod_handler('hu_article',true,$this->_tpl_vars['lany'],true);?> női név.<br> <?phpecho$this->_tpl_vars['email'];?> </table> </body> </html> • É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
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)
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
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" )} <!-- editor HTML részek --> {/if} {if $display_edit_section } <!-- editor HTML részek --> {/if}
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"} <a href="/display_article.php?id=artcl123">Ugrás a címlapra</a> {html_link type="article" id="artcl123" text="Ugrás a címlapra"} <a href="/artcl/123">Ugrás a címlapra</a>
Érvek és ellenérvek • Miért használjam? {$title}, <smarty: $title> jobb mint az <?php echo $title;> • 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 { }
A Smarty sablon rendszer bemutatása Köszönöm Szabó Dénes szabo.denes@internode.hu Első magyarországi PHP Konferencia 2003. március 29.