{"id":226,"date":"2011-05-20T19:39:26","date_gmt":"2011-05-20T17:39:26","guid":{"rendered":"http:\/\/localhost\/blog\/?p=226"},"modified":"2012-12-29T22:23:14","modified_gmt":"2012-12-29T21:23:14","slug":"smarty-separiamo-la-presentazione-dal-contenuto","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=226","title":{"rendered":"Smarty: separiamo la presentazione dal contenuto"},"content":{"rendered":"<p>Uno dei peggiori difetti di PHP (se non il peggiore) \u00e8 senz&#8217;altro la mancanza di separazione del codice PHP da quello HTML, quindi da presentazione e contenuti. Le soluzioni sono varie e una \u00e8 offerta da Smarty, una libreria rilasciata sotto licenza LGPL (libera, gratuita e modificabile, quindi).<br \/>\nSmarty occupa davvero poco spazio (meno di 1MB), non richiede installazioni difficoltose ed \u00e8 davvero facile da usare. <!--more--><br \/>\nSi crea semplicemente un file di template con l&#8217;aspetto grafico del sito, che poi \u00e8 un semplice file HTML, in cui inseriamo alcune direttive che consentono di creare delle variabili a cui il valore sar\u00e0 assegnato di volta in volta quando caricheremo la pagina. Detto cos\u00ec sembra difficile, ma vediamo un esempio.<\/p>\n<p>Dopo aver scaricato la libreria, scompattiamo la cartella libs nella directory principale del sito, chiamiamola magari &#8220;Smarty-NUMEROVERSIONE&#8221;, nel mio caso &#8220;Smarty-3.0.7&#8221;. A questo punto creiamo un primo file &#8216;<strong>template.tpl<\/strong>&#8216; e mettiamolo in una cartella apposita, per esempio &#8216;\/template&#8217;. Questo file conterr\u00e0 il seguente codice:<\/p>\n<pre lang=\"html\" line=\"1\">\r\n<html>\r\n  <head>\r\n   <title>{$tag_title}<\/title>\r\n   <meta http-equiv=\"content-type\" content=\"text\/html; charset=iso-8859-1\" \/>\r\n  <\/head>\r\n\r\n  <body>\r\n    <h1>{$titolo}<\/h1>\r\n    <p>{$testo}<\/p>\r\n        {* Commento NON visibile nel sorgente HTML *}\r\n        <!-- Commento visibile nel sorgente HTML -->   \r\n        <ol>\r\n          {foreach from=$lista_spesa item=curr_id}\r\n            <li> {$curr_id}<br>\r\n          {\/foreach}\r\n        <\/ol>\r\n  <\/body>\r\n<\/html>\r\n<\/pre>\n<p>Ora creiamo il file col codice PHP nella directory principale. Chiamiamolo per esempio &#8220;<strong>index.php<\/strong>&#8220;. Il codice \u00e8 il seguente:<\/p>\n<pre lang=\"PHP\" line=\"1\">\r\n<?php\r\n  define('SMARTY_DIR', 'Smarty-3.0.7\/' );\r\n  require_once(SMARTY_DIR . 'Smarty.class.php');\r\n \r\n  $smarty = new Smarty();\r\n  $smarty->template_dir = '.\/templates\/';\r\n  $smarty->compile_dir = '.\/templates\/compile\/';\r\n  $smarty->cache_dir = '.\/templates\/cache\/';\r\n  $smarty->caching = false;\r\n \r\n  $smarty->assign('tag_title', 'Titolo della pagina');\r\n  $smarty->assign('titolo', 'Esempio di uso di Smarty');\r\n  $smarty->assign('testo', 'Lista della spesa:');\r\n \r\n  $lista_spesa = Array('Pane', 'Uova', 'Marmellata', 'Caff\u00e8');\r\n  $smarty->assign('lista_spesa', $lista_spesa);\r\n\r\n  $smarty->display('template.tpl');\r\n?>\r\n<\/pre>\n<p>L&#8217;output sar\u00e0 questo:<\/p>\n<p><a href=\"http:\/\/imageshack.us\/photo\/my-images\/135\/testsmarty.png\/\"><img decoding=\"async\" src=\"http:\/\/img135.imageshack.us\/img135\/6720\/testsmarty.th.png\" alt=\"Immagine\" \/><\/a><\/p>\n<p>Come possiamo vedere, nel file HTML abbiamo creato delle variabili a cui diamo il valore nel codice PHP. Lo stesso termplate pu\u00f2 quindi essere usato in tutte le nostre pagine.<br \/>\nSmarty inoltre ha molte funzioni, come il costrutto IF, le iterazioni (di cui vediamo un assaggio nell&#8217;esempio, per la creazione della lista) e le inclusioni di altri file. Se quindi abbiamo, per esempio, un header da includere in pi\u00f9 pagine, possiamo creare un altro file di template e includerlo negli altri, in modo da evitare ripetizioni di codice.<br \/>\nSmarty \u00e8 anche programmabile. Attraverso alcune variabili possiamo cambiarne alcuni comportamenti. Nell&#8217;esempio potete vedere che ho disattivato la cache, ma ci sono altre cose, possiamo anche cambiare il modo con cui specifichiamo le variabili: se nella pagina usiamo per altri motivi la sintassi {$NOME_VARIABILE}, possiamo impostare altri tipi di costrutto.<\/p>\n<p><strong>Quali sono i vantaggi?<\/strong> Beh, chi programma lo sa, ripetere il codice \u00e8 sempre una pessima idea e mischiare due aspetti diversi di un programma, quali la presentazione e i contenuti, l&#8217;interfaccia e l&#8217;implementazione, lo \u00e8 ancora di pi\u00f9. Se per esempio due squadre di uno stesso progetto si occupano una del design del sito e una di scrivere il codice, una volta definito come deve apparire e comportarsi il sito, possono lavorare in &#8220;compartimenti stagni&#8221;, l&#8217;una in modo indipendente dall&#8217;altro, possono fare la manutenzione e far evolvere il proprio lavoro, sempre senza sapere nulla l&#8217;una del codice dell&#8217;altra e quindi anche senza rischiare di fare danni su porzioni di codice che non conoscono!<br \/>\nVi consiglio di provarlo, io l&#8217;ho conosciuto oggi e ci ho messo due minuti netti a preparare l&#8217;esempio in questo post.<\/p>\n<p><strong>Risorse su WEB:<\/strong><br \/>\nSito ufficiale: <a href=\"http:\/\/www.smarty.net\">http:\/\/www.smarty.net<\/a><br \/>\nManuale ufficiale, anche in italiano: <a href=\"http:\/\/www.smarty.net\/documentation\">http:\/\/www.smarty.net\/documentation<\/a><br \/>\nUn tutorial in inglese: <a href=\"http:\/\/www.phpeveryday.com\/articles\/Smarty-Template-Engine-Tutorial-P849.html\">http:\/\/www.phpeveryday.com\/articles\/Sma &#8230; -P849.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uno dei peggiori difetti di PHP (se non il peggiore) \u00e8 senz&#8217;altro la mancanza di separazione del codice PHP da quello HTML, quindi da presentazione e contenuti. Le soluzioni sono varie e una \u00e8 offerta da Smarty, una libreria rilasciata &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=226\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-226","post","type-post","status-publish","format-standard","hentry","category-programmazione-php"],"views":110,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=226"}],"version-history":[{"count":2,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/226\/revisions"}],"predecessor-version":[{"id":289,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/226\/revisions\/289"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}