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] Tableau associatif


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut [Smarty] Tableau associatif
    Bonjour

    Dans le cadre de mon stage, je dois créer un module recherche multi-critères dans une base de données.
    A l'aide d'un menu déroulant (MD), l'utilisateur sélectionne le critère de recherche désiré. Puis avec un autre MD, il sélectionne le critère de comparaison (contient, commence par, fini par, supérieur ou égal .....). Enfin, il remplit un champ texte dans lequel il indique ce qu'il souhaite recherché.

    Jusque là, ça marche, je recherche tout d'abord dans la table les différents critères de recherche avec une requête MySQL, idem pour le critère de comparaison. J'assigne tout ça à ma template Smarty, laquelle les affiche sans problème.

    Fichier searchbdd.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
    function Renvoi_Liste_Champs($id_table) 
    {
       // récupération de la liste des champs
       $resultat = mysql_query("SHOW COLUMNS FROM BDD_$id_table");
       while ($champs = mysql_fetch_object($resultat))
          $liste_champs[] = array("libelle" => $champs->Field, 
    	                          "type"  => $champs->Type);
     
       return $liste_champs;
    }
     
    $liste_criteres = Renvoi_Liste_Champs($id_table);
     
    $req_menu = "SELECT id, TypeRech FROM Type_Recherche"; // Récupération des comparatifs.
    $resultat_menu = mysql_query($req_menu);
    while($val2 = mysql_fetch_object($resultat_menu))
    	$liste[]=$val2->TypeRech;
     
    /*
     * blablabla ^^
     */
     
    $smarty->assign("Liste_Criteres", $liste_criteres);
    $smarty->assign("Liste_Comparatifs", $liste);
    Fichier searchbdd.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
    // Création d'un tableau, rien de bien méchant ^^
    <td>
        <select name="Choix_Critere">
            <option value="-1" style="background-color:#FFFFFF">Tous les critères</option>
            {foreach item=Critere from=$Liste_Criteres}
            <option value="{$Critere}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;&nbsp;{$Critere.libelle}</option>
            {/foreach}
        </select>
    </td>
    <td>
        <select name="Choix_Comparatif">
            <option value="-1" style="background-color:#FFFFFF">Tous les comparatifs</option>
            {foreach item=Comparatif from=$Liste_Comparatifs}
            <option value="{$Comparatif}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;&nbsp;{$Comparatif}</option>
            {/foreach}
        </select>
    </td>

    Et mon problème apparaît maintenant.
    A la suite de mon tableau, j'ai un bouton tout ce qu'il y a de plus classique. Lorsque je clique dessus, je "retourne" dans mon fichier php afin de créer dynamiquement la requête qui sera lancée, en fonction de ce qu'a sélectionné l'utilisteur.
    Ca marche super pour le comparatif, je le récupère sans problème, cependant je ne parviens pas à récupérer la valeur du critère de recherche

    Fichier searchbdd.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
    // Juste parce que j'aime pas avoir des choix qui prennent 40 caractères ^^
    switch($Choix_Comparatif)
    {
    	case "Contient" : $Num_Comp = 1; break;
    	case "Commence par" : $Num_Comp = 2; break;
    	case "Fini par" : $Num_Comp = 3; break;
    	case "Superieur à" : $Num_Comp = 4; break;
    	case "Inferieur à" : $Num_Comp = 5; break;
    	case "Superieur ou egal à" : $Num_Comp = 6; break;
    	case "Inferieur ou egal à" : $Num_Comp = 7; break;
    	case "Entre" : $Num_Comp = 8; break;
    }
     
    if(isset($_REQUEST['Valider']))
    {
    	if(($critere != "") && ($Choix_Critere != "-1") && ($Choix_Comparatif != "-1"))
    	{
    		switch($Num_Comp)
    		{
    			case 1 : // Critère ---> "Contient"
    			case 2 : // Critère ---> "Commence par"
    				$requete = 'SELECT * FROM BDD_'.$id_table.' WHERE '.$Choix_Critere["libelle"].' LIKE "'.$critere.'%" ';
                                                       // Tests
    			            print_r($Choix_Critere["libelle"] .'<br>');
    			            print_r($requete);
    			            break;
    			case 3 : // Critère ---> "Fini par"
    			case 4 : // Critère ---> "Supérieur à"
    			case 5 : // Critère ---> "Inférieur à"
    			case 6 : // Critère ---> "Supérieur ou égal à"
    			case 7 : // Critère ---> "Inférieur ou égal à"
    			case 8: // Critère ---> "Entre"
            }
        }
    }

    Vouala.
    J'ai essayé :
    1/ $Choix_Critere --> affiche "Array"
    2/ $Choix_Critere.libelle --> affiche "Arraylibelle"
    3/ $Choix_Critere->libelle --> affiche rien du tout ^^
    4/ $Choix_Critere["libelle"] --> affiche "A", et je sais pas pourquoi xD

    Je débute en php, et mon entreprise m'a fait découvrir smarty, donc je débute encore plus là dedans ^^ donc soyez indulgents

    Merci d'avance si quelqu'un trouve la solution à mon problème

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Personne ?

    Je suis assez embété, j'ai testé diverses solutions trouvées sur le net, et aucune ne fonctionne. Quelque chose doit m'échapper, mais je ne vois pas quoi.

    Ca m'embête bien, parce que tant que je n'ai pas résolu ce problème, je ne peux pas avancer dans mon projet

  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
    Bonjour,

    J'ai essayé :
    1/ $Choix_Critere --> affiche "Array"
    2/ $Choix_Critere.libelle --> affiche "Arraylibelle"
    3/ $Choix_Critere->libelle --> affiche rien du tout ^^
    4/ $Choix_Critere["libelle"] --> affiche "A", et je sais pas pourquoi xD
    C'est dans Smarty que tu galères ou bien en PHP ?

    Dans ton code PHP tu utilises $Choix_Critere comme un entier
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    if(($critere != "") && ($Choix_Critere != "-1") && ($Choix_Comparatif != "-1"))

    Secundo je ne vois pas où $Choix_Critere est passé à Smarty, il y a peut être confusion entre les deux (Smarty et PHP) ?

    Ce que je te conseille...

    1. assures toi que le tableau associatif a bien été créé côté PHP (print_r(...))
    2. Pense à assigner ton tableau à ton objet smarty.
    3. utilises la console de debuggage Smarty (il suffit de mettre dans ton template la fonction: {debug} --> il ouvrira un popup) pour voir si tes données sont bien dans le 'contexte' SMARTY.
    4. La syntaxe de récupération pour ce cas de figure précis (tabelau associatif) est {$Choix_Critere.libelle}... avec des acollades.

    Sinon tu commences fort si tu débutes

    @+

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    C'est dans la partie PHP que je galère, la partie Smarty fonctionne.

    Oui, j'utilise $Choix_Critere comme un entier dans mon if, mais c'est uniquement pour tester si l'utilisateur a sélectionné un critère. Mais ensuite, pour récupérer la valeur de ce critère (donc le nom du champ correspondant dans la table), ben ça fonctionne plus ^^ (le fait de l'utiliser comme un entier).

    $Choix_Critere n'est pas passé à Smarty justement, vu que c'est le nom de mon menu déroulant. Je sais pas si ça pose problème ou pas .....

    Moi ce que je cherche à faire, c'est récupérer dans ma partie PHP la valeur du menu déroulant nommé $Choix_Critere, cette valeur étant passée à smarty par l'intermédiaire de mon tableau associatif $liste_criteres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Renvoi_Liste_Champs($id_table) 
    {
       // récupération de la liste des champs
       $resultat = mysql_query("SHOW COLUMNS FROM BDD_$id_table");
       while ($champs = mysql_fetch_object($resultat))
          $liste_champs[] = array("libelle" => $champs->Field, "type"  => $champs->Type);
     
       return $liste_champs;
    }
     
    $liste_criteres = Renvoi_Liste_Champs($id_table);
    $smarty->assign("Liste_Criteres", $liste_criteres);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <select name="Choix_Critere">
        <option value="-1" style="background-color:#FFFFFF">Tous les critères</option>
        {foreach item=Critere from=$Liste_Criteres}
        <option value="{$Critere}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;{$Critere.libelle}</option>
        {/foreach}
    </select>

    J'espère que je suis assez clair


    EDIT : j'avais bien entendu déjà fait tous les tests que tu m'as conseillés (tableau existant, debug côté smarty) avant de poster et le problème ne vient pas de là

    EDIT 2 : vi je débute dans php, enfin j'avais quelques bases quand même, mais je n'avais encore rien fait d'aussi poussé. Quand à Smarty, je connaissais même pas avant de commencer mon stage ^^

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Ah bah j'ai trouvé tout seul comme un grand ^^

    En affichant le source de ma page en "dynamique", je me suis rendu compte que toutes les options du menu déroulant portaient le même nom : "Array"
    C'est logique vu que je leur donnais le nom de mon tableau associatif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <option value="{$Critere}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;{$Critere.libelle}</option>
    Donc, en changeant cela, et en lui affectant effectivement le nom de chaque champ, ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <option value="{$Critere.libelle}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;{$Critere.libelle}</option>

    Et maintenant je peux effectivement récupérer la valeur du critère sélectionnée par l'utilsateur via la variable $Choix_Critere qui se trouve être le nom de mon menu déroulant

    Merci tout de même à toi Eric

  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
    Comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <option value="{$Critere.field}" style="background-color:{cycle values="#EAF4F7, #FFFFFF;"}">&nbsp;&nbsp;{$Critere.libelle}</option>
    En fait le champ field contient l'index de ta colonne.

  7. #7
    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
    Non tu as raison, j'ai refait des tests et effectivement Field contient bien le libellé de ta colonne.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Là, j'avoue ne pas saisir ^^
    Moi si je mets {$Critere.Field}, ben ça me renvoie une chaîne vide ^^ alors que {$Critere.libelle} me renvoie bien le nom du champ de la table.

    Enfin, ce n'est pas bien grave, ça fonctionne ^^ (enfin, ça fonctionne moyen car mon mysql_query me renvoie une erreur et je sais pas pourquoi Je vais tâcher de trouver d'où ça viens )

  9. #9
    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
    Oui c'est logique, la clé 'libellé' est crée par toi après récupération du champ field:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $liste_champs[] = array("libelle" => $champs->Field, "type"  => $champs->Type);

    Parfait... @+

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

Discussions similaires

  1. [CodeIgniter / Active Record / Smarty] Afficher un tableau associatif
    Par Fakedown dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 02/01/2014, 19h22
  2. [Smarty] Smarty : Parcourrir un tableau associatif
    Par okoweb dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 17/09/2013, 08h43
  3. asp tableau associatif
    Par rfernandez dans le forum ASP
    Réponses: 6
    Dernier message: 19/12/2003, 18h58
  4. [langage] TRI TABLEAU ASSOCIATIF
    Par proner dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2003, 16h38
  5. [langage] Réinitialiser un tableau associatif.
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2003, 16h29

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