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

439 lines
13 KiB
XML
Raw Normal View History

2004-03-28 15:18:13 +00:00
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision$ -->
<!-- EN-Revision: 1.12 Maintainer: didou Status: ready -->
2006-02-18 17:54:23 +00:00
2004-03-28 15:18:13 +00:00
<chapter id="tips">
2004-04-19 17:08:12 +00:00
<title>Trucs et astuces</title>
<para></para>
<sect1 id="tips.blank.var.handling">
<title>Gestion des variables non-assign<67>es</title>
<para>
2004-05-23 15:50:53 +00:00
Peut-<2D>tre voudrez-vous des fois afficher une valeur par
2004-04-19 17:08:12 +00:00
d<>faut pour une variable qui n'a pas <20>t<EFBFBD> assign<67>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>
2005-05-10 21:15:40 +00:00
pour g<>rer cel<65>, mais il existe un moyen
2004-05-23 15:50:53 +00:00
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<6E>finie</quote> seront affich<63>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 <20>t<EFBFBD> assign<67>e <20> Smarty.
</para>
</note>
2004-05-23 15:50:53 +00:00
</para>
2004-04-19 17:08:12 +00:00
<example>
2005-07-10 19:27:50 +00:00
<title>Afficher &amp;nbsp; quand une variable est vide</title>
2004-04-19 17:08:12 +00:00
<programlisting>
<![CDATA[
2004-03-28 15:18:13 +00:00
{* la m<>thode pas adapt<70>e *}
2006-02-18 17:54:23 +00:00
{if $title eq ''}
2004-04-19 17:08:12 +00:00
&nbsp;
2004-03-28 15:18:13 +00:00
{else}
2004-04-19 17:08:12 +00:00
{$title}
2004-03-28 15:18:13 +00:00
{/if}
{* la bonne m<>thode *}
2006-02-18 17:54:23 +00:00
{$title|default:'&nbsp;'}
2004-04-19 17:08:12 +00:00
]]>
</programlisting>
</example>
2005-05-10 21:15:40 +00:00
<para>
Voir aussi
<link linkend="language.modifier.default"><varname>default</varname></link> et
2005-05-10 21:15:40 +00:00
<link linkend="tips.default.var.handling">la gestion des variables par d<>faut</link>.
</para>
2004-04-19 17:08:12 +00:00
</sect1>
2005-05-10 21:15:40 +00:00
2004-05-23 15:50:53 +00:00
<sect1 id="tips.default.var.handling">
<title>Gestion des variables par d<>faut</title>
<para>
Si une variable est utilis<69>e fr<66>quemment dans vos templates,
lui appliquer le modificateur
<link linkend="language.modifier.default"><varname>default</varname></link>
peut <20>tre un peu fastidieux.
2004-12-26 21:12:45 +00:00
Vous pouvez rem<65>dier <20> cel<65> en lui assignant une valeur par d<>faut
avec la fonction <link linkend="language.function.assign"><varname>{assign}</varname></link>.
2004-05-23 15:50:53 +00:00
</para>
<example>
<title>Assigner une valeur par d<>faut <20> une variable de template</title>
2004-03-28 15:18:13 +00:00
<programlisting>
2004-12-21 20:31:42 +00:00
<![CDATA[
2006-02-18 17:54:23 +00:00
{* faites cela quelque part en haut de votre template *}
{assign var='title' value=$title|default:'no title'}
2004-03-28 15:18:13 +00:00
2004-12-21 20:31:42 +00:00
{* si $title est vide, il contiendra alors la valeur "no title" *}
{$title}
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
2005-05-10 21:15:40 +00:00
<para>
Voir aussi
<link linkend="language.modifier.default"><varname>default</varname></link> et
2005-05-10 21:15:40 +00:00
<link linkend="tips.blank.var.handling">la gestion des variables non-assign<67>es</link>.
</para>
2004-05-23 15:50:53 +00:00
</sect1>
2005-07-10 19:27:50 +00:00
2004-05-23 15:50:53 +00:00
<sect1 id="tips.passing.vars">
<title>Passage du titre <20> un template d'en-t<>te</title>
<para>
Quand la majorit<69> de vos templates utilisent les m<>mes en-t<>te et pied-de-page,
2005-07-10 19:27:50 +00:00
il est d'usage de les mettre dans leurs propres templates et de les inclure
(<link linkend="language.function.include"><varname>{include}</varname></link>).
2004-05-23 15:50:53 +00:00
Mais comment faire si l'en-t<>te doit avoir un titre diff<66>rent, selon la page
2006-02-18 17:54:23 +00:00
d'o<> on vient ? Vous pouvez passer le titre <20> l'en-t<>te en tant qu'
<link linkend="language.syntax.attributes">attribut</link> quand il est inclus.
2004-05-23 15:50:53 +00:00
</para>
2005-07-10 19:27:50 +00:00
2004-05-23 15:50:53 +00:00
<example>
<title>Passer le titre au template d'en-t<>te</title>
2005-07-10 19:27:50 +00:00
<para>
2006-02-18 17:54:23 +00:00
<filename>mainpage.tpl</filename> - Lorsque la page principal est construite,
le titre <quote>Man Page</quote> est pass<73> au <filename>header.tpl</filename> et sera utilis<69>
2006-02-18 17:54:23 +00:00
en tant que titre.
2005-07-10 19:27:50 +00:00
</para>
2004-12-21 20:31:42 +00:00
<programlisting>
<![CDATA[
2006-02-18 17:54:23 +00:00
{include file='header.tpl' title='Main Page'}
2004-03-28 15:18:13 +00:00
{* le corps du template va ici *}
2006-02-18 17:54:23 +00:00
{include file='footer.tpl'}
2005-07-10 19:27:50 +00:00
]]>
</programlisting>
2004-03-28 15:18:13 +00:00
2005-07-10 19:27:50 +00:00
<para>
2006-02-18 17:54:23 +00:00
<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
2006-02-18 17:54:23 +00:00
<filename>archives_page.conf</filename> au lieu d'une variable classique.
2005-07-10 19:27:50 +00:00
</para>
<programlisting>
<![CDATA[
2006-02-18 17:54:23 +00:00
{config_load file='archive_page.conf'}
2006-02-18 17:54:23 +00:00
{include file='header.tpl' title=#archivePageTitle#}
{* corps du template ici *}
{include file='footer.tpl'}
2005-07-10 19:27:50 +00:00
]]>
</programlisting>
2004-03-28 15:18:13 +00:00
2005-07-10 19:27:50 +00:00
<para>
<filename>header.tpl</filename> - Notez que <quote>Smarty News</quote> est affich<63>
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>.
2005-07-10 19:27:50 +00:00
</para>
<programlisting>
<![CDATA[
<html>
<head>
2006-04-09 21:59:55 +00:00
<title>{$title|default:'Smarty News'}</title>
2005-07-10 19:27:50 +00:00
</head>
<body>
]]>
</programlisting>
2004-03-28 15:18:13 +00:00
2005-07-10 19:27:50 +00:00
<para>
<filename>footer.tpl</filename>
</para>
<programlisting>
<![CDATA[
</body>
</html>
2004-12-21 20:31:42 +00:00
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
</sect1>
2006-02-18 17:54:23 +00:00
2004-05-23 15:50:53 +00:00
<sect1 id="tips.dates">
<title>Dates</title>
<para>
De fa<66>on g<>n<EFBFBD>rale, essayez de toujours passer les dates <20> Smarty
2006-02-18 17:54:23 +00:00
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>
2004-05-23 15:50:53 +00:00
pour avoir un contr<74>le total sur le formatage des dates et de comparer
facilement les dates entre elles.
</para>
<example>
2004-12-21 20:31:42 +00:00
<title>Utilisation de date_format</title>
<programlisting>
<![CDATA[
2004-03-28 15:18:13 +00:00
{$startDate|date_format}
2004-12-21 20:31:42 +00:00
]]>
</programlisting>
<para>
Affichera :
</para>
<screen>
<![CDATA[
Jan 4, 2009
2004-12-21 20:31:42 +00:00
]]>
</screen>
<programlisting>
<![CDATA[
2004-03-28 15:18:13 +00:00
{$startDate|date_format:"%Y/%m/%d"}
2004-12-21 20:31:42 +00:00
]]>
</programlisting>
<para>
Affichera :
</para>
<screen>
<![CDATA[
2009/01/04
2004-12-21 20:31:42 +00:00
]]>
</screen>
<para>
Les dates peuvent <20>tre compar<61>es dans le template en utilisant les timestamps, comme ceci :
</para>
<programlisting>
2004-12-21 20:31:42 +00:00
<![CDATA[
{if $date1 < $date2}
2004-04-19 17:08:12 +00:00
...
2004-12-21 20:31:42 +00:00
{/if}
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
<para>
En utilisant la fonction
<link linkend="language.function.html.select.date"><varname>{html_select_date}</varname></link>
2006-02-18 17:54:23 +00:00
dans un template, le programmeur veut en g<>n<EFBFBD>ral convertir le
r<>sultat d'un formulaire en un timestamp.
2004-05-23 15:50:53 +00:00
Voici une fonction qui devrait vous <20>tre utile.
</para>
<example>
2004-12-21 20:31:42 +00:00
<title>Conversion des <20>l<EFBFBD>ments date d'un formulaire en timestamp</title>
<programlisting role="php">
<![CDATA[
<?php
2004-12-26 21:12:45 +00:00
// cel<65> suppose que vos <20>l<EFBFBD>ments de formulaire soient nomm<6D>s
2004-03-28 15:18:13 +00:00
// startDate_Day, startDate_Month, startDate_Year
2004-12-21 20:31:42 +00:00
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
2004-03-28 15:18:13 +00:00
2005-07-10 19:27:50 +00:00
function makeTimeStamp($year='', $month='', $day='')
2004-03-28 15:18:13 +00:00
{
2004-12-21 20:31:42 +00:00
if(empty($year)) {
$year = strftime('%Y');
2004-12-21 20:31:42 +00:00
}
if(empty($month)) {
$month = strftime('%m');
2004-12-21 20:31:42 +00:00
}
if(empty($day)) {
$day = strftime('%d');
2004-12-21 20:31:42 +00:00
}
2005-05-24 20:07:09 +00:00
2004-12-21 20:31:42 +00:00
return mktime(0, 0, 0, $month, $day, $year);
}
?>
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
2005-07-10 19:27:50 +00:00
2005-05-24 20:07:09 +00:00
<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>,
2005-05-24 20:07:09 +00:00
</para>
2004-05-23 15:50:53 +00:00
</sect1>
2006-02-18 17:54:23 +00:00
2004-05-23 15:50:53 +00:00
<sect1 id="tips.wap">
<title>WAP/WML</title>
<para>
2005-07-10 19:27:50 +00:00
Les templates WAP/WML n<>cessitent un en-t<>te
<ulink url="&url.php-manual;header">Content-Type</ulink> qui doit <20>tre
2004-12-26 21:12:45 +00:00
pass<73> avec le template. Le moyen le plus facile de faire cel<65> est d'<27>crire
2005-07-10 19:27:50 +00:00
une fonction utilisateur qui <20>crit l'en-t<>te. Si vous utilisez le
<link linkend="caching">cache</link>,
2004-12-26 21:12:45 +00:00
cel<65> ne fonctionnera pas. Nous utiliserons donc une balise d'insertion
2005-07-10 19:27:50 +00:00
(<link linkend="language.function.insert">{insert}</link>)
2004-03-28 15:18:13 +00:00
(rappelez-vous que les balises d'insertion ne sont pas mises en cache !).
Assurez-vous qu'aucune sortie
2004-05-23 15:50:53 +00:00
rien n'est transmise au navigateur avant l'appel du template, sans quoi
2004-03-28 15:18:13 +00:00
la modification de l'en-t<>te <20>chouera.
2004-05-23 15:50:53 +00:00
</para>
<example>
2005-07-10 19:27:50 +00:00
<title>Utilisation d'{insert} pour <20>crire un en-t<>te Content-Type WML</title>
2004-12-21 20:31:42 +00:00
<programlisting role="php">
<![CDATA[
<?php
2004-03-28 15:18:13 +00:00
// assurez-vous que Apache est configur<75> pour les extensions .wml !
2004-12-21 20:31:42 +00:00
// mettez cette fonction quelque part dans votre applications
2004-03-28 15:18:13 +00:00
// ou dans Smarty.addons.php
2004-12-21 20:31:42 +00:00
function insert_header()
{
// cette fonction attend un argument $content
if (empty($params['content'])) {
return;
}
header($params['content']);
return;
2004-03-28 15:18:13 +00:00
}
2004-12-21 20:31:42 +00:00
?>
]]>
</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"}
2005-07-10 19:27:50 +00:00
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
2004-12-21 20:31:42 +00:00
2005-07-10 19:27:50 +00:00
<!-- begin new wml deck -->
<wml>
<!-- begin first card -->
<card>
<do type="accept">
<go href="#two"/>
</do>
<p>
2004-12-21 20:31:42 +00:00
Welcome to WAP with Smarty!
2005-07-10 19:27:50 +00:00
Press OK to continue...
</p>
</card>
<!-- begin second card -->
<card id="two">
<p>
2004-12-21 20:31:42 +00:00
Pretty easy isn't it?
2005-07-10 19:27:50 +00:00
</p>
</card>
2004-12-21 20:31:42 +00:00
</wml>
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</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<66>on suivante : d'abord vous r<>cup<75>rez vos variables
dans l'application PHP (peut-<2D>tre avec des requ<71>tes en base de donn<6E>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
2004-05-23 15:50:53 +00:00
template. Disons par exemple que nous avons un t<>l<EFBFBD>scripteur dans
notre template. Nous r<>cup<75>rerions les donn<6E>es dans notre application,
puis les assignerions ensuite pour les afficher. Mais ne serait-ce pas
mieux de pouvoir ajouter ce t<>l<EFBFBD>scripteur <20> n'importe quelle application
en incluant directement le template sans avoir <20> se soucier de la r<>cup<75>ration
2004-12-21 20:31:42 +00:00
des donn<6E>es ?
2004-05-23 15:50:53 +00:00
</para>
<para>
2004-12-21 20:31:42 +00:00
Vous pouvez r<>aliser cel<65> en <20>crivant un plugin personnalis<69> pour r<>cup<75>rer le contenu
et l'assigner <20> une variable du template.
2004-05-23 15:50:53 +00:00
</para>
<example>
2004-12-21 20:31:42 +00:00
<title>Template composant</title>
2005-07-10 19:27:50 +00:00
<para>
<filename>function.load_ticker.php</filename> -
Efface le fichier du r<>pertoire des
<link linkend="variable.plugins.dir"><parameter>$plugins</parameter></link>
2005-07-10 19:27:50 +00:00
</para>
2004-12-21 20:31:42 +00:00
<programlisting role="php">
<![CDATA[
<?php
2004-03-28 15:18:13 +00:00
2004-12-21 20:31:42 +00:00
// notre fonction pour r<>cup<75>rer les donn<6E>es
function fetch_ticker($symbol,&amp;$ticker_name,&amp;$ticker_price)
{
// du traitement qui r<>cup<75>re $ticker_name
// depuis la ressource ticker
return $ticker_info;
}
2004-04-19 17:08:12 +00:00
2004-12-21 20:31:42 +00:00
function smarty_function_load_ticker($params, &$smarty)
{
// appel de la fonction
$ticker_info = fetch_ticker($params['symbol']);
2005-07-10 19:27:50 +00:00
2004-12-21 20:31:42 +00:00
// assignation de la variable de template
$smarty->assign($params['assign'], $ticker_info);
}
?>
]]>
</programlisting>
2005-07-10 19:27:50 +00:00
<para>
<filename>index.tpl</filename>
</para>
2004-12-21 20:31:42 +00:00
<programlisting>
<![CDATA[
2006-04-09 21:59:55 +00:00
{load_ticker symbol='SMARTY' assign="ticker"}
2004-03-28 15:18:13 +00:00
2004-12-21 20:31:42 +00:00
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
2005-05-10 21:15:40 +00:00
<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>.
2005-05-10 21:15:40 +00:00
</para>
2004-05-23 15:50:53 +00:00
</sect1>
<sect1 id="tips.obfuscating.email">
<title>Dissimuler les adresses email</title>
<para>
Vous-<2D>tes vous d<>j<EFBFBD> demand<6E> pourquoi vos adresses emails sont sur autant
2004-12-21 20:31:42 +00:00
de listes de diffusion de spam ? Une fa<66>on pour les spammers de r<>cup<75>rer les
2004-05-23 15:50:53 +00:00
adresses est de parcourir les pages Web. Voici une fa<66>on de rem<65>dier
<20> ce probl<62>me : mettre votre adresse email dans du Javascript brouill<6C>
2004-12-26 21:12:45 +00:00
au milieu de votre source HTML, sans que cel<65> ne g<>ne l'affichage sur le
navigateur Web. Cela est fait gr<67>ce au plugin
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
2004-05-23 15:50:53 +00:00
</para>
<example>
2004-12-21 20:31:42 +00:00
<title>Exemple de dissimulation d'une adresse email</title>
2004-03-28 15:18:13 +00:00
<programlisting>
2004-12-21 20:31:42 +00:00
<![CDATA[
2006-04-09 21:59:55 +00:00
<div id="contact">Envoyer une demande <20>
{mailto address=$EmailAddress encode='javascript' subject='Bonjour'}
2004-12-21 20:31:42 +00:00
]]>
</programlisting>
2004-05-23 15:50:53 +00:00
</example>
2004-04-19 17:08:12 +00:00
<note>
2004-05-23 15:50:53 +00:00
<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>
2004-04-19 17:08:12 +00:00
</note>
2005-05-10 21:15:40 +00:00
<para>
Voir aussi
<link linkend="language.modifier.escape"><varname>escape</varname></link> et
<link linkend="language.function.mailto"><varname>{mailto}</varname></link>.
2005-05-10 21:15:40 +00:00
</para>
2004-05-23 15:50:53 +00:00
</sect1>
</chapter>
2005-07-10 19:27:50 +00:00
2004-05-23 15:50:53 +00:00
<!-- 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
2005-07-10 19:27:50 +00:00
-->