Précédent   Forum du club des développeurs et IT Pro > PHP > Bibliothèques et frameworks > Templates > Smarty
Smarty Forum d'entraide sur le moteur de templates Smarty. Avant de poster -> FAQ Smarty et Cours Smarty
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/04/2007, 18h28   #1
dexxter
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 1
Points : 1
Par défaut boucles imbriquées avec requêtes SQL, impossible à comprendre

Bonjour à tous

Je suis actuellement désespéré par un problème qui me hante depuis des jours.

Je recode un nouveau forum mais cette fois ci j'aimerais le faire avec un system template, j'ai choisi Smarty et j'ai trouvé que toute la documentation au niveau des boucles était nul car il n'y en avait pas enfaite.

j'aimerais savoir faire un affichage des catégories et des forums en boucle imbriquées bien sur mais je ne vois pas du tout comment faire avec les templates et les requete SQL ... je suis totalement perdu.

j'ai déja fait ceci mais ça ne m'a pas fait grand chose

Partie .tpl
Code :
1
2
3
4
5
6
7
 
{foreach from=$custid item=curr_id}
	  {foreach from=$curr_id item=curr_id2}
	   -> : {$curr_id} | {$curr_id}<br />
	 ---> : {$curr_id2}<br />
	  {/foreach}
{/foreach}
Partie PHP

Code :
1
2
3
4
5
6
7
8
9
10
11
$sql = mysql_query("SELECT * FROM qualif_categorie");
while($req = mysql_fetch_array($sql))
{
	$tpl->append('custid', array( $req['id'], $req['titre']));
 
	$sqla = mysql_query("SELECT * FROM qualif_forum WHERE categorie = '".$req['id']."'");
	while( $reqa = mysql_fetch_array($sqla))
	{
		$tpl->append('curr_id', array( $reqa['titre']));
	}
}
J'espère que vous pourrez m'aider car la je suis vraiment désespéré.

Merci d'avance pour votre aide qui m'est précieuse.

