Files
smarty/docs/fr/appendixes/tips.xml
yannick e6183de5ea sync with EN
#Un biberon, un commit ! Merci Ewan ;)
2006-09-30 03:20:52 +00:00

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>&amp;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 &amp;nbsp; quand une variable est vide</title>
<programlisting>
<![CDATA[
{* la méthode pas adaptée *}
{if $title eq ''}
&nbsp;
{else}
{$title}
{/if}
{* la bonne méthode *}
{$title|default:'&nbsp;'}
]]>
</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,&amp;$ticker_name,&amp;$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
-->