VIII. Recettes de code▲
L'objet de cette partie du tutoriel est de vous présenter quelques cas concrets de ce que l'on peut faire et comment on peut le faire avec SMARTY.
VIII-A. Extraction Mysql vers tableau HTML▲
Voilà un exemple que l'on retrouve dans la plupart des applications, partir d'un ensemble de données (une table Mysql dans notre exemple) pour afficher un tableau.
Un screenshot de ma table visualisée avec phpMyAdmin (base training, table person)
La partie PHP ne présente rien d'exceptionnel. L'idée est d'empiler chacune des « lignes »récupérées (avec la fonction mysql_fetch_array) pour réutiliser le tableau ainsi constitué dans le template Smarty.
require_once('
../lib_smarty/Smarty.class.php
'
);
$oSmarty
=
new Smarty();
$mysql_ressource
=
mysql_connect('
localhost
'
,
'
root
'
,
''
);
mysql_select_db("
training
"
,
$mysql_ressource
);
$sQuery
=
"
SELECT PSN_FIRST_NAME, PSN_LAST_NAME, PSN_PHONE FROM person ORDER BY PSN_LAST_NAME
"
;
$mysql_rs
=
mysql_query($sQuery
,
$mysql_ressource
) or die(mysql_error());
$aRecordSet
=
array();
while ($aRow
=
mysql_fetch_array($mysql_rs
)) {
array_push($aRecordSet
,
$aRow
);
}
$oSmarty
->
assign('
smarty_table_mysql
'
,
$aRecordSet
);
$oSmarty
->
display('
index.tpl
'
);
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html>
<head>
<title></title>
</head>
<body>
<table
width
=
"450px"
>
<tr
style
=
"background-color:teal;color:white;"
>
<th>
NOM</th>
<th>
PRENOM</th>
<th>
TELEPHONE</th>
</tr>
<!-- Pour chaque élément du tableau $smarty_table_mysql -->
{section name=idx loop=$smarty_table_mysql}
<tr
style
=
"background-color:{cycle values="
#ffffcc, #cccccc
"};"
>
<td>
{$smarty_table_mysql[idx].PSN_LAST_NAME}</td>
<td>
{$smarty_table_mysql[idx].PSN_FIRST_NAME}</td>
<td>
{$smarty_table_mysql[idx].PSN_PHONE}</td>
</tr>
{/section}
</table>
</body>
</html>
VIII-B. Utilisation d'une source XML▲
Nous allons voir comment, à partir d'un fichier XML (source fichier ou bien chaîne de caractères) on peut mettre ces données dans notre template.
<?xml version="1.0"?>
<personnes>
<personne>
<nom>
PEYROUX</nom>
<prenom>
Jean</prenom>
<tels>
<tel>
06.76.89.78.56</tel>
</tels>
</personne>
<personne>
<nom>
MICHEL</nom>
<prenom>
Jean-Luc</prenom>
<tels>
<tel>
01.87.54.23.34</tel>
<tel>
06.12.21.34.54</tel>
<tel>
09.09.98.89.09</tel>
</tels>
</personne>
<personne>
<nom>
POMMEREAU</nom>
<prenom>
Eric</prenom>
<tels>
<tel>
01.78.98.87.87</tel>
<tel>
06.12.34.32.34</tel>
</tels>
</personne>
</personnes>
Comme nous allons le voir, la taille du code PHP est particulièrement faible.
require_once('
../lib_smarty/Smarty.class.php
'
);
$oSmarty
=
new Smarty();
$oXmlFile
=
simplexml_load_file("
personnes.xml
"
);
$oSmarty
->
assign('
smarty_xml_file
'
,
$oXmlFile
);
$oSmarty
->
display('
personnes.tpl
'
);
Le fichier de templates est un peu plus complexe puisque nous utilisons la fonction foreach (un peu différente de {SECTION}), cette fonction est de plus imbriquée pour obtenir les téléphones de chacun :
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html>
<head>
<title>
Utilisation d'une source XML</title>
</head>
<body>
<table
width
=
"450px"
>
<tr
style
=
"background-color:teal;color:white;"
>
<th>
NOM</th>
<th>
PRENOM</th>
<th>
TELEPHONES</th>
</tr>
<!-- pour chaque item personne -->
{foreach from=$smarty_xml_file item=personne}
<tr
style
=
"background-color:{cycle values="
#ffffcc, #cccccc
"};"
>
<td>
{$personne->nom}</td>
<td>
{$personne->prenom}</td>
<td>
<table>
<!-- pour chaque item telephone -->
{foreach from=$personne->tels->tel item=telephone}
<tr>
<td>
{$telephone}
</td>
</tr>
{/foreach}
</table>
</td>
</tr>
{/foreach}
</table>
</body>
</html>
VIII-C. Production d'un fichier XML (fil rss)▲
Nous avons vu comment utiliser avec Smarty une source XML.
Nous allons maintenant voir comment produire du XML. Plus particulièrement dans cet exemple nous allons produire un fil RSS 2.0.
Pour réaliser ce fil RSS, nous allons utiliser une source mysql dont voici un aperçu :
Pour la suite même logique que ce que nous avons pu voir précédemment. Le fichier PHP chargé de la récupération des données et de la « ventilation » vers Smarty.
<?php
require_once('../lib_smarty/Smarty.class.php'
);
$oSmarty
=
new
Smarty();
// Le tableau conteneur des éléments RSS
$aRssItems
=
array
();
// Se connecter à mysql
if
(!
$oConnexion
=
mysql_connect('localhost'
,
'root'
,
''
))
die("Impossible de se connecter"
);
// Choisir la base de données
if
(!
mysql_select_db('demos'
))
die("Erreur de sélection de la base de données"
);
// Construire la requête
$sSql
=
"SELECT `title` , `description` , `link` FROM rss"
;
// Exécuter la requête et récupérer le jeu d'enregistrements
if
(!
$oMysqlRes
=
mysql_query($sSql
))
die("Erreur: la requête n'a pu être exécutée"
);
// Pour chaque ligne du jeu d'enregistrement
while
($oRow
=
mysql_fetch_array($oMysqlRes
,
MYSQL_ASSOC)) {
// Ajouter dans le conteneur
array_push($aRssItems
,
$oRow
);
}
// Passer la
$oSmarty
->
assign('smarty_RssItems'
,
$aRssItems
);
header("Content-Type: text/xml"
);
$oSmarty
->
display('rss.tpl'
)
?>
Enfin, le fichier de template est un fichier XML standard RSS 2.0 Standard RSSavec une partie « dynamique » reproduite autant de fois qu'il y a d'éléments dans la base de données.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss
version
=
"0.91"
>
<channel>
<title>
Exemple de production de fil RSS avec SMARTY</title>
<link>
http://localhost/demos/init_smarty/demoRSS/</link>
<description>
La démo suivante vous montre comment créer facilement un flux RSS avec SMARTY.</description>
<language>
fr</language>
<copyright>
Eric POMMEREAU</copyright>
<webMaster>
eric-pommereau@developpez.com</webMaster>
<image>
<title>
Smarty</title>
<url>
http://localhost/demos/init_smarty/demoRSS/smarty_icon.gif</url>
<link>
http://smarty.php.net/</link>
<width>
88</width>
<height>
31</height>
</image>
{section name=itemIndex loop=$smarty_RssItems}
<item>
<title>
{$smarty_RssItems[itemIndex].title}</title>
<description>
{$smarty_RssItems[itemIndex].description}</description>
<link>
{$smarty_RssItems[itemIndex].link}</link>
</item>
{/section}
</channel>
</rss>