Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
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 15/06/2011, 22h51   #1
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
Par défaut [Doctrine] Permettre à un filtre de rechercher dans 2 champs de la bdd

Bonjour,

Je réalise un annuaire via symfony qui permet de stocker des structures dans le secteur social.
Beaucoup de ces structures ont un nom + un sigle, par exemple : Caisse des Allocations Familiales = CAF.
J'ai mis en place un moteur complet qui permet de faire une recherche sur le nom de la structure mais aussi sur les thématiques qu'elle traite grâce aux filtres Symfony.
Suivant l'internaute qui se sert de l'annuaire, certains vont chercher avec le nom complet d'autres avec le sigle.

J'aurai donc souhaité que le filtre sur le nom, recherche dans le champ "nom" de la bdd mais également dans le champ "sigle".

Je voudrai savoir s'il est possible de faire cette modif en retouchant les filtres ou dans le generator.yml peut-être ?

Voir ci-joint ça sera peut-être plus clair !

Merci d'avance,

cli16--
Images attachées
Type de fichier : jpg filtre.jpg (109,0 Ko, 8 affichages)
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 23h08   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Si dans ton DQL tu fais un truc dans le style
Code :
->where("concat_ws(' ', s.nom, s.sigle) like ?, $valeurRecherchee)
Tu devrais être proche de ce que tu veux.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 13h54   #3
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
Merci Michel pour la réponse.
Désolée pour la question bête mais... le DQL ça correspond à quoi ?
Etant donné que les filtres sont gérés directement par les modules admin de Symfony, je n'ai pour le moment écrit aucune requête.

Le code que tu me proposes est-il à ajouter dans PartenaireFormFilter.class.php ?

Merci,

cli16--
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h10   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Arghhh !!!

Dans de l'auto-généré, j'aurais dû m'en douter.

Moins simple, c'est sur.

Peut-être en modifiant dans le filtre.

Le DQL est le langage d'interrogation de doctrine.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h38   #5
Membre chevronné
 
Avatar de Herode
 
Développeur Web
Inscription : mars 2005
Messages : 769
Détails du profil
Informations personnelles :
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2005
Messages : 769
Points : 788
Points : 788
Les filtres utilisent des méthodes implicites par défaut pour leurs requêtes. Ces méthodes ont un nom sur le format addNomWidgetColumnQuery.

Par conséquent, si tu veux ajouter ou surcharger un critère, tu définis ou tu redéfinis la méthode ad hoc dans la classe de ton filtre.

Par exemple, si ton widget s'appelle nom_structure :
Code :
1
2
3
4
5
6
7
8
9
 public function addNomStructureColumnQuery(Doctrine_Query $query, $field, $values) {
	if (!$values) {
	    return $query;
	}
 
	$rootAlias = $query->getRootAlias();
	return $query
		->orWhere("$rootAlias.sigle ULIKE ?", $values);
    }
Herode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h27   #6
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
J'ai essayé la solution de Herode mais j'obtiens une erreur de paramètre, peut-être ai-je fait une boulette

Mon code dans lib/filter/PartenaireFormFilter.class.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
public function addNomColumnQuery(Doctrine_Query $query, $field, $values) {
	if (!$values) {
	    return $query;
	}
 
	$rootAlias = $query->getRootAlias();
	return $query
		->orWhere("$rootAlias.sigle ULIKE ?", $values);
 
 
    }
Et voici l'erreur (qui arrive directement au chargement du listing des partenaires) :

Code :
1
2
500 | Internal Server Error | Doctrine_Connection_Mysql_Exception
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Merci pour vos lumières !
cli16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h40   #7
Membre à l'essai
 
Inscription : mai 2003
Messages : 69
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 69
Points : 20
Points : 20
Plus d'erreur avec le code ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function addNomColumnQuery($query, $field, $value)
     {
 
         $valor = array_values($value);
 
         if (!empty($valor[0]))
         {
 
             $query
             ->where(sprintf('%s.nom like ?', $query->getRootAlias()), '%'.$valor[0].'%')
             ->orWhere(sprintf('%s.sigle like ?', $query->getRootAlias()), '%'.$valor[0].'%')
             ;
 
         }
 
     }
Merci à Michel et Herode pour leur précieuse aide.

cli16--
cli16 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 21h23.


 
 
 
 
Partenaires

Hébergement Web