La plupart des propriétés de la classe Boucle attendent des chaînes contenant du PHP qui sera évalué à la fin.
Ainsi de $boucle->where, join, having, hierarchie, order, etc.
Et là, tout seul dans son coin, ya $boucle->select qui prend une chaîne normale directement à mettre dans le SQL !
Donc WTF : pourquoi cette propriété n'attend-t-elle pas aussi du PHP à évaluer ?
Et du coup : je fais comment moi si pour l'une des valeurs de select, je dois utiliser des paramètres d'un critère, et que donc dans le code du critère je n'ai aucun scalaire sous la main ?
J'ai besoin de pouvoir faire :
$boucle->select = "'des_opérations_de_math('.$point['lat'].') - autres_opérations('.$point['lon'].') as distance'";
Ce qui est impossible puisque pas le droit de faire une "chaîne de PHP".
Pourquoi est-ce que la grande majorité de la requête SQL finale est générée dynamiquement à partir du PHP évalué à la fin, SAUF le "select" qui lui est forcément "en dur" dès le début ? Pourquoi tant de haine ?
S'il n'y a pas de raison valable, je pense qu'il faudrait trancher la tête de quelqu'un.
Et s'il y en a une, trancher la langue de ceux qui disent n'importe quoi. Regarde la fonction critere_parinverse, tu y trouveras des exemples de ce que tu veux faire; comme quoi c'est possible.
Super, ça va m'aider un peu, je vais peut-être réussir à finir mon critère pour GIS, merci !
Ceci dit, je ne suis pas si fou que ça, malgré l'heure tardive qu'il était.
Si je comprends bien le code que j'ai trouvé :
$boucle->select[] = "\".sql_multi('".$texte."', \$GLOBALS['spip_lang']).\"";
Il semblerait donc que, contrairement aux autres propriétés où ce sont des vraies chaînes de PHP complet qui sera évalué, il s'agit là d'une sorte de hack comme pour les injections SQL ! On termine une *double quote* qui apparemment serait utilisée par le compilateur (mais personne n'est censé le savoir !) puis on injecte du code, et on rouvre la double quote.
Il y a donc bien un traitement différent du select par rapport aux autres, et par ailleurs, si le code du compilateur est modifié pour utiliser une simple quote ou autre : tout est pété. C'est donc assez fragile, même si pour l'instant ça va marcher.
Je vais bien sûr utiliser cela, puisque pas d'autres moyens, et ça va bien m'aider... Mais c'est quand même à noter.
Il y a de fortes raisons pour que le select soit traité ainsi, et quand les cas particuliers comme le tien sont apparu, on a traité ça dérogatoirement.
Ce code est effectivement fragile et devrait être réécrit, probablement en dédoublant le champ select dans la structure de données (un pour les statitques et un pour les dynamiques). Mais vu comment on est reçu quand on essaye de nettoyer le code, je m'en suis abstenu.