mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-10-31 04:11:37 +01:00 
			
		
		
		
	
		
			
	
	
		
			379 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
		
		
			
		
	
	
			379 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
|   | <?xml version="1.0" encoding="iso-8859-1"?> | |||
|  | <!-- $Revision$ --> | |||
|  |  <chapter id="tips"> | |||
|  |   <title>Tips & Tricks (trucchi e consigli)</title> | |||
|  |   <para> | |||
|  |   </para> | |||
|  |   <sect1 id="tips.blank.var.handling"> | |||
|  |    <title>Gestione delle variabili vuote</title> | |||
|  |    <para> | |||
|  |     Certe volte potreste voler stampare un valore di default per una | |||
|  |     variabile vuota invece di stampare niente, ad esempio "&nbsp;"  | |||
|  |     in modo che gli sfondi delle tabelle funzionino regolarmente. Molti | |||
|  |     userebbero una {if} per gestire questo caso, ma c'<27> un modo pi<70> veloce | |||
|  |     con Smarty, che <20> l'uso del modificatore <emphasis>default</emphasis>. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>Stampare &nbsp; quando una variabile <20> vuota</title> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {* il modo lungo *} | |||
|  | 
 | |||
|  | {if $title eq ""} | |||
|  |      | |||
|  | {else} | |||
|  |    {$title} | |||
|  | {/if} | |||
|  | 
 | |||
|  | 
 | |||
|  | {* il modo breve *} | |||
|  | 
 | |||
|  | {$title|default:" "} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |   </sect1> | |||
|  | 
 | |||
|  |   <sect1 id="tips.default.var.handling"> | |||
|  |    <title>Gestione dei default delle variabili</title> | |||
|  |    <para> | |||
|  |     Se una variabile viene usata pi<70> volte nel template, applicarle ogni | |||
|  |     volta il modificatore default pu<70> diventare pesante. E' possibile | |||
|  |     rimediare a ci<63> assegnando alla variabile il suo valore di default | |||
|  |     con la funzione <link  | |||
|  |     linkend="language.function.assign">assign</link>. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>Assegnazione del valore di default a una variabile del template</title> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {* mettete questo da qualche parte in cima al template *} | |||
|  | {assign var="title" value=$title|default:"no title"} | |||
|  | 
 | |||
|  | {* se $title era vuota, ora contiene il valore "no title" quando la stampate *} | |||
|  | {$title} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |   </sect1> | |||
|  |   <sect1 id="tips.passing.vars"> | |||
|  |    <title>Passare una variabile titolo ad un template di intestazione</title> | |||
|  |    <para> | |||
|  |     Quando la maggior parte dei template usa gli stessi intestazione e pi<70> di | |||
|  |     pagina, <20> abbastanza comune creare dei template a parte per questi ultimi | |||
|  |     e poi includerli negli altri. Ma cosa succede se l'intestazione ha bisogno | |||
|  |     di avere un titolo diverso a seconda della pagina in cui ci troviamo? | |||
|  |     Potete passare il titolo all'intestazione nel momento dell'inclusione. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>Passare la variabile titolo al template dell'intestazione</title> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | mainpage.tpl | |||
|  | ------------ | |||
|  | 
 | |||
|  | {include file="header.tpl" title="Main Page"} | |||
|  | {* qui va il corpo del template *} | |||
|  | {include file="footer.tpl"} | |||
|  | 
 | |||
|  | 
 | |||
|  | archives.tpl | |||
|  | ------------ | |||
|  | 
 | |||
