Projet

Général

Profil

Actions

Souhaits #907

fermé

Recherche avancée sur plusieurs groupes

Ajouté par Alain Castera il y a environ 9 ans. Mis à jour il y a presque 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
Début:
06/03/2015
Echéance:
% réalisé:

100%

Temps estimé:

Description

Bonjour.
Il me serait très utile de pouvoir rechercher les membres qui appartiennent à plusieurs groupes (fonction "ET"). J'imagine que pour d'autres la fonction "OU" pourrait avoir un intérêt.

Serait-il possible d'imaginer un mécanisme de construction de la requête similaire à celui qui est utilisé pour les champs dynamiques ?

Merci pour tout ça, de toutes façons :-)
Alain


Fichiers

AdvancedMembersList.php.diff (3,29 ko) AdvancedMembersList.php.diff Alain Castera, 17/03/2015 23:35
advanced_search.tpl.diff (3,99 ko) advanced_search.tpl.diff Alain Castera, 17/03/2015 23:35
galette.css.diff (1,12 ko) galette.css.diff Alain Castera, 17/03/2015 23:35
gestion_adherents.php.diff (1,18 ko) gestion_adherents.php.diff Alain Castera, 17/03/2015 23:35
Members.php.diff (3,29 ko) Members.php.diff Alain Castera, 17/03/2015 23:35
Members.php.diff (3,32 ko) Members.php.diff Alain Castera, 18/03/2015 19:59
Members.php.diff (4,36 ko) Members.php.diff Alain Castera, 12/03/2019 17:12
members.routes.php.diff (1,27 ko) members.routes.php.diff Alain Castera, 12/03/2019 17:12
advanced_search.tpl.diff (4,45 ko) advanced_search.tpl.diff Alain Castera, 12/03/2019 17:12
AdvancedMembersList.php.diff (3,45 ko) AdvancedMembersList.php.diff Alain Castera, 12/03/2019 17:12
groups-search.tar.gz (40,3 ko) groups-search.tar.gz Alain Castera, 18/03/2019 11:53

Mis à jour par Johan Cwiklinski il y a environ 9 ans

  • Statut changé de Nouveau à Commentaire

La section "Recherche libre" de la recherche avancée permet déjà ça, non ?

Mis à jour par Alain Castera il y a environ 9 ans

Johan Cwiklinski a écrit :

La section "Recherche libre" de la recherche avancée permet déjà ça, non ?

Ben non, sauf erreur de ma part.
Un seul groupe dans la recherche simple,
uniquement des champs de la base adhérents dans la recherche free_fields.

