Valider 2d4026f5 rédigé par esj's avatar esj
Parcourir les fichiers

Lorsqu'on dépublie, déplace ou supprime, executer la cascade de conséquences...

Lorsqu'on dépublie, déplace ou supprime, executer la cascade de conséquences plutot que de sortir l'artillerie lourde et son verrou indisponible en PG.
parent 2bcb46bd
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -47,7 +47,7 @@ function action_documenter_post($r)
	}
	if ($type == 'rubrique') {
		include_spip('inc/rubriques');
			calculer_rubriques();
		depublier_branche_rubrique_if($id);
	}
}
?>
+4 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -39,8 +39,8 @@ function action_editer_rubrique_dist() {
function insert_rubrique($id_parent) {
	include_spip('base/abstract_sql');
	return spip_abstract_insert("spip_rubriques",
		"(titre, id_parent)",
		"('"._T('item_nouvelle_rubrique')."', ".intval($id_parent).")"
		"(titre, id_parent, statut)",
		"('"._T('item_nouvelle_rubrique')."', ".intval($id_parent).",'new')"
	);
}

@@ -83,7 +83,7 @@ function revisions_rubriques($id_rubrique, $c=false) {
		) {
			$champs['id_parent'] = $id_parent;
			$statut_ancien = $s['statut'];
		} else {
		} elseif ($s['statut'] != 'new') {
			spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['auteur_session']['id_auteur'] . ' '.  $GLOBALS['auteur_session']['statut']);
		}
	}
