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

379 lines
10 KiB
XML

<?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'è un modo più veloce
con Smarty, che è l'uso del modificatore <emphasis>default</emphasis>.
</para>
<example>
<title>Stampare &amp;nbsp; quando una variabile è 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ù volte nel template, applicarle ogni
volta il modificatore default può diventare pesante. E' possibile
rimediare a ciò 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é di
pagina, è 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à usato come titolo. Quando viene
disegnata la pagina degli archivi, il titolo sarà "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 è 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à:
</para>
<screen>
<![CDATA[
Jan 4, 2001
]]>
</screen>
<programlisting>
<![CDATA[
{$startDate|date_format:"%Y/%m/%d"}
]]>
</programlisting>
<para>
Questo stamperà:
</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à convertire l'output del modulo in un formato
timestamp. Ecco una funzione che può 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ù 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à 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ì: 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ì tante mailing list di spam? Uno dei modi che hanno gli spammer
per raccogliere indirizzi E-mail è 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 è sicuro al 100%. Uno spammer, concettualmente, potrebbe
programmare il suo raccoglitore di e-mail per decodificare questi valori,
ma non è 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
-->