Version complète: sur le forum Webmaster Hub : Requête mysql dans Smarty
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Las
Bonjour tout le monde;
Je suis entrain de développer un site ou plutôt d'optimiser un site déja existant mais en utilisant "Smarty".
Bon ce moteur de templates est un peu trop compliqué mais on s'y habitue...

Dans ma Sidebar je voulais mettre un bloc "TOP10", où il y aura les 10 articles les plus lus.
Pour ça j'ai créé deux fichiers:

charts.php
CODE
<?php
require '../libs/Smarty.class.php';
    
    $smarty = new Smarty;
    

    $connexion = mysql_connect("localhost", "root", "");
    mysql_select_db("mabase", $connexion);


$top10 = mysql_query("SELECT id, titles FROM news ORDER BY affichages LIMIT 10");
$charts = array();
    
    while($temp = mysql_fetch_array($top10))
    {
          $charts[] = array(
            'id' => $temp[0],
            'titre' => $temp[1]
          );
        }
        $smarty->assign('charts', $charts);
$smarty->display('../templates/charts.tpl');
?>


et charts.tpl
CODE
{foreach from=$charts item=chart}
        <a href="articles.php?id={$chart.id}>{$chart.titre}</a><br />
     {/foreach}


et dans sidebar.tpl j'ai ajouté {include file="charts.tpl"}

Mais rien ne s'affiche dans le bloc top10 de ma sidebar.
Vous voyez l'érreur ??
Slyghter
Tout comme toi j'ai eu à repasser un site en Smarty et je connais bien le 'bébé' maintenant.

A mons avis tu devrais plutôt faire {include file="charts.php"} ton charts.tpl étant généré par le php ?
Las
merci slyghter , mais là je reçois l'erreure suivante:
CODE
Fatal error: Smarty error: [in ../inc/charts.php line 15]: syntax error: unrecognized tag: $charts[] = array( 'id' => $temp[0], 'title' => $temp[1] ); (Smarty_Compiler.class.php, line 446) in C:\wamp\www\site\libs\Smarty.class.php on line 1092
Slyghter
Tu pourrais me montrer le code de siderbar.tpl ?
Las
sidebar.tpl :
CODE
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title></title>
</head>
<body>
    <br />
    <div id="menu_titre">MENU</div>
        <a href="index.php">Accueil</a><br />
     <a href="index.php?page=articles">Actualit&eacute;s</a><br />
     <a href="index.php?page=hitech">Hi-tech</a><br />
     <a href="index.php?page=tutoriels">Tutoriels</a><br />
     <a href="index.php?page=logiciels">Logiciels</a><br />
     <a href="index.php?page=humour">Humour</a>    <br />
     <a href="/cafe">Forum</a><br />
     <a href="index.php?page=contacts">Contacts</a><br />
    <br />
    <div id="menu_titre">Top 10 Articles</div>
    {include file="../inc/charts.php"}
    <div id="menu_titre">Liens</div> ...
</body>
</html>
Slyghter
Smarty ne comprend pas le php de l'include. A vraie dire je n'avais essayé de faire un include php happy.gif"

Ton include est-il réellement nécessaire ?

Je m'explique : pourquoi ne pas faire ta requête du charts dans sidebar.php tu rajoute
CODE
$smarty->assign('charts', $charts);
dans ton sidebar.php

et faire ton
CODE
{include file="charts.tpl"}
comme tu voulais le faire au départ .

Las
voici maintenant le code, mais je recois toujours une erreur fatale et le chargement de la page se bloque dans la sidebar.

sidebar.tpl
CITATION
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">



<html>

<head>

<title></title>

</head>



<body>

<br />



<div id="menu_titre">

MENU

</div> <a href="index.php">Accueil</a>

<br />

<a href="index.php?page=articles">Actualit&eacute;s</a>

<br />

<a href="index.php?page=hitech">Hi-tech</a>

<br />

<a href="index.php?page=tutoriels">Tutoriels</a>

<br />

<a href="index.php?page=logiciels">Logiciels</a>

<br />

<a href="index.php?page=humour">Humour</a>

<br />

