From 23dea242e3cbd82f54524e415bac06e4846bb853 Mon Sep 17 00:00:00 2001
From: RastaPopoulos <rastapopoulos@spip.org>
Date: Sun, 14 Mar 2021 21:34:01 +0100
Subject: [PATCH] =?UTF-8?q?Dans=20l'API=20g=C3=A9n=C3=A9rique=20pour=20tou?=
 =?UTF-8?q?t=20objet=20:=20passer=20=C3=A0=20calculer=5Frubrique=5Fif=20au?=
 =?UTF-8?q?ssi=20l'info=20de=20quel=20objet=20on=20vient=20de=20modifi?=
 =?UTF-8?q?=C3=A9=E2=80=A6=20C'est=20quand=20m=C3=AAme=20une=20fonction=20?=
 =?UTF-8?q?qui=20teste=20une=20modif=20qui=20vient=20d'=C3=AAtre=20effectu?=
 =?UTF-8?q?=C3=A9e,=20et=20on=20n'avait=20pas=20l'info=20de=20quoi.=20Du?=
 =?UTF-8?q?=20coup=20=C3=A7a=20permet=20de=20tester=20les=20vrais=20statut?=
 =?UTF-8?q?s=20consid=C3=A9r=C3=A9s=20publi=C3=A9s=20de=20CET=20objet=20pr?=
 =?UTF-8?q?=C3=A9cis,=20pas=20un=20truc=20en=20dur.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/action/editer_objet.php |  8 +++++++-
 ecrire/inc/rubriques.php       | 37 +++++++++++++++++++++++++++++-----
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/ecrire/action/editer_objet.php b/ecrire/action/editer_objet.php
index 20c8a69a84..5a328d1e5a 100644
--- a/ecrire/action/editer_objet.php
+++ b/ecrire/action/editer_objet.php
@@ -501,7 +501,13 @@ function objet_editer_heritage($objet, $id, $id_rubrique, $statut, $champs, $con
 		include_spip('inc/rubriques');
 		//$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
 		$postdate = false;
-		calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
+		// On rajoute les infos de l'objet
+		$infos = array(
+			'objet' => $objet,
+			'id_objet' => $id,
+			'statut_ancien' => $statut,
+		);
+		calculer_rubriques_if($id_rubrique, $champs, $infos, $postdate);
 	}
 }
 
diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php
index 5b53432d16..57c1cd7569 100644
--- a/ecrire/inc/rubriques.php
+++ b/ecrire/inc/rubriques.php
@@ -46,16 +46,43 @@ if (!defined('_ECRIRE_INC_VERSION')) {
  *     Peut avoir 2 index, 'statut' étant obligatoire :
  *     - statut : indique le nouveau statut de la rubrique
  *     - id_rubrique : indiquer la rubrique dans laquelle on déplace la rubrique (son nouveau parent donc)
- * @param string $statut_ancien
- *     Ancien statut de la rubrique
+ * @param array $infos
+ *     Infos sur l'objet modifié : statut_ancien, objet, id_objet…
  * @param bool $postdate
  *     true pour recalculer aussi la date du prochain article post-daté
  * @return bool
  *     true si le statut change effectivement
  **/
-function calculer_rubriques_if($id_rubrique, $modifs, $statut_ancien = '', $postdate = false) {
+function calculer_rubriques_if($id_rubrique, $modifs, $infos = array(), $postdate = false) {
 	$neuf = false;
-	if ($statut_ancien == 'publie') {
+	
+	// Compat avec l'ancienne signature
+	if (is_string($infos)) {
+		$infos = array('statut_ancien' => $infos);
+	}
+	if (!isset($infos['statut_ancien'])) {
+		$infos['statut_ancien'] = '';
+	}
+	
+	// On recherche quels statuts tester
+	if (
+		isset($infos['objet'])
+		and include_spip('inc/filtres')
+		and $declaration_statut = objet_info($infos['objet'], 'statut')
+		and is_array($declaration_statut)
+	) {
+		foreach ($declaration_statut as $champ_statut) {
+			if ($champ_statut['champ'] == 'statut') {
+				$statuts_publies = array_map('trim', explode(',', $champ_statut['publie']));
+				break; // stop on a trouvé le bon champ
+			}
+		}
+	}
+	else {
+		$statuts_publies = array('publie');
+	}
+	
+	if (in_array($infos['statut_ancien'], $statuts_publies)) {
 		if (isset($modifs['statut'])
 			or isset($modifs['id_rubrique'])
 			or ($postdate and strtotime($postdate) > time())
@@ -69,7 +96,7 @@ function calculer_rubriques_if($id_rubrique, $modifs, $statut_ancien = '', $post
 		} elseif (isset($modifs['id_rubrique'])) {
 			$neuf |= publier_branche_rubrique($modifs['id_rubrique']);
 		}
-	} elseif (isset($modifs['statut']) and $modifs['statut'] == 'publie') {
+	} elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) {
 		if ($postdate) {
 			calculer_prochain_postdate(true);
 			$neuf |= (strtotime($postdate) <= time()); // par securite
-- 
GitLab