Bonjour,
Je viens de faire une mise à jour SPIP 4.2.8 > 4.3, et ça se passe super, merci pour ces mises à jour régulières !
J’ai toutefois un problème sur une boucle en particulier qui ne fonctionne plus. Cette boucle mettait en œuvre un critère maison calqué sur le modèle du critère {distancefrom}
du plugin GIS.
En fait, la boucle fonctionne sans critère de pagination, mais dès que j’ajoute un critère de pagination, cela provoque l’erreur : Erreur d’exécution ... File C:\...\ecrire\req\mysql.php Line 1054 : Unknown column 'distance' in 'having clause'
Sans le critère de pagination, la requête générée est la suivante :
SELECT ROUND((6371 * acos( cos( radians(45.453056335449) ) * cos( radians( trucs.latitude ) ) * cos( radians( trucs.longitude ) - radians(5.8841671943665) ) + sin( radians(45.453056335449) ) * sin( radians( trucs.latitude ) ) ) ), 1) AS distance
FROM spip_trucs AS `trucs`
WHERE (trucs.statut = 'publie')
AND 1=1
AND (trucs.type_obj = 'topo')
AND NOT((trucs.id_commune = 36518))
HAVING distance is null or distance <= 20
ORDER BY distance
Je me demande s’il peut y avoir un lien avec cette évolution mentionnée dans la doc de sortie de SPIP 4.3 :
Changements :
- Optimisation des boucles avec pagination, en forçant une clause limit automatique dessus
Si c’est lié, y a t-il une parade ?
Le code du critère :
function critere_ardistancefrom_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$id_table = $boucle->id_table;
$primary = $boucle->primary;
$objet = objet_type($id_table);
if ($id_table == 'trucs') {
$params = $crit->param;
// 3 critères obligatoires
if ((is_countable($crit->param) ? count($crit->param) : 0) != 3) {
echo "Nb d'arguments incorrect (".count($params).") !<br><br>";
print_r($params);
die();
}
$pointRef = calculer_liste($crit->param[0], [], $boucles, $boucles[$idb]->id_parent);
$operateur = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
$distance = calculer_liste($crit->param[2], [], $boucles, $boucles[$idb]->id_parent);
// Tableau avec lat et lng
$boucle->hierarchie .= '$pointRef = '.$pointRef.';';
// L'opérateur doit exister dans une liste précise
$boucle->hierarchie .= '$operateur_distance = trim('.$operateur.');';
$boucle->hierarchie .= 'if (!in_array($operateur_distance, array("=","<",">","<=",">="))){ $operateur_distance = false; }';
// Valeur pour la distance
$boucle->hierarchie .= '$distance = '.$distance.';';
$boucle->select[] = '".(!$pointRef ? "\'\' as distance" : "ROUND((6371 * acos( cos( radians(".$pointRef["lat"].") ) * cos( radians( trucs.latitude ) ) * cos( radians( trucs.longitude ) - radians(".$pointRef["lng"].") ) + sin( radians(".$pointRef["lat"].") ) * sin( radians( trucs.latitude ) ) ) ), 1) AS distance")."';
$boucle->having[] = '((!$pointRef or !$operateur_distance or !$distance) ? "1=1" : "distance is null or distance $operateur_distance ".sql_quote($distance))';
$boucle->order[] = "'distance'";
}
}
Julien