Browse Source

Un critere {par_ordre_liste champ,#LISTE{...}} qui permet d'ordonner explicitement les resultat d'une boucle selon un tableau

Cela donne le meme resultat que si on utilise un {champ IN ...} sauf que
- le critere IN classe uniquement par defaut selon le tableau fournit, et cet ordre est ecrase si on a un autre critere, ou une jointure
- le {par_ordre_liste} permet de separer la selection du classement
- on peut le combiner avec d'autres {par...} dans l'ordre que l'on veut

Cas concret d'utilisation : voir #2693
pull/102/head
Cerdic 9 months ago
parent
commit
1b6c328268
  1. 32
      ecrire/public/criteres.php
  2. 21
      ecrire/public/fonctions.php

32
ecrire/public/criteres.php

@ -1074,6 +1074,38 @@ function critere_inverse_dist($idb, &$boucles, $crit) {
}
}
/**
* {par_ordre_liste champ,#LISTE{...}} pour trier selon une liste
* @param $idb
* @param $boucles
* @param $crit
* @return array|string
*/
function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
$boucle = &$boucles[$idb];
$sens = $collecte = '';
if ($crit->not){
$sens = " . ' DESC'";
}
$crit2 = clone $crit;
$crit2->not = false;
$crit2->param = [reset($crit->param)];
$res = critere_parinverse($idb, $boucles, $crit2);
// erreur ?
if (is_array($res)){
return $res;
}
$_order = array_pop($boucle->order);
$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
}
// https://code.spip.net/@critere_agenda_dist
function critere_agenda_dist($idb, &$boucles, $crit) {
$params = $crit->param;

21
ecrire/public/fonctions.php

@ -323,3 +323,24 @@ function tri_champ_select($t) {
return "''";
}
/**
* Fonction de mise en forme utilisee par le critere {par_ordre_liste..}
* @see critere_par_ordre_liste_dist()
*
* @param array $valeurs
* @param string $serveur
* @return string
*/
function formate_liste_critere_par_ordre_liste($valeurs, $serveur = ''){
if (!is_array($valeurs)){
return '';
}
$f = sql_serveur('quote', $serveur, true);
if (!is_string($f) or !$f){
return '';
}
$valeurs = implode(',', array_map($f, array_unique($valeurs)));
return $valeurs;
}
Loading…
Cancel
Save