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] Boucle FOREACH Smarty


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut [Smarty] Boucle FOREACH Smarty
    Bonjour,

    Je souhaiterai solliciter votre aide concernant un problème de boucle "foreach" dans le template Smarty (utilisation Prestashop).

    Mon but est de traiter un tableau de données dans un fichier .tpl via Smarty.
    Envoi des données vers le fichier .tpl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tableau = $this->_getRechercheTableau();
     
    $smarty->assign(array(
    			'tableau' => $tableau 
    		));
     
    return $this->display(__FILE__, 'mapage.tpl');

    Fonction _getRechercheTableau()
    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
     
    private function _getRechercheTableau(){
     
    global $smarty, $cookie;
     
    $id_lang = intval($cookie->id_lang);
    $result = Db::getInstance()->ExecuteS('
    	           REQUETE DE RECHERCHE DE TOUS LES PRODUITS POUR OBTENIR LEUR ID');
     
    $data_all[] = array();
     
    foreach($result as $products){
    	$id_product= isset($products['id_product'])?$products['id_product']:'';
    	$variable = "Variable";
     
    // On crée ici le tableau de données.
    	$data_all[] = array('id_product' => $id_product, 'variable' => $variable);
    	}
     
    // On retourne ici le tableau de données.
    return array('mon_tableau' => $data_all);
     
    }

    Fichier mapage.tpl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {foreach from=$tableau item=data_see}
        	<p>{$data_see.id_product} : {$data_see.variable}</p>
    {/foreach}
    Seulement voilà, lorsque le fichier .tpl est exécuté, j'ai deux erreurs qui me disent que "Notice: Undefined index: id_product" et "Notice: Undefined index: variable".

    Je ne vois absolument pas d'où peut provenir mon erreur.

    Quelqu'un peut-il m'aider s'il vous plait ?

    Merci par avance de votre réponse.

  2. #2
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $smarty->assign(array(
    			'tableau' => $tableau 
    		));
    Pourquoi un tableau dans ton assign ?

    Ce ne serait pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $smarty->assign('tableau', $tableau);
    Sinon ton code à l'air ok...

    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    En fait je transmet d'autres variables via Smarty à mon fichier .tpl mais je ne les ai pas affiché ici pour ne pas embrouiller ceux qui voulaient m'aider dans mon problème (d'où l'utilisation d'un tableau).

    Si mon code à l'air ok ça me pose problème alors parce que je ne vois pas d'où l'erreur peut provenir !

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    J'ai vu une ou deux fois php/smarty mais il me semble que le foreach c pour des tableaux simples. Ce n'est pas plutot section qu'il faut utiliser ...

    je dis ça rapidement car tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {$data_see.id_product} : {$data_see.variable}
    Et que les erreurs portent sur un tableau assigné ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Je viens d'utiliser {section} pour tester avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {section name=valeurs loop=$tableau}
           <p>id_product: {$tableau[valeurs].id_product}<br />
    	    variable: {$tableau[valeurs].variable}<br />
           </p>
    {/section}
    Mais maintenant pour chaque variable, j'ai un "Notice: Undefined offset: 0 in..."

  6. #6
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Autre chose quand tu assignes ton tableau dans smarty, tu devrais essayer avec un nom différent car dans {section} j'ai peur de la confusion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $smarty->assign(array('un_tableau' => $tableau ));
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    J'ai changé le nom d'assignation de mon tableau comme tu me l'as suggéré mais toujours la même erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $smarty->assign(array('un_tableau' => $tableau ));

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {section name=valeurs loop=$un_tableau}
           <p>id_product: {$un_tableau[valeurs].id_product}<br />
    	    variable: {$un_tableau[valeurs].variable}<br />
           </p>
    {/section}
    C'est fou quand même cette erreur !

  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
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $smarty->assign('un_tableau', $tableau);

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    J'ai essayé mais ça ne change rien non.

    Le problème ne vient pas de mon tableau car j'ai pu l'exploiter sans problème au sein même de ma page .php mais dès que je veux l'exploiter dans mon fichier .tpl rien ne fonctionne.

    La partie de mon fichier .tpl (boucle section) te semble correcte ?

  10. #10
    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
    La partie de mon fichier .tpl (boucle section) te semble correcte ?
    Si ton tableau est un tableau indexé oui, sinon c'est une boucle foreach qu'il faut.

    Tu peux voir les variables dans le registre de smarty en mettant la balise {debug} n'importe où dans ton fichier .tpl (cela ouvrira une popup javascript) et cela te donnera le détail de ce que tu peux consommer dans ton template.

    @+

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Oui merci. Je connaissais également la fonction {debug} de Smarty.

    Je retrouve bien dans la console mon tableau agencé de cette manière :

    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
    $un_tableau
     
    Smarty_Variable Object (3)
    ->value = Array (1)
      mon_tableau => Array (8)
        0 => Array (0)
        1 => Array (2)
                id_product => "1"
                variable=> true
        2 => Array (2)
                id_product => "2"
                variable=> true
        3 => Array (2)
                id_product => "5"
                variable => 0
        4 => Array (2)
                id_product => "6"
                variable=> 0
        5 => Array (2)
                id_product => "7"
                variable=> true
        6 => Array (2)
                id_product => "8"
                variable=> 0
        7 => Array (2)
                id_product => "9"
                variable => 0
    ->nocache = false
    ->scope = "Smarty root"
    On peut en déduire la méthode à adopter pour exploiter ce tableau dans le fichier .tpl ?

  12. #12
    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ôté PHP, tu peux faire un
    Je vais regarder ça...

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Merci pour la fonction dump() que je ne connaissais pas.

    Je cherche encore comment exploiter les données de mon tableau dans mon fichier .tpl sans succès malheureusement.

  14. #14
    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,

    je te demandais juste si tu peux copier-coller un var_dump($tableau) dans la réponse que je puisse voir la structure de ton tableau.

    ++

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Ah pardon je n'avais pas compris que tu voulais voir le résultat.

    Côté PHP avec la fonction dump() j'ai :

    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
    array
      'mon_tableau' => 
        array
          0 => 
            array
              empty
          1 => 
            array
              'id_product' => string '1' (length=1)
              'variable' => boolean true
          2 => 
            array
              'id_product' => string '2' (length=1)
              'variable' => boolean true
          3 => 
            array
              'id_product' => string '5' (length=1)
              'variable' => int 0
          4 => 
            array
              'id_product' => string '6' (length=1)
              'variable' => int 0
          5 => 
            array
              'id_product' => string '7' (length=1)
              'variable' => boolean true
          6 => 
            array
              'id_product' => string '8' (length=1)
              'variable' => int 0
          7 => 
            array
              'id_product' => string '9' (length=1)
              'variable' => int 0
    J'exploite le tableau côté PHP de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $tableau= $this->_getRechercheTableau();
     
    foreach($tableau['mon_tableau'] as $_item)
    {
        $id_product = isset($_item['id_product'])?$_item['id_product']:'';
        $id_val = isset($_item['variable'])?$_item['variable']:'';
     
        $html .= '<p>'.$id_product.' - '.$id_val.'</p>';
    }
    Et ça s'affiche bien. Mais l'adaptation côté Smarty ne fonctionne pas.

  16. #16
    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
    Voilà ce qui marche chez moi...
    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
        require_once '../../libs/smarty/3.1.8/Smarty.class.php';
     
        $oSmarty = new Smarty();
        $oSmarty->setCompileDir('tpl_c');
        $oSmarty->setTemplateDir('tpl');
     
        $tableau = array(
            'mon_tableau' => 
            array(
                0 => 
                    array(
                      'id_product' => '1',
                      'variable' => true
                    ),
                1 => 
                    array(
                      'id_product' => '2',
                      'variable' => true
                    ),
                2 => 
                    array(
                      'id_product' => '5',
                      'variable' => 0
                    )
            )
        );
     
        $oSmarty->assign('tableau', $tableau); 
     
        $oSmarty->display('index.tpl');;
    2 méthodes possibles :

    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
    {foreach $tableau as $mon_tableau}
        {section name=idx_2 loop=$mon_tableau}
           <p>id_product: {$mon_tableau[idx_2].id_product}<br />
            variable: {$mon_tableau[idx_2].variable}<br />
           </p>
        {/section}
    {/foreach}
     
    <!-- ou encore... -->
     
    {assign var=tableau value=$tableau.mon_tableau}
     
    {section name=idx_1 loop=$tableau}
       <p>id_product: {$tableau[idx_1].id_product}<br />
        variable: {$tableau[idx_1].variable}<br />
       </p>
    {/section}
    Affiche :
    id_product: 1
    variable: 1

    id_product: 2
    variable: 1

    id_product: 5
    variable: 0


    id_product: 1
    variable: 1

    id_product: 2
    variable: 1

    id_product: 5
    variable: 0
    Voilà... c'est chiant parce qu'il y a un tableau associatif en premier en l'occurence "mon_tableau".

    Je te conseille de simplifier la structure en php en limitant si possible le nombre de tableaux imbriqués.

    @+

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Effectivement tes deux méthodes fonctionnent merci !

    J'ai bien les infos du tableau qui s'affichent, en revanche il m'affiche également deux erreurs : "Notice: Undefined index: id_product" et "Notice: Undefined index: variable".

    Pourquoi m'affiche t-il cette erreur alors qu'il trouve bien les données de mon tableau ?

  18. #18
    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
    Tu as cela lorsque les indexs ne sont pas rigoureusement 1,2,3,4... tu dois avoir des "trous" dans tes indexs...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Ah ok!

    Je pense que je vais résolument revoir le fonctionnement des tableaux ça ne me fera pas de mal...

    Je vais également suivre tes conseils pour modifier la structure de mon tableau !!

    Un grand merci pour ta précieuse aide !

    Bonne continuation.

  20. #20
    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
    De rien, bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSTL] boucle forEach pour deux liste en même temps
    Par ruud002 dans le forum Taglibs
    Réponses: 1
    Dernier message: 28/09/2006, 15h54
  2. [Tableaux] Boucle foreach inbriquée
    Par nebil dans le forum Langage
    Réponses: 17
    Dernier message: 10/09/2006, 11h40
  3. [C# VS 2005] Collection et boucle foreach
    Par SDragon dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/07/2006, 19h43
  4. [C# 1.1]Boucles foreach imbriquees
    Par Nip dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/04/2006, 16h35
  5. [Tableaux] la boucle foreach
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 09/03/2006, 17h29

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