@@ -129,7 +129,7 @@ function revisions_rubriques($id_rubrique, $c=false) {

	// Deplacement d'une rubrique publiee ==> chgt general de leur statut
	if ($statut_ancien == 'publie')
		calculer_rubriques();
		calculer_rubriques_if($old_parent, array('id_rubrique' => $id_parent), $statut_ancien);

	calculer_langues_rubriques();

+11 −9
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -16,18 +16,17 @@ include_spip('inc/charsets'); # pour le nom de fichier
include_spip('inc/documents');
include_spip('base/abstract_sql');

// Effacer un doc (et sa vignette)
// Effacer un doc et sa vignette, ou une rubrique
// http://doc.spip.org/@action_supprimer_dist
function action_supprimer_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	preg_match('/^(\w+)\W(.*)$/', $arg, $r);
	preg_match('/^(\w+)\W(\d+)(\W(\w+)\W(\d+))?$/', $arg, $r);
	$var_nom = 'action_supprimer_' . $r[1];
	if (function_exists($var_nom)) {
		spip_log("$var_nom $r[2]");
		$var_nom($r[2]);
		$var_nom($r);
	}
	else
		spip_log("action supprimer $arg incompris");
@@ -37,16 +36,18 @@ function action_supprimer_dist() {

// http://doc.spip.org/@action_supprimer_document
function action_supprimer_document($arg) {
	supprimer_document_et_vignette(intval($arg));
	if (strpos(_request('redirect'), 'id_rubrique=')) {
	list(,,$id_document,, $type, $id) = $arg;
	supprimer_document_et_vignette($id_document);
	if (strpos($type,'rubrique') !== 'false') {
		include_spip('inc/rubriques');
		calculer_rubriques();
		depublier_branche_rubrique_if($id);
	}
}

// http://doc.spip.org/@action_supprimer_rubrique
function action_supprimer_rubrique($id_rubrique)
function action_supprimer_rubrique($r)
{
	list(,,$id_rubrique) = $r;
	spip_query("DELETE FROM spip_rubriques WHERE id_rubrique=$id_rubrique");
	// Les admin restreints qui n'administraient que cette rubrique
	// deviennent redacteurs
@@ -62,8 +63,9 @@ function action_supprimer_rubrique($id_rubrique)
			spip_query("UPDATE spip_auteurs SET statut='1comite' WHERE id_auteur=$id_auteur");
	}

	// Une rubrique supprimable n'avait pas le statut "publie"
	// donc rien de neuf pour la rubrique parente
	include_spip('inc/rubriques');
	calculer_rubriques();
	calculer_langues_rubriques();

	// invalider les caches marques de cette rubrique
+3 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -125,9 +125,10 @@ function inc_legender_dist($id_document, $document, $script, $type, $id, $ancre,

	$texte = _T('icone_supprimer_document');
	$s = ($ancre =='documents' ? '': '-');

	if (preg_match('/_edit$/', $script)){
		if ($id==0)
			$action = redirige_action_auteur('supprimer', "document-$id_document", $script, "id_$type=$id#$ancre");
			$action = redirige_action_auteur('supprimer', "document-$id_document-$script-$id", $script, "id_$type=$id#$ancre");
		else
			$action = redirige_action_auteur('documenter', "$s$id/$type/$id_document", $script, "id_$type=$id&type=$type&s=$s#$ancre");
	}
@@ -159,7 +160,7 @@ function vignette_formulaire_legender($id_document, $document, $script, $type, $

	if (preg_match('/_edit$/', $script)) {
		$iframe_redirect = generer_url_ecrire("documents_colonne","id=$id&type=$type",true);
		$action = redirige_action_auteur('supprimer', "document-$id_vignette", $script, "id_$type=$id&show_docs=$id_document#$ancre");
		$action = redirige_action_auteur('supprimer', "document-$id_vignette-$script-$id", $script, "id_$type=$id&show_docs=$id_document#$ancre");
	} else {
		$iframe_redirect = generer_url_ecrire("documenter","id_$type=$id&type=$type",true);
		$s = ($ancre =='documents' ? '': '-');
+56 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -20,39 +20,81 @@ include_spip('inc/meta');
// Si l'objet etait publie' et est deplace' ou depublie'
// on recalcule toutes les rubriques (a ameliorer).
// Si publication standard, ne recalculer que la branche
// avec consequence sur ses parentes et les langues
// (a refaire a terme par une Cascade SQL)

// http://doc.spip.org/@calculer_rubriques_if
function calculer_rubriques_if ($id_rubrique, $modifs, $statut_ancien='')
{
	if ($statut_ancien == 'publie'
	AND (isset($modifs['id_rubrique']) OR isset($modifs['statut'])))
		calculer_rubriques();
	elseif ($modifs['statut']=='publie')
		publier_branche_rubrique($id_rubrique);

	$neuf = false;
	if ($statut_ancien == 'publie') {
		if (isset($modifs['statut']) OR isset($modifs['id_rubrique']))
			$neuf |= depublier_branche_rubrique_if($id_rubrique);
		if (isset($modifs['id_rubrique']))
			$neuf |= publier_branche_rubrique($modifs['id_rubrique']);
	} elseif ($modifs['statut']=='publie')
		$neuf |= publier_branche_rubrique($id_rubrique);
	if ($neuf)
	// Sauver la date de la derniere mise a jour (pour menu_rubriques)
	  ecrire_meta("date_calcul_rubriques", date("U"));

	$langues = calculer_langues_utilisees();
	ecrire_meta('langues_utilisees', $langues);
	ecrire_metas();
}

// Si premiere publication dans une rubrique, la passer en statut "publie"
// avec consequence sur ses parentes et les langues
// (a refaire a terme par une Cascade SQL)
// avec consequence sur ses parentes.
// Retourne Vrai si le statut a change

// http://doc.spip.org/@publier_branche_rubrique
function publier_branche_rubrique($id_rubrique)
{
	$id_pred = $id_rubrique;

	while ($r = spip_abstract_fetch(spip_query("SELECT statut, id_parent FROM spip_rubriques AS R WHERE R.id_rubrique=$id_pred AND  R.statut != 'publie'"))) {
	while ($r = spip_abstract_fetch(spip_query("SELECT id_parent FROM spip_rubriques AS R WHERE R.id_rubrique=$id_pred AND  R.statut != 'publie'"))) {

		spip_query("UPDATE spip_rubriques SET statut='publie', date=NOW() WHERE id_rubrique=$id_pred");
		if (!($id_pred = $r['id_parent'])) break;
	}

	if (!$id_pred)
	// Sauver la date de la derniere mise a jour (pour menu_rubriques)
	  ecrire_meta("date_calcul_rubriques", date("U"));
	return $id_pred != $id_rubrique;
}

	$langues = calculer_langues_utilisees();
	ecrire_meta('langues_utilisees', $langues);
	ecrire_metas();
// Fonction a appeler lorsqu'on depublie ou supprime qqch dans une rubrique

// http://doc.spip.org/@publier_branche_rubrique
function depublier_branche_rubrique_if($id_rubrique)
{
	$postdates = ($GLOBALS['meta']["post_dates"] == "non") ?
		" AND date <= NOW()" : '';

	$id_pred = $id_rubrique;
	while ($id_pred) {

		if (spip_abstract_countsel("spip_articles",  "id_rubrique=$id_pred AND statut='publie'$postdates", '', "1"))
			return $id_pred != $id_rubrique;;
	
		if (spip_abstract_countsel("spip_breves",  "id_rubrique=$id_pred AND statut='publie'", '', "1"))
			return $id_pred != $id_rubrique;;

		if (spip_abstract_countsel("spip_syndic",  "id_rubrique=$id_pred AND statut='publie'", '', "1"))
			return $id_pred != $id_rubrique;;
	
		if (spip_abstract_countsel("spip_rubriques",  "id_parent=$id_pred AND statut='publie'", '', "1"))
			return $id_pred != $id_rubrique;;
	
		if (spip_abstract_countsel("spip_documents_rubriques",  "id_rubrique=$id_pred", '', "1"))
			return $id_pred != $id_rubrique;;

		spip_query("UPDATE spip_rubriques SET statut='0' WHERE id_rubrique=$id_pred");

		$r = spip_abstract_fetch(spip_query("SELECT id_parent FROM spip_rubriques WHERE id_rubrique=$id_pred"));

		$id_pred = $r['id_parent'];
	}
	return $id_pred != $id_rubrique;;
}

//