IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Smarty] boucles imbriquées avec requêtes SQL, impossible à comprendre


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut [Smarty] 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    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

  3. #3
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 790
    Points
    1 790
    Par défaut
    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).

    @+

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    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

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Catégorie 1
    --->Forum 1
    Catégorie 2
    --->Forum 1
    Catégorie 3
    --->Forum 1
    Alors que ça devrais afficher
    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

  6. #6
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 790
    Points
    1 790
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    @+

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    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 !

  8. #8
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 790
    Points
    1 790
    Par défaut
    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).

    @+

  9. #9
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. [MySQL] Boucle for avec requête SQL
    Par yurispy dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/05/2015, 23h02
  2. [XL-2003] Requête SQL impossible avec objet QueryTable
    Par Sclarckone dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/09/2011, 16h09
  3. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04
  4. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo