mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-27 18:31:36 +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'è un modo più veloce
|
|
con Smarty, che è l'uso del modificatore <emphasis>default</emphasis>.
|
|
</para>
|
|
<example>
|
|
<title>Stampare &nbsp; quando una variabile è 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ù 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
|
|
-->
|