Je travaille à faire avancer mon Dolibarr de la version 15 à la version 20 et j’en profite pour faire passer le PHP de la V7.4 à la 8.1.
Pour Dolibarr, aucun problème majeur, c’est toujours un plaisir de travailler avec cet ERP. Pour tous mes modules complémentaires codés façon bricolage, le chantier est plus important mais là n’est pas le sujet.
Ma question est assez simple. J’avais en V15 php 7.4 un Extrafields en « Liste issue d’une table » filtrée sur une autre table : plus explicitement la liste des « user » appartenant à un groupe spécifique.
Le codage était le suivant :
user:login:rowid::rowid IN ($SEL$ fk_user FROM llx_usergroup_user WHERE fk_usergroup = 6)
Malheureusement, ce codage ne marche plus sur la V20 en php 8.1.
J’ai eu beau chercher, je ne trouve pas de solution.
Merci d’avance à ceux qui voudront bien apporter leur pierre à mon édifice.
Error in request SELECT rowid as rowid, login FROM llx_user WHERE Filter error - Bad syntax of the search string ORDER BY login You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'error - Bad syntax of the search string ORDER BY login' at line 1. Check setup of extra parameters.
Je ne savais pas qu’il y avait un bug sur la V20.0.0 mais je suis sur la V20.0.1.
Concernant la syntaxe, effectivement j’avais repéré cette évolution et j’ai pu faire évoluer d’autres listes « simples », c’est à dire en « monotable » pour moi.
Mais sur ce filtre qui utilise 2 tables je sèche. L’infobulle de la V20.0.1 ne parle même plus de cette fonction SELECT.
La fonction aurait pu être supprimée ou bien il s’agit simplement de cette syntaxe USF que je n’arrive pas à utiliser ?
@Naivyls : J’avais le même souci et pour ton besoin, il me semble que la syntaxe USF serait : user:login:rowid::(rowid:IN:$SEL$ fk_user FROM llx_usergroup_user WHERE fk_usergroup = 6)
mettre le filtre complet entre parenthèses, la requête SELECT n’est plus entre parenthèses.
le champ en 1ère position, l’opérateur est en seconde et la requête en 3ème.
Chez moi ça fonctionne.
@ksar J’ai vu le correctif mais je n’ai pas trouvé la référence au bug pour comprendre. J’ai cherché la raison car le correctif a ajouté une limite à 5 éléments (dans explode) dans les champs issus d’une table, alors qu’avant il y avait une 6ème et 7ème position pour le filtre par catégorie.
Ce qui veut dire que les éléments 5 à 7 en partant de 0 commentés en-dessous ne sont plus d’actualité, ni le code pour gérer le filtre par catégorie (p.ex extrafields.class.php:1409). Vont t’ils être remis ou cette limite de 5 est définitive ?
@all Je n’ai pas réussi à mettre une sous-requête avec la syntaxe USF.
Est-ce que vous savez si c’est possible ? J’ai besoin de filtrer les contacts par une catégorie dont l’id est indiqué dans les réglages d’un module maison, je ne la mets pas en dur, car elle change chaque année et je veux que les personnes qui utilisent cette instance de dolibarr puissent l’ajuster en autonomie sans toucher le code des extrafields.
En attendant , j’ai mis la requête dont j’ai besoin dans un hook « showOptionals » mais je préférerais pouvoir l’indiquer directement dans l’extrafield si c’est possible.
En 16.0.4, la syntaxe qui fonctionnait est : socpeople:firstname|lastname:rowid::rowid IN ( $SEL$ fk_socpeople FROM llx_categorie_contact AS c WHERE c.fk_categorie = ( $SEL$ value from llx_const WHERE name = ‹ CREA_SETUP_CAT_PROF › ) )
Sans sous-requête, ce serait aussi possible via $conf->global, mais ce n’est pas accessible me semble t’il dans les champs de type sellist.
Bonjour @Naivyls, @ksar, @nat
J’ai fait une petite PR pour faire fonctionner les filtres des sellist et chkbxlst (list issue d’une table à N choix) sur la vue list.php, maintenant que j’ai compris la nouvelle syntaxe grâce à vos message ainsi que ceux de : Utilisation de $ID$ et $SEL$ dans une requete
Pourriez-vous la tester sur vos installations et confirmer si ça marche ?
Concernant les sous-requêtes, voici mon extrafield en chkbxlist, il marche bien maintenant : socpeople:lastname:rowid::((fk_soc:IN:$SEL$ fk_soc FROM llx_facture WHERE $ID$= rowid ) AND (rowid:IN:$SEL$ fk_socpeople FROM llx_categorie_contact as cc WHERE cc.fk_categorie = 2 OR cc.fk_categorie = 3 OR cc.fk_categorie = 4 ))
Ca me permet de ne sélectionner les contacts/adresses que du client de la facture et qui appartiennent aux catégories 2,3 et 4
Par contre impossible de faire un WHERE cc.fk_categorie IN (2,3,4) dans la dernière partie, j’ai du faire ça avec des OR. Et j’ai pas osé faire une sous-requête sur llx_categorie pour trier par le label plutôt que l’id ! Pas idéal mais ça marche.
J’espère juste que ça va pas changer à chaque mise à jour et rajouter encore plus de :, ça commence déjà à être ardu …