From 70d3be6a0ce0745f8e5c9f9f3d6f918cad6ef1e5 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 2 Jul 2021 15:50:31 +0200
Subject: [PATCH] Desormais `{par num xxx}` integre automatiquement un `{par
 sinum xxx}` avant, ce qui permet de classer les lignes sans rang a la fin par
 defaut. La combinaison `{!par sinum xxx}{par num xxx}` permet de retrouver le
 classement historique avec les lignes sans rang en premier (On integre un peu
 d'intelligence sur le critere sinum pour eviter de dupliquer l'expression
 CASE(...) dans ce dernier cas)

+ fix sur sql genere par le sinum qui bizarrement ne l'empechait pas de marcher
---
 ecrire/public/criteres.php | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 71f6d154d3..94086a9d12 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -890,9 +890,13 @@ function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $cham
 	if ($suite !== "''") {
 		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
 	}
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
-	$boucle->select[] = $texte . " AS $as";
-	$order = "'$as'";
+	$asnum = 'num' . ($boucle->order ? count($boucle->order) : "");
+	$boucle->select[] = $texte . " AS $asnum";
+
+	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
+	$orderassinum = trim($orderassinum, "'");
+
+	$order = "'$orderassinum, $asnum'";
 	return $order;
 }
 
@@ -924,8 +928,23 @@ function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $ch
 	if ($suite !== "''") {
 		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
 	}
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
+
+	$as = false;
+	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
+	foreach ($boucle->select as $s) {
+		if (strpos($s, $select) === 0) {
+			$as = trim(substr($s, strlen($select)));
+			if (!preg_match(",\W,", $as)) {
+				break;
+			}
+			$as = false;
+		}
+	}
+
+	if (!$as) {
+		$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
+		$boucle->select[] = $select . $as;
+	}
 	$order = "'$as'";
 	return $order;
 }
-- 
GitLab