From 024383f4da2b409221d231f907d085241ca8e9c1 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 28 May 2010 20:26:10 +0000
Subject: [PATCH] report de [15711] et [15712]

---
 ecrire/action/editer_article.php |  6 ++-
 ecrire/inc/rubriques.php         | 90 ++++++++++++++++++++++----------
 2 files changed, 65 insertions(+), 31 deletions(-)

diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php
index 92d4269bd2..cf8dbd425c 100644
--- a/ecrire/action/editer_article.php
+++ b/ecrire/action/editer_article.php
@@ -225,7 +225,8 @@ function instituer_article($id_article, $c, $calcul_rub=true) {
 			'args' => array(
 				'table' => 'spip_articles',
 				'id_objet' => $id_article,
-				'action'=>'instituer'
+				'action'=>'instituer',
+				'statut_ancien' => $statut_ancien,
 			),
 			'data' => $champs
 		)
@@ -255,7 +256,8 @@ function instituer_article($id_article, $c, $calcul_rub=true) {
 			'args' => array(
 				'table' => 'spip_articles',
 				'id_objet' => $id_article,
-				'action'=>'instituer'
+				'action'=>'instituer',
+				'statut_ancien' => $statut_ancien,
 			),
 			'data' => $champs
 		)
diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php
index 478737c219..beed991acb 100644
--- a/ecrire/inc/rubriques.php
+++ b/ecrire/inc/rubriques.php
@@ -77,45 +77,77 @@ function publier_branche_rubrique($id_rubrique)
 	return $id_pred != $id_rubrique;
 }
 
-// Fonction a appeler lorsqu'on depublie ou supprime qqch dans une rubrique
-// retourne Vrai si le statut change effectivement
+/**
+ * Fonction a appeler lorsqu'on depublie ou supprime qqch dans une rubrique
+ * retourne Vrai si le statut change effectivement
+ *
+ * http://doc.spip.org/@depublier_branche_rubrique_if
+ *
+ * @param int $id_rubrique
+ * @return bool
+ */
+function depublier_branche_rubrique_if($id_rubrique){
+	$date = date('Y-m-d H:i:s'); // figer la date
+
+	#	spip_log("depublier_branche_rubrique($id_rubrique ?");
+	$id_pred = $id_rubrique;
+	while ($id_pred) {
 
-// http://doc.spip.org/@depublier_branche_rubrique_if
-function depublier_branche_rubrique_if($id_rubrique)
-{
+		if (!depublier_rubrique_if($id_pred,$date))
+			return $id_pred != $id_rubrique;
+		// passer au parent si on a depublie
+		$r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_pred");
+		$id_pred = $r['id_parent'];
+	}
+
+	return $id_pred != $id_rubrique;
+}
+
+/**
+ * Depublier une rubrique si aucun contenu publie connu
+ * retourne true si la rubrique a ete depubliee
+ *
+ * @param int $id_rubrique
+ * @param string $date
+ * @return bool
+ */
+function depublier_rubrique_if($id_rubrique,$date=null){
+	if (is_null($date))
+		$date = date('Y-m-d H:i:s');
 	$postdates = ($GLOBALS['meta']["post_dates"] == "non") ?
-		" AND date <= ".sql_quote(date('Y-m-d H:i:s')) : '';
+		" AND date <= ".sql_quote($date) : '';
 
-#	spip_log("depublier_branche_rubrique($id_rubrique ?");
-	$id_pred = $id_rubrique;
-	while ($id_pred) {
+	if (!$id_rubrique=intval($id_rubrique))
+		return false;
 
-		if (sql_countsel("spip_articles",  "id_rubrique=$id_pred AND statut='publie'$postdates"))
-			return $id_pred != $id_rubrique;;
-	
-		if (sql_countsel("spip_breves",  "id_rubrique=$id_pred AND statut='publie'"))
-			return $id_pred != $id_rubrique;;
+	// verifier qu'elle existe et est bien publiee
+	$r = sql_fetsel('id_rubrique,statut','spip_rubriques',"id_rubrique=$id_rubrique");
+	if (!$r OR $r['statut']!=='publie')
+		return false;
 
-		if (sql_countsel("spip_syndic",  "id_rubrique=$id_pred AND statut='publie'"))
-			return $id_pred != $id_rubrique;;
-	
-		if (sql_countsel("spip_rubriques",  "id_parent=$id_pred AND statut='publie'"))
-			return $id_pred != $id_rubrique;;
+	if (sql_countsel("spip_articles",  "id_rubrique=$id_rubrique AND statut='publie'$postdates"))
+		return false;
 
-		$compte = pipeline('objet_compte_enfants',array('args'=>array('objet'=>'rubrique','id_objet'=>$id_pred,'statut'=>'publie'),'data'=>array()));
-		foreach($compte as $objet => $n)
-			if ($n)
-				return $id_pred != $id_rubrique;
+	if (sql_countsel("spip_breves",  "id_rubrique=$id_rubrique AND statut='publie'"))
+		return false;
 
-		sql_updateq("spip_rubriques", array("statut" => '0'), "id_rubrique=$id_pred");
-#		spip_log("depublier_rubrique $id_pred");
+	if (sql_countsel("spip_syndic",  "id_rubrique=$id_rubrique AND statut='publie'"))
+		return false;
 
-		$r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_pred");
+	if (sql_countsel("spip_rubriques",  "id_parent=$id_rubrique AND statut='publie'"))
+		return false;
 
-		$id_pred = $r['id_parent'];
-	}
+	if (sql_countsel("spip_documents_liens",  "id_objet=$id_rubrique AND objet='rubrique'"))
+		return false;
 
-	return $id_pred != $id_rubrique;;
+	$compte = pipeline('objet_compte_enfants',array('args'=>array('objet'=>'rubrique','id_objet'=>$id_rubrique,'statut'=>'publie','date'=>$date),'data'=>array()));
+	foreach($compte as $objet => $n)
+		if ($n)
+			return false;
+
+	sql_updateq("spip_rubriques", array("statut" => '0'), "id_rubrique=$id_rubrique");
+#		spip_log("depublier_rubrique $id_pred");
+	return true;
 }
 
 //
-- 
GitLab