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 template 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 cette 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
selection
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'enregistrments
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ée.
<?
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 suivant 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
>