|  | {config_load file="archive_page.conf"} | |||
|  | {include file="header.tpl" title=#archivePageTitle#} | |||
|  | {* template body goes here *} | |||
|  | {include file="footer.tpl"} | |||
|  | 
 | |||
|  | 
 | |||
|  | header.tpl | |||
|  | ---------- | |||
|  | <HTML> | |||
|  | <HEAD> | |||
|  | <TITLE>{$title|default:"BC News"}</TITLE> | |||
|  | </HEAD> | |||
|  | <BODY> | |||
|  | 
 | |||
|  | 
 | |||
|  | footer.tpl | |||
|  | ---------- | |||
|  | </BODY> | |||
|  | </HTML> | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |    <para> | |||
|  |     Quando viene disegnata la pagina principale, il titolo "Main Page" viene | |||
|  |     passato a header.tpl, e quindi sar<61> usato come titolo. Quando viene | |||
|  |     disegnata la pagina degli archivi, il titolo sar<61> "Archives". Notate | |||
|  |     che nell'esempio degli archivi abbiamo usato una variabile del file | |||
|  |     archives_page.conf invece che una definita nel codice. Notate anche che | |||
|  |     se la variabile $title non <20> impostata viene stampato "BC News", attraverso | |||
|  |     il modificatore di variabile <emphasis>default</emphasis>. | |||
|  |    </para> | |||
|  |   </sect1> | |||
|  |   <sect1 id="tips.dates"> | |||
|  |    <title>Date</title> | |||
|  |    <para> | |||
|  |     Come regola generale, passate sempre le date a Smarty in forma di | |||
|  |     timestamp. Questo consente ai progettisti di usare  <link | |||
|  |     linkend="language.modifier.date.format">date_format</link> per un  | |||
|  |     pieno controllo sulla formattazione delle date, e rende semplice | |||
|  |     anche il confronto fra date quando necessario. | |||
|  |    </para> | |||
|  |    <note> | |||
|  |     <para> | |||
|  |      A partire da Smarty 1.4.0, potete passare date a Smarty come | |||
|  |      timestamp unix, timestamp mysql, o qualsiasi altro formato | |||
|  |      leggibile da strtotime(). | |||
|  |     </para> | |||
|  |    </note> | |||
|  |    <example> | |||
|  |     <title>uso di date_format</title> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {$startDate|date_format} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |     <para> | |||
|  |      Questo stamper<65>: | |||
|  |     </para> | |||
|  |     <screen> | |||
|  | <![CDATA[ | |||
|  | Jan 4, 2001 | |||
|  | ]]> | |||
|  |     </screen> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {$startDate|date_format:"%Y/%m/%d"} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |     <para> | |||
|  |      Questo stamper<65>: | |||
|  |     </para> | |||
|  |     <screen> | |||
|  | <![CDATA[ | |||
|  | 2001/01/04 | |||
|  | ]]> | |||
|  |     </screen> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {if $date1 < $date2} | |||
|  |    ... | |||
|  | {/if} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |    <para> | |||
|  |     Quando usate {html_select_date} in un template, il programmatore | |||
|  |     probabilmente vorr<72> convertire l'output del modulo in un formato | |||
|  |     timestamp. Ecco una funzione che pu<70> aiutarvi in questo. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>convertire le date provenienti da un modulo in timestamp</title> | |||
|  |     <programlisting role="php"> | |||
|  | <![CDATA[ | |||
|  | <?php | |||
|  | 
 | |||
|  | // stabiliamo che gli elementi del modulo si chiamino | |||
|  | // startDate_Day, startDate_Month, startDate_Year | |||
|  | 
 | |||
|  | $startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day); | |||
|  | 
 | |||
|  | function makeTimeStamp($year="", $month="", $day="") | |||
|  | { | |||
|  |    if(empty($year)) { | |||
|  |        $year = strftime("%Y"); | |||
|  |    } | |||
|  |    if(empty($month)) { | |||
|  |        $month = strftime("%m"); | |||
|  |    } | |||
|  |    if(empty($day)) { | |||
|  |        $day = strftime("%d"); | |||
|  |    } | |||
|  | 
 | |||
|  |    return mktime(0, 0, 0, $month, $day, $year); | |||
|  | } | |||
|  | ?> | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |   </sect1> | |||
|  |   <sect1 id="tips.wap"> | |||
|  |    <title>WAP/WML</title> | |||
|  |    <para> | |||
|  |     I template WAP/WML richiedono header php di tipo Content-Type che deve | |||
|  |     essere passato insieme al template. Il modo pi<70> semplice per farlo sarebbe | |||
|  |     scrivere una funzione utente che stampi l'header. Tuttavia, se usate  | |||
|  |     il caching, questo sistema non funziona, per cui lo faremo con il tag | |||
|  |     insert (ricordate che i tag insert non vanno in cache!). Assicuratevi | |||
|  |     che nulla sia inviato in output al browser prima del template, altrimenti | |||
|  |     l'header non potr<74> essere spedito. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>usare insert per scrivere un header Content-Type WML</title> | |||
|  |     <programlisting role="php"> | |||
|  | <![CDATA[ | |||
|  | <?php | |||
|  | 
 | |||
|  | // assicuratevi che apache sia configurato per le estensioni .wml! | |||
|  | // mettete questa funzione da qualche parte nell'applicazione, oppure | |||
|  | // in Smarty.addons.php | |||
|  | function insert_header($params) | |||
|  | { | |||
|  |    // la funzione si aspetta un parametro $content | |||
|  |    if (empty($params['content'])) { | |||
|  |        return; | |||
|  |    } | |||
|  |    header($params['content']); | |||
|  |    return; | |||
|  | } | |||
|  | 
 | |||
|  | ?> | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |     <para> | |||
|  |      il template <emphasis>deve</emphasis> iniziare con il tag insert: | |||
|  |     </para> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {insert name=header content="Content-Type: text/vnd.wap.wml"} | |||
|  | 
 | |||
|  | <?xml version="1.0"?>   | |||
|  | <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">  | |||
|  | 
 | |||
|  | <!-- begin new wml deck -->  | |||
|  | <wml>  | |||
|  |  <!-- begin first card --> | |||
|  |  <card> | |||
|  |   <do type="accept"> | |||
|  |    <go href="#two"/> | |||
|  |   </do> | |||
|  |   <p> | |||
|  |    Welcome to WAP with Smarty! | |||
|  |    Press OK to continue... | |||
|  |   </p> | |||
|  |  </card> | |||
|  |  <!-- begin second card --> | |||
|  |  <card id="two"> | |||
|  |   <p> | |||
|  |    Pretty easy isn't it? | |||
|  |   </p> | |||
|  |  </card> | |||
|  | </wml> | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |   </sect1> | |||
|  |   <sect1 id="tips.componentized.templates"> | |||
|  |    <title>Template a componenti</title> | |||
|  |    <para> | |||
|  |     Tradizionalmente, programmare le applicazioni a template funziona | |||
|  |     cos<6F>: per prima cosa si accumulano le variabili nell'applicazione | |||
|  |     PHP (magari con query al database). Poi, si istanzia l'oggetto | |||
|  |     Smarty, si assegnano le variabili e si visualizza il template. | |||
|  |     Allora supponiamo di avere, ad esempio, un riquadro che visualizza | |||
|  |     le quotazioni di Borsa (stock ticker) nel nostro template. In | |||
|  |     questo caso raccoglieremmo i dati sulle azioni nell'applicazione, | |||
|  |     poi assegneremmo le variabili al template e le visualizzeremmo. Ma | |||
|  |     non sarebbe bello poter aggiungere questo stock ticker a qualsiasi | |||
|  |     applicazione semplicemente includendo il template, senza preoccuparci | |||
|  |     della parte relativa al caricamento dei dati? | |||
|  |    </para> | |||
|  |    <para> | |||
|  |     E' possibile fare questo scrivendo un plugin personalizzato che | |||
|  |     recuperi il contenuto e lo assegni ad una variabile del template. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>template a componenti</title> | |||
|  |     <programlisting role="php"> | |||
|  | <![CDATA[ | |||
|  | <?php | |||
|  | 
 | |||
|  | // mettiamo il file "function.load_ticker.php" nella directory dei plugin | |||
|  | 
 | |||
|  | // scriviamo la funzione che carica i dati | |||
|  | function fetch_ticker($symbol) | |||
|  | { | |||
|  |    // qui metteremo la logica che carica $ticker_info da qualche parte | |||
|  |    return $ticker_info; | |||
|  | } | |||
|  | 
 | |||
|  | function smarty_function_load_ticker($params, &$smarty) | |||
|  | { | |||
|  |    // chiamiamo la funzione | |||
|  |    $ticker_info = fetch_ticker($params['symbol']); | |||
|  | 
 | |||
|  |    // assegnamo la variabile del template | |||
|  |    $smarty->assign($params['assign'], $ticker_info); | |||
|  | } | |||
|  | ?> | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | index.tpl | |||
|  | --------- | |||
|  | 
 | |||
|  | {* in index.tpl *} | |||
|  | 
 | |||
|  | {load_ticker symbol="YHOO" assign="ticker"} | |||
|  | 
 | |||
|  | Stock Name: {$ticker.name} Stock Price: {$ticker.price} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |   </sect1> | |||
|  |   <sect1 id="tips.obfuscating.email"> | |||
|  |    <title>Offuscare gli indirizzi E-mail</title> | |||
|  |    <para> | |||
|  |     Vi siete mai chiesti come fanno i vostri indirizzi E-mail a finire su | |||
|  |     cos<6F> tante mailing list di spam? Uno dei modi che hanno gli spammer  | |||
|  |     per raccogliere indirizzi E-mail <20> dalle pagine web. Per combattere | |||
|  |     questo problema, potete fare in modo che gli indirizzi E-mail appaiano | |||
|  |     in maniera criptata da javascript nel sorgente HTML, anche se continueranno | |||
|  |     ad essere visti e a funzionare correttamente nel browser. E' possibile | |||
|  |     farlo con il plugin mailto. | |||
|  |    </para> | |||
|  |    <example> | |||
|  |     <title>Esempio di offuscamento di indirizzo E-mail</title> | |||
|  |     <programlisting> | |||
|  | <![CDATA[ | |||
|  | {* in index.tpl *} | |||
|  | 
 | |||
|  | Send inquiries to | |||
|  | {mailto address=$EmailAddress encode="javascript" subject="Hello"} | |||
|  | ]]> | |||
|  |     </programlisting> | |||
|  |    </example> | |||
|  |    <note> | |||
|  |     <title>Nota tecnica</title> | |||
|  |     <para> | |||
|  |      Questo metodo non <20> sicuro al 100%. Uno spammer, concettualmente, potrebbe | |||
|  |      programmare il suo raccoglitore di e-mail per decodificare questi valori, | |||
|  |      ma non <20> una cosa semplice. | |||
|  |     </para> | |||
|  |    </note> | |||
|  |   </sect1> | |||
|  | </chapter> | |||
|  | <!-- Keep this comment at the end of the file
 | |||
|  | Local variables: | |||
|  | mode: sgml | |||
|  | sgml-omittag:t | |||
|  | sgml-shorttag:t | |||
|  | sgml-minimize-attributes:nil | |||
|  | sgml-always-quote-attributes:t | |||
|  | sgml-indent-step:1 | |||
|  | sgml-indent-data:t | |||
|  | indent-tabs-mode:nil | |||
|  | sgml-parent-document:nil | |||
|  | sgml-default-dtd-file:"../../../../manual.ced" | |||
|  | sgml-exposed-tags:nil | |||
|  | sgml-local-catalogs:nil | |||
|  | sgml-local-ecat-files:nil | |||
|  | End: | |||
|  | vim600: syn=xml fen fdm=syntax fdl=2 si | |||
|  | vim: et tw=78 syn=sgml | |||
|  | vi: ts=1 sw=1 | |||
|  | --> |