J'ai une solution qui marche ... sauf quand on fait un "ET" et qu'un adhérent apparait à la fois dans 2 sous-groupes du groupe recherché ou dans le groupe recherché et un sous-groupe. Faut que je bosse encore un peu :-( Pour le "OU", ça marche sans pb (mais j'ai eu des soucis avec des fonctions zend db (orWhere et la substitution de ), ça nuit à l'élégance :-D
Je creuse un peu avant de livrer ça à ton appréciation.

Mis à jour par Alain Castera il y a environ 9 ans

Bon, j'en ai bavé, mais j'ai quelque chose qui semble (bien) marcher.

Les commentaires dans le fichier Members.php sont j'espère assez explicites. En gros, la méthode pour faire un "ET" (le OU est trivial) est de faire un select des id qui sont dans les groupes recherchés, de les grouper et de sélectionner ceux qui sont dans tous les groupes recherchés (du coup, c'est valable aussi pour le "OU", pas besoin de faire une construction différente).

Les problèmes commençaient lorsqu'un adhérent était à la fois dans le groupe recherché et un ou plus de ses sous-groupe, ou dans 2 ou plus de ses sous-groupe. Pour cotourner la difficulté, je fait donc des select séparés pour chacun des groupes recherchés avec la clause "group by id_adh", qui élimine ces multiplets.

Je soupçonne que cette méthode doit pouvoir être adaptée pour permettre de construire des recherches avec un niveau de sous-groupe quelconque, mais je n'y ai pas travaillé.

Il y a du nettoyage à faire sans aucun doute (voir ci-dessous), mais la mécanique tourne.
Il n'y a que des clauses standard, donc j'imagine que ça doit marcher avec toutes les moteurs (j'ai en particulier évité la clause WITH qui aurait été pratique mais pas supportée par mysql). Je n'ai pas compris le pb signalé avec postgres (bug#??? je ne sais plus, mardon !), donc une vérification s'impose.

Les fichiers diff sont joints.

Nettoyage (outre les éventuelles erreurs) :
- je ne connais pas bien le javascript, donc pour ne pas me prendre la tête j'ai créé un "btnadd_small_g" dans galette.css pour pouvoir avoir 2 champs différents avec la fonctionnalité de btnadd_small. Doit pouvoir être plus élégant.
- je en connais pas bien Zend, donc j'ai essentiellement construit mes requêtes alla mano. Il y a sans doute moyen de faire mieux.
- j'ai modifié le template et le php de advanced search en dupliquant plus ou moins la partie "free search". Mais il daoit rester quelques erreurs car j'ai un log "4 - [MembersList] Unable to get proprety `groups_search`" qui n'empêche pas la machine de tourner.
- il y a également un log "4 - [Galette\Filters\AdvancedMembersList|Pagination] Value for field `counter` should be a positive integer - (NULL) given", lui aussi sans incidence apparente, mais là je sèche un peu.

Soumis donc aux avis et tests. Je reste dispo pour travailler sur le nettoyage si ça paraît judicieux.

si ça peut aider (... d'autres que moi :-) )

Alain

Mis à jour par Alain Castera il y a environ 9 ans

Le log dans Memberlist était dû à une erreur dans Members.php : le nouveau bloc de gestion du cas groups_search doit être inséré dans le "if ( $this->_filters instanceof AdvancedMembersList ) {" qui le suit immédiatement, bien sûr.
Désolé pour cette étourderie...

Je reposte le "bon" Members.php.diff

Mis à jour par Alain Castera il y a environ 5 ans

Voici donc les patchs pour la version 0.9.2.1. L'essentiel consiste en une duplication (adaptée) de ce qui est fait pour la recherche libre.
La mécanique proprement dite de la recherche est dans Members.php, avec un long commentaire que j'espère assez explicatif (mais je sais bien qu'on ne l'est jamais assez...)
J'ai vraiment cloné ce qui était fait pour la recherche libre, et donc il y a le même bug javascript que pour celle-ci (addbutton, class tooltip, ne marche pas bien !). En version 0.9.1.2, avec btnadd_small (et le btnadd_small_g que j'avais créé par duplication), ça marchait nickel.

Tout comme la recherche simple, on est limité à un seul niveau d'imbrication (i.e. on recherche aussi dans les groupes dont le parent est est le groupe recherché, mais pas dans les ancêtres :-) ) Je crois que j'avais ouvert un ticket là-dessus il y a longtemps, mais je n'ai jamais eu le temps de cherche une solution.

Ça serait cool que ça puisse être intégré dans le code :-)

Mis à jour par Alain Castera il y a environ 5 ans

Alain Castera a écrit :

Ça serait cool que ça puisse être intégré dans le code :-)

Du coup, serait-il possible de repasser en souhait "normal" plutôt que commentaire ?

Merci au(x) développeur(s) quoi qu'il en soit ...

Mis à jour par Alain Castera il y a environ 5 ans

Du coup, je rajoute le message que je n'ai pas réussi à envoyer sur la liste, pour qu'il puisse illustrer un éventuel vote (pardon si ce n'est pas la bonne façon de procéder) :

Voilà le problème : Les adhérents peuvent appartenir à plusieurs groupes.
Pour illustrer, imaginons qu'ils appartiennent à un groupe géographique et un ou plusieurs groupes d'activité. La question est "Comment rechercher celles et ceux qui pratiquent l'activité A dans la région R" (c'est à dire appartenant à la fois à plusieurs groupes) ? Ou "Quels sont celles et ceux qui pratiquent soit l'activité A soit l'activité B" (c'est à dire appartenant à un ou plusieurs d'une liste de groupes) ?
Ça peut toujours être fait directement en sql dans la base de données, mais ce n'est pas une méthode accessible au commun des gestionnaires :-)

Depuis 4 ans, je fais évoluer une solution à ce problème de version en version (modification de la recherche avancée). Mais c'est pas si facile, car ça touche au moteur même de Galette, et par exemple le passage aux versions 0.9.x.y n'a pas été si simple, un certain nombre de fichiers ayant changé de répertoire.

Je préfèrerais donc que ce soit intégré à Galette, mais ça demanderait évidemment un peu de boulot à Johan, ne serait-ce que
pour valider ce que j'ai commis. Il me semblerait donc raisonable de ne lui demander un tel effort que si ce type de recherche est susceptible d'intéresser du monde.

Mis à jour par Johan Cwiklinski il y a environ 5 ans

  • Vote mis à https://vote.galette.eu/posts/47/rechercher-les-adherents-appartenant-a-plusieurs-groupes

Mis à jour par Johan Cwiklinski il y a environ 5 ans

  • Statut changé de Commentaire à Nouveau

Mis à jour par Johan Cwiklinski il y a environ 5 ans

Salut,

Il y a un problème avec les fichiers attachés. Il y en a plusieurs du même nom, et seule la version la plus ancienne semble exister... :(

Le plus simple pour moi, ce serait que tu passes par une pull request sur github :
  • "fork" (bouton éponyme) de galette https://github.com/galette/galette
  • récupération en local de ton fork,
  • création d'une branche (par. ex: feature/groups-search) dérivée de la branche develop de Galette (0.9.3-dev),
  • application des modifications dans le code, tests,
  • commit, puis envoi (push) des modifications sur ton fork,
  • ouverture d'une PR (se rendre sur le projet GH galette ou ton fork te donnera le lien pour le faire).

La doc (notamment http://galette.eu/documentation/fr/development/git.html) peut éventuellement aider.

Sinon, renvoie la totalité du patch dans une archive, je supprimerai ensuite les autres fichiers liés au ticket ;)

Mis à jour par Alain Castera il y a environ 5 ans

Je me suis un peu paumé dans Git, j'apprendrai... :-(
Voilà toujours une archive.
Les fichiers ".diff" sont les patch
Les fichiers ".mgs" (pour multiple group search" sont le résultat du patch, à renommer ou linker sans le ".mgs", bien sûr

Mis à jour par Alain Castera il y a environ 5 ans

Bon, j'ai essayé : https://github.com/galette/galette/pull/36

Sans garantie ...

Mis à jour par Johan Cwiklinski il y a environ 5 ans

Alain Castera a écrit :

Bon, j'ai essayé : https://github.com/galette/galette/pull/36

Sans garantie ...

Ça ne semble pas si mal ;)

Tu as évoqué des fichiers ajoutés, qui sont visiblement absents de la PR (je ne sais pas ce que tu utilises, mais si tu as pu ajouter les fichiers modifiés et les commiter, ce ne devrait pas être beaucoup plus compliqué pour les fichiers ajoutés.

Les tests sont marqués en échec... Mais en l'occurrence, il ne s'agit que de problèmes de "Coding Standards", ce sera à corriger, mais pas forcément tout de suite (je n'ai pas encore eu le loisir de me pencher sur les détails du code proposé).

Le mieux, ce serait que tu clones ton "fork" dans un dossier séparé sur la bonne branche, et que tu installes et teste Galette. S'il manque des fichiers, ou si quelque chose cloche, tu le verra rapidement :)

Mis à jour par Alain Castera il y a environ 5 ans

J'ai dû mal m'exprimer : il n'y a pas besoin de fichiers ajoutés, seulement des modifications dans les fichiers existants ...
La version que j'ai commitée a été testée et fonctionne.
Je ne comprends pas encore bien le vocabulaire de GIT, et n'ai pas encore compris comment fusionner ou pas les branches, faire l'équivalent d'un "update" svn sur ma branche pour me maintenir en phase avec 9.3, etc. Le plus simple est peut-être d'appliquer les patches du fichier archive, qui contiennent les seules modifications nécessaires (attention juste au nom du fichier engendré : appliqués "brutalement", les patches créent des fichiers avec une extension .mgs, pas la bonne bien sûr pour fonctionner)

Mis à jour par Johan Cwiklinski il y a presque 4 ans

  • Statut changé de Nouveau à Fermé
  • Assigné à mis à Alain Castera
  • Version cible mis à 0.9.4
  • % réalisé changé de 0 à 100

Fonctionnalité intégrée, à titre expérimental pour l'heure (voir 89a89ce830dfc86e3de6f4e8aa5ba1e82ec3d060)

Actions

Formats disponibles : Atom PDF