<a href="/cafe">Forum</a>

<br />

<a href="index.php?page=contacts">Contacts</a>

<br />



<br />



<div id="menu_titre">

Top 10 Articles

</div>

{include file="../inc/sidebar.php"}

{foreach from=$charts item=chart}

<a href="article.php?id={$chart.id}">{$chart.title}</a><br />

{/foreach}



<div id="menu_titre">

Liens

</div> ...

</body>

</html>


sidebar.php
CITATION
= array(

'id' => $temp[0],

'titre' => $temp[1]

);

}

$smarty->assign('charts', $charts);

$smarty->display('../templates/sidebar.tpl');

?>]


Las
J'ai changé un peu le code :
maintenant dans sidebar.php
CITATION
<?php

require '../libs/Smarty.class.php';

$smarty = new Smarty;

$connexion = mysql_connect("localhost", "root", "");

mysql_select_db("mabase", $connexion);

$top10 = mysql_query("SELECT id, titles FROM news ORDER BY affichages LIMIT 10");

while(mysql_num_rows($top10)){

$smarty->assign('results', mysql_fetch_array($top10));

}

$smarty->display('../templates/sidebar.tpl');

?>


et dans sidebar.tpl
CITATION
{foreach key=id item=con from=$results}

<a href="article.php?id={$id}">{$con.title}</a><br />

{foreachelse}

Pas de contenu à afficher.

{/foreach}


et j'ai réalisé que Smarty ne pouvait pas accéder à ma base de données, comment faire pour qu'il puisse voir ma base ??
Las
Voici un mois que j'ai voulu éssayer smarty et voila que je suis bloqué dans le premier problème que j'ai rencontré...

je n'arrive pas à afficher les résultats d'une requete sad.gif(((

s'il vous plait, les documentations qui se trouvent sur developpez.com et sur smarty.net sont ou bien fausses, ou bien très mal expliquées !!!

Soyez gentils, dites-moi quel bout de code dois-je écrire pour afficher cette requete ??

CITATION
$sql = mysql_query("SELECT id, title FROM news ORDER BY affichages DESC LIMIT 10");
Kioob
Hello,

ce n'est que mon opinion, mais pour ma part il ne me serait jamais venu à l'idée de chercher à exécuter une requête au beau milieu de l'affichage d'un template.
C'est certes contraignant d'un point de vue de mémoire (et encore, selon le contexte), mais je récupère toutes les données dans des variables/tableaux avant de faire le moindre affichage.
Le seul traitement que j'ai fonctionne différemment est encapsulé dans une méthode (ou fonction si tu préfères) et est alors transparent pour le moteur de template.


PS : je précise quand même que je n'ai jamais eu à utiliser Smarty.
Las
CITATION
il ne me serait jamais venu à l'idée de chercher à exécuter une requête au beau milieu de l'affichage d'un template.


alors comment faire pour insérer les 10 articles les plus lus dans un sidebar ?
je suis sûre que tu me diras autre chose que de créer un array et de mettre les articles manuellement à chaque fois smile.gif)

Le plus énervant ou plutot rigolo si je veux rester optimiste, c'est que j'ai éssayé avec smarty, puis TinyBut Strong et maintenant avec phpBB et le résultat est toujours le même: "rien ne s'affiche"
Kioob
Le tableau je le crée de manière automatique hein, j'y stocke les résultats des requêtes SQL et autres traitements.

Pour simplifier, l'exécution de chaque script donne à peu près cela :
1 - chargement du coeur "framework"
2 - traitement des entrées utilisateurs (formulaires, paramètres d'URL, voir cookies)
3 - récupération des données nécessaires à l'affichage
4 - transmission de ces données au moteur de template
5 - affichage

Toutes les requêtes SQL sont faites dans les phases 2 et 3, et c'est tout. La connexion à la base de données n'est pas faite avant ces phases, et elle est coupée après la phase 3 (bon techniquement, elle est coupée durant la phase 4, par fainéantise).

Après comme je disais moi je procède comme cela et n'ai jamais eu de soucis en utilisant un moteur de template, mais tu peux t'organiser comme tu le sens.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.