A Smarty sablon rendszer bemutatása

26
Copyright PHP Conf., 2003, Szabó Dénes A Smarty sablon A Smarty sablon rendszer bemutatása rendszer bemutatása Szabó Dénes [email protected] Első magyarországi PHP Konferencia 2003. március 29.

description

A Smarty sablon rendszer bemutatása. Szabó Dénes [email protected] 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. - PowerPoint PPT Presentation

Transcript of A Smarty sablon rendszer bemutatása

Page 1: 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.

Page 2: A Smarty sablon rendszer bemutatása

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

Page 3: A Smarty sablon rendszer bemutatása

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?

Page 4: A Smarty sablon rendszer bemutatása

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

Page 5: A Smarty sablon rendszer bemutatá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

Page 6: A Smarty sablon rendszer bemutatása

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

Page 7: A Smarty sablon rendszer bemutatása

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)

Page 8: A Smarty sablon rendszer bemutatása

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

Page 9: A Smarty sablon rendszer bemutatása

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>

Page 10: A Smarty sablon rendszer bemutatása

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 !

Page 11: A Smarty sablon rendszer bemutatása

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

Page 12: A Smarty sablon rendszer bemutatása

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

Page 13: A Smarty sablon rendszer bemutatása

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"}

Page 14: A Smarty sablon rendszer bemutatása

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>

Page 15: A Smarty sablon rendszer bemutatása

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

Page 16: A Smarty sablon rendszer bemutatása

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.

Page 17: A Smarty sablon rendszer bemutatása

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");

Page 18: A Smarty sablon rendszer bemutatása

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 *}

Page 19: A Smarty sablon rendszer bemutatása

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&#64;$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&#64;$2', $tpl_output); return $tpl_output;}// register the outputfilter$smarty->register_outputfilter("protect_email");

$smarty->assign('email', '[email protected]' );szerverzok&#64;phpconf.huszerverzok&#64;[email protected]@phpconf.hu

Page 20: A Smarty sablon rendszer bemutatása

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>

Page 21: A Smarty sablon rendszer bemutatása

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)

Page 22: A Smarty sablon rendszer bemutatása

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

Page 23: A Smarty sablon rendszer bemutatása

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}

Page 24: A Smarty sablon rendszer bemutatása

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>

Page 25: A Smarty sablon rendszer bemutatása

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 { }

Page 26: A Smarty sablon rendszer bemutatása

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