Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2007, 11h50   #1
Invité de passage
 
Inscription : mai 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 7
Points : 1
Points : 1
Par défaut 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 :
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 :
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 :
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
julwarior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 11h19   #2
Invité de passage
 
Inscription : mai 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 7
Points : 1
Points : 1
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
julwarior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 13h15   #3
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Bonjour,

Citation:
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 :
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

@+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 13h35   #4
Invité de passage
 
Inscription : mai 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 7
Points : 1
Points : 1
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 :
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 :
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 ^^
julwarior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h22   #5
Invité de passage
 
Inscription : mai 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 7
Points : 1
Points : 1
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 :
<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 :
<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
julwarior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h29   #6
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Comme ça ?

Code :
<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.
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h32   #7
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Non tu as raison, j'ai refait des tests et effectivement Field contient bien le libellé de ta colonne.
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h56   #8
Invité de passage
 
Inscription : mai 2007
Messages : 7
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mai 2007
Messages : 7
Points : 1
Points : 1
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 )
julwarior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 15h31   #9
Membre Expert
 
Avatar de eric.pommereau
 
Homme ERIC POMMEREAU
Ingénieur intégration
Inscription : décembre 2004
Messages : 683
Détails du profil
Informations personnelles :
Nom : Homme ERIC POMMEREAU
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Ingénieur intégration
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 683
Points : 1 294
Points : 1 294
Oui c'est logique, la clé 'libellé' est crée par toi après récupération du champ field:
Code PHP :
$liste_champs[] = array("libelle" => $champs->Field, "type"  => $champs->Type);

Parfait... @+
eric.pommereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h53.


 
 
 
 
Partenaires

Hébergement Web