Files
smarty/docs/it/appendixes/tips.xml

379 lines
10 KiB
XML
Raw Normal View History

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<chapter id="tips">
<title>Tips &amp; 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 "&amp;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 &amp;nbsp; quando una variabile <20> vuota</title>
<programlisting>
<![CDATA[
{* il modo lungo *}
{if $title eq ""}
&nbsp;
{else}
{$title}
{/if}
{* il modo breve *}
{$title|default:"&nbsp;"}
]]>
</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
-->