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