Cordialement dexxter
dexxter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2007, 20h11   #2
dexxter
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 1
Points : 1
J'ai oublié de préciser, j'aimerais juste enfaite que quelqu'un qui maitrise les Template Smarty puisse me donner un exmple simple pour que je puisse comprendre ... Merci beaucoup
dexxter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2007, 15h38   #3
eric.pommereau
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur, pôle cartographie
Inscription : décembre 2004
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 39
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur, pôle cartographie
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 715
Points : 1 864
Points : 1 864
Peux tu mettre {debug output="html"} dans ta page TPL et nous dire si tes données y figurent bien (éventuellement d'en poster le résultat).

@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2007, 16h02   #4
dexxter
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 1
Points : 1
Seul la premiere lettre apparai ... enfaite mes codes totalement faut et comme je n'ai aucun exemple c'est se que j'aimerais bien avoir ...

un simple exemple avec des requete SQL imbriquer

1° affiche les categorie
2° affiche les forums appartenant au categorie

c'est tout se que je demande ...

Merci beaucoup de votre aide
dexxter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2007, 01h26   #5
dexxter
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 1
Points : 1
Par défaut [Smarty] Affichage quand il ne faut pas : boucle imbriquées

Bonjour à tous

Pour mon nouveau forum j'ai voulu le faire avec les templates Smarty mais j'ai un petit problème.

J'ai fait mes deux boucles imbriquées pour l'affichage des catégories et des forums sur l'index mais le problèmes c'est que dans ma requete SQL j'ai bien dit d'afficher QUE les forums appartenant a cette catégorie mais malheureusement tout les forums de la table s'affiche dans TOUTE les catégories

Voici le code PHP
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$categorie 	= array();
$forum 		= array();
$i 			= 0;
$j 			= 0;
 
$sql_1 = mysql_query("SELECT * FROM qualif_categorie ORDER BY id ASC");
while( $cat = mysql_fetch_array( $sql_1 ) )
{
	$categorie_donnee = array( 
						"id"	=> $cat['id'], 
						"titre" => $cat['titre'] 
							);
 
	$categorie[$i++] = $categorie_donnee;
 
	$sql_2 = mysql_query("SELECT * FROM qualif_forum WHERE categorie = '".$cat['id']."'");
	while( $for = mysql_fetch_array( $sql_2 ) )
	{
		$forum_donnee = array(
						"id" 	=> $for['id'], 
						"titre" => $for['titre'] 
							);
 
		$forum[$j++] = $forum_donnee;
 
	}
}
 
$tpl->assign("categorie", $categorie);
$tpl->assign("forum", $forum);

et voici coté .tpl
Code HTML :
1
2
3
4
5
6
{section name=categorie loop=$categorie}
	<a href="lien.php?id={$categorie[categorie].id}">{$categorie[categorie].titre}</a><br />
		{section name=forum loop=$forum}
		---><a href="lien2.php?id={$forum[forum].id}">{$forum[forum].titre}</a><br />
	{/section} 
{/section}

et Voici le résultat obtenu
Citation:
Catégorie 1
--->Forum 1
Catégorie 2
--->Forum 1
Catégorie 3
--->Forum 1
Alors que ça devrais afficher
Citation:
Catégorie 1
--->Forum 1
Catégorie 2
Catégorie 3
Car le forum 1 appartient a Catégorie 1

Merci beaucoup de votre aide !

Merci d'avance

Cordialement DexteR
dexxter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/05/2007, 11h58   #6
eric.pommereau
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur, pôle cartographie
Inscription : décembre 2004
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 39
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur, pôle cartographie
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 715
Points : 1 864
Points : 1 864
Bonjour,

Après avoir regardé ton code il semble que les tableaux 'catégories' et 'forums' sont indépendants l'un de l'autre.

En effet pour réaliser une boucle imbriquée il te faut impérativement utiliser le même tableau / objet. Il faut récupérer la liste des catégories et pour chaque catégorie faire correspondre les forums.

Je t'ai fait un petit exemple qui pourra peut être t'aider:

Le fichier PHP:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
	require_once('../../smarty/Smarty.class.php');
   $oSmarty = new Smarty();
 
   $aBoucle = array();
 
   // Liste des catégories *****************
	for ($i=0;$i<5;$i++){	
      array_push(
      	$aBoucle,
         array(
         	'Catégorie'. $i,
				'ID_' . $i,
            array(
            )
         )
      );
 
      // Liste des forums pour chaque catégorie ************
   	for ($j=0;$j<5;$j++) {
      	array_push(
         	$aBoucle[$i][2],
            array(
            	'Forum_' . $i.$j,
               'ID_' . $j
            )  
         );
      }
   }
 
   // D'abord je vérifie que mes données sont bien dans mon tableau
   //printf('<pre>%s</pre>', print_r($aBoucle,1));
 
   $oSmarty->assign('categories', $aBoucle);
 
	$oSmarty->display('boucle.tpl');   
?>
Le fichier BOUCLE.TPL

Code HTML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
 
<html>
<head>
<title></title>
</head>
<body>
 
<!-- debogage avec la fonction debug dans le template pour voir si mes données sont bien dans le template --> 
 
{section name=index loop=$categories}
	{$categories[index][0]} <br />
   {section name=idx loop=$categories[index][2]}
	   &nbsp;&nbsp;{$categories[index][2][idx][0]}<br />
   {/section}
{/section}
 
</body>
</html>

Le résultat:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Catégorie0
  Forum_00
  Forum_01
  Forum_02
  Forum_03
  Forum_04
Catégorie1
  Forum_10
  Forum_11
  Forum_12
  Forum_13
  Forum_14
Catégorie2
  Forum_20
  Forum_21
  Forum_22
  Forum_23
  Forum_24
Catégorie3
  Forum_30
  Forum_31
  Forum_32
  Forum_33
  Forum_34
Catégorie4
  Forum_40
  Forum_41
  Forum_42
  Forum_43
  Forum_44
En éspérant que cela puisse t'aider.

@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2007, 16h20   #7
dexxter
Invité de passage
 
Inscription : avril 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 8
Points : 1
Points : 1
C'est bien gentil de me donner un exemple, mais sans etre désagréable c'est pas avec des boucles for que j'utilise, mais des while pour faire mes requete ... c'est avec les requete qu'il me faudrait un exemple car encore maintenant j'ai essayer et j'y arrive pas ... c'est vraiment énerver

Merci quand meme de votre part pour votre aide !
dexxter est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2007, 16h32   #8
eric.pommereau
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur, pôle cartographie
Inscription : décembre 2004
Messages : 715
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 39
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur, pôle cartographie
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 715
Points : 1 864
Points : 1 864
C'était juste un exemple pour montrer le principe...

Le fait que ce soit avec une boucle 'while' ou 'for' ne change en rien ton affaire, ton problème est de trouver une méthode pour mettre les valeurs dans une structure (tableau ou objet) et les réutiliser dans ton template.

Ce que j'ai proposé dans l'exemple ci dessus est tout à fait transposable dans ton cas (pour chaque section associer un tableau de valeurs: les forums).

@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2007, 17h30   #9
Hervé Saladin
Membre chevronné
 
Avatar de Hervé Saladin
 
Développeur Web
Inscription : décembre 2004
Messages : 634
Détails du profil
Informations personnelles :
Âge : 31

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2004
Messages : 634
Points : 725
Points : 725
Citation:
Envoyé par dexxter
j'ai choisi Smarty et j'ai trouvé que toute la documentation au niveau des boucles était nul car il n'y en avait pas enfaite
Ah bon ? Moi je trouve, au contraire, que la doc de Smarty est tout à fait correcte, c'est même une des raisons pour lesquelles j'ai choisi ce moteur pour plusieurs projets.
Les boucles {foreach} et {section} sont bien décrites dans la doc que j'ai (chopée sur le site de smarty).
Citation:
Envoyé par dexxter
sans etre désagréable c'est pas avec des boucles for que j'utilise, mais des while pour faire mes requete ...
Sans vouloir être désagréable, si tu n'arrives pas a faire la correspondance entre une boucle for aussi simple et une boucle while, tu devrais peut être d'abord acquérir les bases minimum d'algorithmique avant de te plonger dans Smarty.

Je crois que ton problème vient en partie du fait que tu confonds les boucles qui te servent à parcourir le résultat de ta requête (PHP) et celles qui te servent à l'afficher (Smarty).
Coté Smarty, des boucles imbriquées n'ont de sens que si tu parcoure un tableau à deux dimensions au moins ...

Voici la façon de procéder :
- 1 : tu exécutes tes requêtes SQL
- 2 : tu construit un tableau à deux dimensions qui contient tes forums regroupés par catégories
- 3 : dans ton template smarty, tu parcoure le tableau construit au 2

Exemple :
Coté PHP :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$categories = array();
 
$sql_1 = mysql_query("SELECT * FROM qualif_categorie ORDER BY id ASC");
while($cat = mysql_fetch_array($sql_1) )
{
	$uneCategorie = array();
	$uneCategorie['id'] = $cat['id'];
	$uneCategorie['titre'] = $cat['titre'];
 
	$sql_2 = mysql_query("SELECT * FROM qualif_forum WHERE categorie = '".$cat['id']."'");
 
	$forumsCategorie = array();
 
	while($for = mysql_fetch_array($sql_2) )
	{
		$unForum = array();
		$unForum['id'] = $for['id'];
		$unForum['titre'] = $for['titre'];
 
		array_push($forumsCategorie,$unForum);
	}
 
	$uneCategorie['forums'] = $forumsCategorie;
 
	array_push($categories,$uneCategorie);
}
 
$tpl->assign("categories", $categories);

Puis, le template Smarty Correspondant :
Code HTML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{foreach from=$categories item=uneCategorie}
 
	<a href="pageCategorie.php?idCateg={$uneCategorie.id}">
		{$uneCategorie.titre}
	</a>
 
	{foreach from=$uneCategorie.forums item=unForum}
 
		<a href="pageForum.php?idForum={$unForum.id}">
			{$unForum.titre}
		</a>
 
	{foreachelse}
		Il n'y a aucun forum dans cette catégorie !
	{/foreach}
 
{foreachelse}
	Aucune catégorie n'est définie !
{/foreach}

Franchement, là j'ai fait tout le boulot à ta place, alors tu devrais y arriver !
__________________
Ne cliquez pas sur ce lien
Hervé Saladin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 23h52   #10
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
require_once('common.php');
require_once('header.php');															
 
// Affichons les 5 derniers folders pour chaque categorie.
 
$sql_newest = $db->sql_query("SELECT cat_id, cat_name FROM categories ORDER BY cat_name"); // Récupérons les différentes catégories.
 
$categories_listing = array(); // On initialise un tableau.
 
while($categorie_listing = $db->sql_fetchrow($sql_newest))
{
 
	$oneCategorie = array();
	$oneCategorie['cat_id'] = $categorie_listing['cat_id'];
	$oneCategorie['cat_name'] = $categorie_listing['cat_name'];
 
	// Listons les fichiers.
 
	$sql_listing = $db->sql_query("SELECT sub_id, cat_id, sub_name, sub_img 
		FROM sub_categories 
		WHERE cat_id=".$categorie_listing['cat_id']." 
		AND sub_status=1 
		ORDER BY sub_date 
		DESC LIMIT 5");
 
	$foldersCategorie = array();
 
	while($folder = $db->sql_fetchrow($sql_listing)){
 
		// Comptons le nombre d'entrées.
 
		$sql_count = $db->sql_query("SELECT COUNT(*) AS total 
			FROM videos 
			WHERE sub_id=".$folder['sub_id']);
 
		$count = $db->sql_fetchrow($sql_count);
 
		$oneFolder = array();
		$oneFolder['sub_id'] = $folder['sub_id'];
		$oneFolder['sub_name'] = $folder['sub_name'];
		$oneFolder['sub_img'] = $folder['sub_img'];
		$oneFolder['total'] = $count['total'];
 
		array_push($foldersCategorie,$oneFolder);	
 
	}
 
	$oneCategorie["folders"] = $foldersCategorie; 
 
	array_push($categories_listing,$foldersCategorie);
 
} 
 
$smarty->assign('categories_listing',$categories_listing);		
 
$smarty->display('index.tpl');
?>
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        <!-- BEGIN CATEGORIE_LISTING -->
        {foreach from="$categories_listing" item="OneCategorie"}
        <td><table>
            <tr>
              <td><b>{$OneCategorie.cat_name}</b></td>
            </tr>
            <!-- BEGIN FOLDER_LISTING -->
            {foreach from="$OneCategorie.folders" item="oneFolder"}
            <tr>
              <td>&nbsp;&nbsp;<img src="images/folder.gif" /><a href="videos.php?id={$oneFolder.sub_id}">{$oneFolder.sub_name}</a> ({$oneFolder.count_files})</td>
            </tr>
            {/foreach}
            <!-- END FOLDER_LISTING -->
            <tr>
              <td>&nbsp;&nbsp;&nbsp;<img src="images/play.png" /><a href="main.php?id={$OneCategorie.cat_id}"><em>more</em></a></td>
            </tr>
          </table></td>
        NEW_TR
        {/foreach}
        <!-- END CATEGORIE_LISTING -->
Bonjour,

J'ai essayé mais ça ne marche pas.
  Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h34.


 
 
 
 
Partenaires

Hébergement Web