mirror of
https://github.com/smarty-php/smarty.git
synced 2025-10-28 10:51:37 +01:00
439 lines
13 KiB
XML
439 lines
13 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 1.12 Maintainer: didou Status: ready -->
|
|
|
|
<chapter id="tips">
|
|
<title>Trucs et astuces</title>
|
|
<para></para>
|
|
<sect1 id="tips.blank.var.handling">
|
|
<title>Gestion des variables non-assignées</title>
|
|
<para>
|
|
Peut-être voudrez-vous des fois afficher une valeur par
|
|
défaut pour une variable qui n'a pas été assignée, comme
|
|
pour afficher <literal>&nbsp;</literal> afin que les couleurs
|
|
de fond des tableaux fonctionnent. Beaucoup utiliseraient une
|
|
instruction <link linkend="language.function.if"><varname>{if}</varname></link>
|
|
pour gérer celà, mais il existe un moyen
|
|
plus facile dans Smarty : l'utilisation du modificateur
|
|
de variable
|
|
<link linkend="language.modifier.default"><varname>default</varname></link>.
|
|
<note>
|
|
<para>Les erreurs <quote>de variable indéfinie</quote> seront affichés si
|
|
la fonction PHP
|
|
<ulink url="&url.php-manual;error_reporting">
|
|
<varname>error_reporting()</varname></ulink> vaut <constant>E_ALL</constant>
|
|
et qu'une variable n'a pas été assignée à Smarty.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
<example>
|
|
<title>Afficher &nbsp; quand une variable est vide</title>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{* la méthode pas adaptée *}
|
|
{if $title eq ''}
|
|
|
|
{else}
|
|
{$title}
|
|
{/if}
|
|
|
|
|
|
{* la bonne méthode *}
|
|
{$title|default:' '}
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Voir aussi
|
|
<link linkend="language.modifier.default"><varname>default</varname></link> et
|
|
<link linkend="tips.default.var.handling">la gestion des variables par défaut</link>.
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="tips.default.var.handling">
|
|
<title>Gestion des variables par défaut</title>
|
|
<para>
|
|
Si une variable est utilisée fréquemment dans vos templates,
|
|
lui appliquer le modificateur
|
|
<link linkend="language.modifier.default"><varname>default</varname></link>
|
|
peut être un peu fastidieux.
|
|
Vous pouvez remédier à celà en lui assignant une valeur par défaut
|
|
avec la fonction <link linkend="language.function.assign"><varname>{assign}</varname></link>.
|
|
</para>
|
|
<example>
|
|
<title>Assigner une valeur par défaut à une variable de template</title>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{* faites cela quelque part en haut de votre template *}
|
|
{assign var='title' value=$title|default:'no title'}
|
|
|
|
{* si $title est vide, il contiendra alors la valeur "no title" *}
|
|
{$title}
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Voir aussi
|
|
<link linkend="language.modifier.default"><varname>default</varname></link> et
|
|
<link linkend="tips.blank.var.handling">la gestion des variables non-assignées</link>.
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="tips.passing.vars">
|
|
<title>Passage du titre à un template d'en-tête</title>
|
|
<para>
|
|
Quand la majorité de vos templates utilisent les mêmes en-tête et pied-de-page,
|
|
il est d'usage de les mettre dans leurs propres templates et de les inclure
|
|
(<link linkend="language.function.include"><varname>{include}</varname></link>).
|
|
Mais comment faire si l'en-tête doit avoir un titre différent, selon la page
|
|
d'où on vient ? Vous pouvez passer le titre à l'en-tête en tant qu'
|
|
<link linkend="language.syntax.attributes">attribut</link> quand il est inclus.
|
|
</para>
|
|
|
|
<example>
|
|
<title>Passer le titre au template d'en-tête</title>
|
|
|
|
<para>
|
|
<filename>mainpage.tpl</filename> - Lorsque la page principal est construite,
|
|
le titre <quote>Man Page</quote> est passé au <filename>header.tpl</filename> et sera utilisé
|
|
en tant que titre.
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{include file='header.tpl' title='Main Page'}
|
|
{* le corps du template va ici *}
|
|
{include file='footer.tpl'}
|
|
]]>
|
|
</programlisting>
|
|
|
|
<para>
|
|
<filename>archives.tpl</filename> - Lorsque la page principal est construite, le titre
|
|
sera <quote>Archives</quote>. Notez que dans cet exemple, nous utilisons une variable du fichier
|
|
<filename>archives_page.conf</filename> au lieu d'une variable classique.
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{config_load file='archive_page.conf'}
|
|
|
|
{include file='header.tpl' title=#archivePageTitle#}
|
|
{* corps du template ici *}
|
|
{include file='footer.tpl'}
|
|
]]>
|
|
</programlisting>
|
|
|
|
<para>
|
|
<filename>header.tpl</filename> - Notez que <quote>Smarty News</quote> est affiché
|
|
si la variable <literal>$title</literal> n'est pas définie, en utilisant le modificateur de variable par
|
|
<link linkend="language.modifier.default"><varname>default</varname></link>.
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
<html>
|
|
<head>
|
|
<title>{$title|default:'Smarty News'}</title>
|
|
</head>
|
|
<body>
|
|
]]>
|
|
</programlisting>
|
|
|
|
<para>
|
|
<filename>footer.tpl</filename>
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
</body>
|
|
</html>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
|
|
<sect1 id="tips.dates">
|
|
<title>Dates</title>
|
|
<para>
|
|
De façon générale, essayez de toujours passer les dates à Smarty
|
|
sous forme de <ulink url="&url.php-manual;time">timestamp</ulink>.
|
|
Cela permet aux designers de templates d'utiliser
|
|
<link linkend="language.modifier.date.format"><varname>date_format</varname></link>
|
|
pour avoir un contrôle total sur le formatage des dates et de comparer
|
|
facilement les dates entre elles.
|
|
</para>
|
|
<example>
|
|
<title>Utilisation de date_format</title>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{$startDate|date_format}
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Affichera :
|
|
</para>
|
|
<screen>
|
|
<![CDATA[
|
|
Jan 4, 2009
|
|
]]>
|
|
</screen>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{$startDate|date_format:"%Y/%m/%d"}
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
Affichera :
|
|
</para>
|
|
<screen>
|
|
<![CDATA[
|
|
2009/01/04
|
|
]]>
|
|
</screen>
|
|
<para>
|
|
Les dates peuvent être comparées dans le template en utilisant les timestamps, comme ceci :
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{if $date1 < $date2}
|
|
...
|
|
{/if}
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
En utilisant la fonction
|
|
<link linkend="language.function.html.select.date"><varname>{html_select_date}</varname></link>
|
|
dans un template, le programmeur veut en général convertir le
|
|
résultat d'un formulaire en un timestamp.
|
|
Voici une fonction qui devrait vous être utile.
|
|
</para>
|
|
<example>
|
|
<title>Conversion des éléments date d'un formulaire en timestamp</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// celà suppose que vos éléments de formulaire soient nommés
|
|
// 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>
|
|
|
|
<para>
|
|
Voir aussi
|
|
<link linkend="language.function.html.select.date"><varname>{html_select_date}</varname></link>,
|
|
<link linkend="language.function.html.select.time"><varname>{html_select_time}</varname></link>,
|
|
<link linkend="language.modifier.date.format"><varname>date_format</varname></link> et
|
|
<link linkend="language.variables.smarty.now"><parameter>$smarty.now</parameter></link>,
|
|
</para>
|
|
</sect1>
|
|
|
|
<sect1 id="tips.wap">
|
|
<title>WAP/WML</title>
|
|
<para>
|
|
Les templates WAP/WML nécessitent un en-tête
|
|
<ulink url="&url.php-manual;header">Content-Type</ulink> qui doit être
|
|
passé avec le template. Le moyen le plus facile de faire celà est d'écrire
|
|
une fonction utilisateur qui écrit l'en-tête. Si vous utilisez le
|
|
<link linkend="caching">cache</link>,
|
|
celà ne fonctionnera pas. Nous utiliserons donc une balise d'insertion
|
|
(<link linkend="language.function.insert">{insert}</link>)
|
|
(rappelez-vous que les balises d'insertion ne sont pas mises en cache !).
|
|
Assurez-vous qu'aucune sortie
|
|
rien n'est transmise au navigateur avant l'appel du template, sans quoi
|
|
la modification de l'en-tête échouera.
|
|
</para>
|
|
<example>
|
|
<title>Utilisation d'{insert} pour écrire un en-tête Content-Type WML</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// assurez-vous que Apache est configuré pour les extensions .wml !
|
|
// mettez cette fonction quelque part dans votre applications
|
|
// ou dans Smarty.addons.php
|
|
function insert_header()
|
|
{
|
|
// cette fonction attend un argument $content
|
|
if (empty($params['content'])) {
|
|
return;
|
|
}
|
|
header($params['content']);
|
|
return;
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
votre template Smarty <emphasis>doit</emphasis> commencer avec la balise d'insertion :
|
|
</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>Templates composants</title>
|
|
<para>
|
|
Traditionnellemnt, la programmation avec des templates dans les applications
|
|
se déroule de la façon suivante : d'abord vous récupérez vos variables
|
|
dans l'application PHP (peut-être avec des requêtes en base de données), puis
|
|
vous instanciez votre objet Smarty,
|
|
<link linkend="api.assign"><varname>assign()</varname></link>
|
|
les variables et <link linkend="api.display"><varname>display()</varname></link> le
|
|
template. Disons par exemple que nous avons un téléscripteur dans
|
|
notre template. Nous récupérerions les données dans notre application,
|
|
puis les assignerions ensuite pour les afficher. Mais ne serait-ce pas
|
|
mieux de pouvoir ajouter ce téléscripteur à n'importe quelle application
|
|
en incluant directement le template sans avoir à se soucier de la récupération
|
|
des données ?
|
|
</para>
|
|
<para>
|
|
Vous pouvez réaliser celà en écrivant un plugin personnalisé pour récupérer le contenu
|
|
et l'assigner à une variable du template.
|
|
</para>
|
|
<example>
|
|
<title>Template composant</title>
|
|
<para>
|
|
<filename>function.load_ticker.php</filename> -
|
|
Efface le fichier du répertoire des
|
|
<link linkend="variable.plugins.dir"><parameter>$plugins</parameter></link>
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
// notre fonction pour récupérer les données
|
|
function fetch_ticker($symbol,&$ticker_name,&$ticker_price)
|
|
{
|
|
// du traitement qui récupère $ticker_name
|
|
// depuis la ressource ticker
|
|
return $ticker_info;
|
|
}
|
|
|
|
function smarty_function_load_ticker($params, &$smarty)
|
|
{
|
|
// appel de la fonction
|
|
$ticker_info = fetch_ticker($params['symbol']);
|
|
|
|
// assignation de la variable de template
|
|
$smarty->assign($params['assign'], $ticker_info);
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
<filename>index.tpl</filename>
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
{load_ticker symbol='SMARTY' assign="ticker"}
|
|
|
|
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Voir aussi
|
|
<link linkend="language.function.include.php"><varname>{include_php}</varname></link>,
|
|
<link linkend="language.function.include"><varname>{include}</varname></link> et
|
|
<link linkend="language.function.php"><varname>{php}</varname></link>.
|
|
</para>
|
|
</sect1>
|
|
<sect1 id="tips.obfuscating.email">
|
|
<title>Dissimuler les adresses email</title>
|
|
<para>
|
|
Vous-êtes vous déjà demandé pourquoi vos adresses emails sont sur autant
|
|
de listes de diffusion de spam ? Une façon pour les spammers de récupérer les
|
|
adresses est de parcourir les pages Web. Voici une façon de remédier
|
|
à ce problème : mettre votre adresse email dans du Javascript brouillé
|
|
au milieu de votre source HTML, sans que celà ne gêne l'affichage sur le
|
|
navigateur Web. Cela est fait grâce au plugin
|
|
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
|
|
</para>
|
|
<example>
|
|
<title>Exemple de dissimulation d'une adresse email</title>
|
|
<programlisting>
|
|
<![CDATA[
|
|
<div id="contact">Envoyer une demande à
|
|
{mailto address=$EmailAddress encode='javascript' subject='Bonjour'}
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<note>
|
|
<title>Note technique</title>
|
|
<para>
|
|
Cette méthode n'est pas infaillible. Un spammer peut programmer son
|
|
collecteur d'email pour passer outre cette astuce, mais c'est cependant
|
|
peu probable.
|
|
</para>
|
|
</note>
|
|
<para>
|
|
Voir aussi
|
|
<link linkend="language.modifier.escape"><varname>escape</varname></link> et
|
|
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
|
|
</para>
|
|
</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
|
|
--> |