From b59badd9e8c42f9950603865f23967499eb251b7 Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Tue, 12 Mar 2024 18:03:16 +0100
Subject: [PATCH] fix: Corriger et optimiser la suppression de liens ayant des
 rangs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Lorsqu’on supprime un lien, par exemple un document depuis `action_supprimer_document_dist`, on appelle la fonction

```php
objet_dissocier(['document' => $id_document], '*', ['role' => '*']);
```

Si la table de lien dispose d’une colonne `rang_lien`, un recalcul
des rangs est effectué. Cependant ce recalcul s’applique pour tous les objets liés (à tort),
pas seulement ceux concernés spécifiquement par la suppression.

On corrige ce point, ce qui accélère grandement le processus de recalcul du rang
pour ces cas là, en plus de corriger un mauvais calcul de rang.
---
 ecrire/action/editer_liens.php | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/ecrire/action/editer_liens.php b/ecrire/action/editer_liens.php
index 771a788b12..699c569a1f 100644
--- a/ecrire/action/editer_liens.php
+++ b/ecrire/action/editer_liens.php
@@ -647,7 +647,7 @@ function lien_rang_where($table_lien, $primary, $id_source, $objet, $id_objet, $
  */
 function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = null) {
 
-	$retire = [];
+	$retires = [];
 	$dels = 0;
 	$echec = false;
 	if (is_null($cond)) {
@@ -704,7 +704,7 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond =
 					} else {
 						$echec = true;
 					}
-					$retire[] = [
+					$retires[] = [
 						'source' => [$objet_source => $l[$primary]],
 						'lien' => [$l['objet'] => $id_o],
 						'type' => $l['objet'],
@@ -725,10 +725,12 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond =
 	}
 	// si on a supprime des liens, on reordonne les liens concernes
 	if ($dels) {
-		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
+		foreach ($retires as $retire) {
+			lien_ordonner($objet_source, $primary, $table_lien, $id, [$retire['type'] => [$retire['id']]]);
+		}
 	}
 
-	pipeline('trig_supprimer_objets_lies', $retire);
+	pipeline('trig_supprimer_objets_lies', $retires);
 
 	return ($echec ? false : $dels);
 }
-- 
GitLab