A Smarty sablon rendszer bemutatása
description
Transcript of A Smarty sablon rendszer bemutatása
Copyright PHP Conf., 2003, Szabó Dénes
A Smarty sablonA Smarty sablonrendszer bemutatásarendszer bemutatása
Szabó Dé[email protected]
Első magyarországi PHP Konferencia2003. március 29.
Copyright PHP Conf., 2003, Szabó Dénes
TartalomTartalom
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
ForeachPlugin rendszerSaját módosító példaElő szűrő példaUtó szűrő példaKimenet szűrő példaFordításrólMiért használjuk a Smarty-t?Applikációs, és megjelenítési logikaLogika a sablonbanLogika a sablonban (2)Érvek és ellenérvek
Copyright PHP Conf., 2003, Szabó Dénes
Bevezető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?
Copyright PHP Conf., 2003, Szabó Dénes
A feladatA 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
Copyright PHP Conf., 2003, Szabó Dénes
Miért jó sablon rendszert használni?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ásokSablon 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)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)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
Copyright PHP Conf., 2003, Szabó Dénes
Egyszerű változó kiíratás
Egy egyszerű példaEgy egyszerű példa
<html><head></head><body>{$title}</body></html>
<html><head></head><body>{$title}</body></html>
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 );
<html><head></head><body>Hello PHP konf!</body></html>
<html><head></head><body>Hello PHP konf!</body></html>
Copyright PHP Conf., 2003, Szabó Dénes
Változó módosítókVá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><body>{$title|upper}</body></html>
<html><head></head><body>HELLO PHP KONF!</body></html>
<html><head></head><body>HELLO PHP KONF!</body></html>
{$title|spacify}{$title|spacify} H e l l o P H P k o n f !H e l l o P H P k o n f !
{$title|spacify|upper}{$title|spacify|upper} H E L L O P H P K O N F !H E L L O P H P K O N F !
Copyright PHP Conf., 2003, Szabó Dénes
Asszociatív tömbökAsszociatí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', 'email' => array( 'szervezo' => '[email protected]', 'info' => '[email protected]' ) ));
$smarty->assign('konf', array( 'hely' => 'Budapest, Cházár A. u. 10.', 'ido' => '2003. március 29. szombat', 'email' => array( 'szervezo' => '[email protected]', 'info' => '[email protected]' ) ));
{$konf.ido}<br>{$konf.hely}<br>{$konf.email.szervezo}<br>{$konf.email.info}<br>
{$konf.ido}<br>{$konf.hely}<br>{$konf.email.szervezo}<br>{$konf.email.info}<br>
2003. március 29. szombatBudapest, Cházár A. u. [email protected]@phpconf.hu
2003. március 29. szombatBudapest, Cházár A. u. [email protected]@phpconf.hu
Copyright PHP Conf., 2003, Szabó Dénes
Indexelt tömbökIndexelt 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( '[email protected]', '[email protected]' ) ));
$smarty->assign('konf', array( 'Budapest, Cházár A. u. 10.', '2003. március 29. szombat', array( '[email protected]', '[email protected]' ) ));
{$konf[0]}<br>{$konf[1]}<br>{$konf[2][0]}<br>{$konf[2][1]}<br>
{$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. [email protected]@phpconf.hu
Budapest, Cházár A. u. 10.2003. március 29. [email protected]@phpconf.hu
Copyright PHP Conf., 2003, Szabó Dénes
If/elseif/then/else szerkezetIf/elseif/then/else szerkezet
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"}{$name|default:"Ismeretlen"}
Copyright PHP Conf., 2003, Szabó Dénes
ForeachForeach
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')));
$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')));
{foreach name=ulist from=$users item=user key=row} <tr bgcolor="{cycle values="#EEEEEE,#E8E8E8"}"> <td>{$user.name}</td> <td>{$user.phone}</td> </tr>{/foreach}
{foreach name=ulist from=$users item=user key=row} <tr bgcolor="{cycle values="#EEEEEE,#E8E8E8"}"> <td>{$user.name}</td> <td>{$user.phone}</td> </tr>{/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>
<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>
Copyright PHP Conf., 2003, Szabó Dénes
Plugin rendszerPlugin 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éldaSaját módosító példa
Egy egyszerű példa módosító pluginreFunction 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.<br>{$lany|hu_article:true} női név.<br>
{assign var="fiu" value="Géza"}{assign var="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.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éldaElő 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 ( '', ); 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*?(#|InstanceBegin)*.*-->\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éldaUtó 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");
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 *}<!-- Created by Smarty! -->{* a sablon többi része *}
Copyright PHP Conf., 2003, Szabó Dénes
Kimenet szűrő példaKimenet 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őFunction protect_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;}// register the outputfilter$smarty->register_outputfilter("protect_email");
$smarty->assign('email', '[email protected]' );
Function protect_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;}// register the outputfilter$smarty->register_outputfilter("protect_email");
$smarty->assign('email', '[email protected]' );szerverzok@phpconf.huszerverzok@[email protected]@phpconf.hu
Copyright PHP Conf., 2003, Szabó Dénes
FordításrólFordí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
<?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><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><table><?php echo $this->_plugins['function']['assign'][0](array('var' => 'fiu','value' => 'Béla'), $this) ; ?><?php echo $this->_plugins['function']['assign'][0](array('var' => 'lany','value' => 'Erzsébet'), $this) ; ?><?php echo $this->_run_mod_handler('hu_article', true, $this->_tpl_vars['fiu'], true); ?> férfi név.<br><?php echo $this->_run_mod_handler('hu_article', true, $this->_tpl_vars['lany'], true); ?> női név.<br><?php echo $this->_tpl_vars['email']; ?></table></body></html>
<?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><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><table><?php echo $this->_plugins['function']['assign'][0](array('var' => 'fiu','value' => 'Béla'), $this) ; ?><?php echo $this->_plugins['function']['assign'][0](array('var' => 'lany','value' => 'Erzsébet'), $this) ; ?><?php echo $this->_run_mod_handler('hu_article', true, $this->_tpl_vars['fiu'], true); ?> férfi név.<br><?php echo $this->_run_mod_handler('hu_article', true, $this->_tpl_vars['lany'], true); ?> női név.<br><?php echo $this->_tpl_vars['email']; ?></table></body></html>
Copyright PHP Conf., 2003, Szabó Dénes
Miért használjuk a Smarty-t?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 logikaAppliká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 sablonbanLogika 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 $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}
{if $display_edit_section }<!-- editor HTML részek -->
{/if}
Copyright PHP Conf., 2003, Szabó Dénes
Logika a sablonban, saját funkciókLogika 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 sablonVá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="/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>
{html_link type="article" id="artcl123" text="Ugrás a címlapra"}
<a href="/artcl/123">Ugrás a címlapra</a>
Copyright PHP Conf., 2003, Szabó Dénes
Érvek és ellenérvekÉ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 { }
Copyright PHP Conf., 2003, Szabó Dénes
KöszönömKöszönöm
Szabó Dé[email protected]
Első magyarországi PHP Konferencia2003. március 29.
A Smarty sablon rendszer A Smarty sablon rendszer bemutatásabemutatása