Valider 45e5e6e6 rédigé par Fil's avatar Fil
Parcourir les fichiers

gestion propre des liens de documents avec les articles etc ; resoud les bugs...

gestion propre des liens de documents avec les articles etc ; resoud les bugs #1015 (vignettes affichees deux fois) et #1025 (vraiment supprimer un document)
une fonction dans inc/documents permet de lister les documents orphelins, une autre permet de les supprimer en base et physiquement dans IMG/ ; mais elles ne sont pas indispensables pour resoudre le probleme : c'est dans la boucle DOCUMENTS qu'on ajoute des jointures marrantes ; je laisse donc provisoirement en option, le temps qu'on en discute
ces jointures demontrent, a mon avis, qu'il n'est pas souhaitable de multiplier les tables spip_documents_(objets), et qu'il faudrait plutot en faire une seule avec un champ type d'objet
parent d23c6153
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+14 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -34,7 +34,20 @@ function action_documenter_post($r)
		// on ne supprime pas, on dissocie
		// supprimer_document_et_vignette($vignette);
		// on dissocie, mais si le doc est utilise dans le texte, il sera reassocie ..., donc condition sur vu !
		spip_query("DELETE FROM spip_documents_".$type."s WHERE id_$type=$id AND id_document=$vignette AND (vu='non' OR vu IS NULL)");
		sql_delete("spip_documents_".$type."s",
			"id_$type=$id AND id_document=$vignette AND (vu='non' OR vu IS NULL)");

		// Ensuite on supprime les docs orphelins, ca supprimera
		// physiquement notre document s'il n'est pas attache ailleurs
		// Je mets l'option a *false* pour ne rien casser chez les
		// experimentateurs, mais par defaut ca devrait etre *true*
		// Quoi qu'il en soit les boucles n'affichent plus les documents
		// orphelins, sauf critere {tout}
		define('_SUPPRIMER_DOCUMENTS_ORPHELINS', false);
		if (_SUPPRIMER_DOCUMENTS_ORPHELINS) {
			include_spip('inc/documents');
			supprimer_les_documents_orphelins();
		}
	}
	else {
		if ($sign)
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -211,7 +211,7 @@ $spip_documents = array(
		"taille"	=> "integer",
		"largeur"	=> "integer",
		"hauteur"	=> "integer",
		"mode"	=> "ENUM('vignette', 'document') NOT NULL",//+distant
		"mode"	=> "ENUM('vignette', 'image', 'document') NOT NULL",
		"distant"	=> "VARCHAR(3) DEFAULT 'non'",
		"maj"	=> "TIMESTAMP");

+66 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -98,7 +98,7 @@ function vignette_par_defaut($ext, $size=true, $loop = true) {
//
// Attention : en mode 'doc', si c'est un fichier graphique on prefere
// afficher une vue reduite, quand c'est possible (presque toujours, donc)
// En mode 'vignette', l'image conserve sa taille
// En mode 'image', l'image conserve sa taille
//
// A noter : dans le portfolio prive on pousse le vice jusqu'a reduire la taille
// de la vignette -> c'est a ca que sert la variable $portfolio
@@ -197,7 +197,7 @@ function afficher_documents_colonne($id, $type="article",$script=NULL) {
			'args' => "id_$type=$id",
			'id' => $id,
			'intitule' => _T('info_telecharger'),
			'mode' => 'vignette',
			'mode' => 'image',
			'type' => $type,
			'ancre' => '',
			'id_document' => 0,
@@ -212,17 +212,8 @@ function afficher_documents_colonne($id, $type="article",$script=NULL) {
	while ($row = sql_fetch($res))
		$documents_lies[]= $row['id_document'];

	if (count($documents_lies)) {
		$res = spip_query("SELECT DISTINCT id_vignette FROM spip_documents WHERE id_document in (".join(',', $documents_lies).")");
		while ($v = sql_fetch($res))
			$vignettes[]= $v['id_vignette'];
		$docs_exclus = preg_replace('/^,/','',join(',', $vignettes).','.join(',', $documents_lies));

		if ($docs_exclus) $docs_exclus = "AND l.id_document NOT IN ($docs_exclus) ";
	} else $docs_exclus = '';

	//// Images sans documents
	$images_liees = spip_query("SELECT docs.id_document FROM spip_documents AS docs, spip_documents_".$type."s AS l "."WHERE l.id_".$type."=$id AND l.id_document=docs.id_document ".$docs_exclus."AND docs.mode='vignette' ORDER BY docs.id_document");
	$images_liees = spip_query("SELECT docs.id_document FROM spip_documents AS docs, spip_documents_".$type."s AS l "."WHERE l.id_".$type."=$id AND l.id_document=docs.id_document AND docs.mode='image' ORDER BY docs.id_document");

	$ret .= "\n<div id='liste_images'>";
	while ($doc = sql_fetch($images_liees)) {
@@ -403,7 +394,7 @@ function afficher_case_document($id_document, $id, $script, $type, $deplier=fals

		$ret .= fin_cadre_enfonce(true);

	} else if ($mode == 'vignette') {
	} else if ($mode == 'image') {

	//
	// Afficher une image inserable dans l'article
@@ -450,4 +441,66 @@ function afficher_case_document($id_document, $id, $script, $type, $deplier=fals
	return $ret;
}

// Etablit la liste des documents orphelins, c'est-a-dire qui ne sont lies
// a aucun article ni breve ni rubrique ; renvoie un tableau (id_document)
function lister_les_documents_orphelins() {
	$s = sql_select("d.id_document, d.id_vignette",
	"spip_documents AS d
	LEFT JOIN spip_documents_articles AS a
		ON d.id_document=a.id_document
	LEFT JOIN spip_documents_breves AS b
		ON d.id_document=b.id_document
	LEFT JOIN spip_documents_rubriques AS r
		ON d.id_document=r.id_document
	LEFT JOIN spip_articles AS aa
		ON aa.id_article=a.id_article
	LEFT JOIN spip_breves AS bb
		ON bb.id_breve=b.id_breve
	LEFT JOIN spip_rubriques AS rr
		ON rr.id_rubrique=r.id_rubrique
	",
	"(a.id_article IS NULL OR aa.id_article IS NULL)
	AND (b.id_breve IS NULL OR bb.id_breve IS NULL)
	AND (r.id_rubrique IS NULL OR rr.id_rubrique IS NULL)
	");

	$orphelins = array();
	while ($t = sql_fetch($s)) {
		$orphelins[$t['id_document']] = true;
		// la vignette d'un orphelin est orpheline
		if ($t['id_vignette'])
			$orphelins[$t['id_vignette']] = true;

	}

	// les vignettes qui n'appartiennent a aucun document sont aussi orphelines
	$s = sql_select("v.id_document",
	"spip_documents AS v LEFT JOIN spip_documents AS d ON v.id_document=d.id_vignette",
	"v.mode='vignette' AND d.id_document IS NULL");
	while ($t = sql_fetch($s))
		$orphelins[$t['id_document']] = true;

	return array_keys(array_filter($orphelins));
}

// Supprimer les documents orphelins de la table spip_documents, 
// ainsi que les fichiers correspondants dans IMG/
function supprimer_les_documents_orphelins() {
	if (!$orphelins = lister_les_documents_orphelins())
		return;

	$in = calcul_mysql_in('id_document', $orphelins);

	spip_log("supprime documents $in");
	$s = sql_select("fichier", "spip_documents", $in." AND distant='non'");
	while ($t = sql_fetch($s)) {
		if (@file_exists($f = get_spip_doc($t['fichier']))) {
			spip_log("efface $f");
			supprimer_fichier($f);
		}
	}

	sql_delete('spip_documents', $in);
}

?>
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -36,7 +36,7 @@ function inc_joindre_dist($v) {
			// quels sont les docs accessibles en ftp ?
			$l = texte_upload_manuel($dir, '', $v['mode']);
			// s'il n'y en a pas, on affiche un message d'aide
			// en mode document, mais pas en mode vignette
			// en mode document, mais pas en mode image
			if ($l OR ($v['mode'] == 'document'))
				$dir_ftp = afficher_transferer_upload($l, $dir);
		}
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -49,7 +49,7 @@ function inc_legender_dist($id_document, $document, $script, $type, $id, $ancre,
	$titre = $document['titre'];
	$date = $document['date'];

	if ($document['mode'] == 'vignette') {
	if ($document['mode'] == 'image') {
		$supp = 'image-24.gif';
		$label = _T('entree_titre_image');
		$taille = $vignette = '';
@@ -221,7 +221,7 @@ function formulaire_taille($document) {
	)) {
		return "\n<br /><label for='largeur_document$id_document'><b>"._T('entree_dimensions')."</b></label><br />\n" .
		  "<input type='text' name='largeur_document' id='largeur_document$id_document' class='fondl spip_xx-small' value=\"".$document['largeur']."\" size='5' onfocus=\"changeVisible(true, 'valider_doc$id_document', 'block', 'block');\" />" .
		  " &#215; <input type='text' name='hauteur_document' id='hauteur_document$id_document' class='fondl spip_xx-small' value=\"".$document['hauteur']."\" size='5' onfocus=\"changeVisible(true, 'valider_doc$id_document', 'block', 'block');\" /> "._T('info_pixels');
		  " &times; <input type='text' name='hauteur_document' id='hauteur_document$id_document' class='fondl spip_xx-small' value=\"".$document['hauteur']."\" size='5' onfocus=\"changeVisible(true, 'valider_doc$id_document', 'block', 'block');\" /> "._T('info_pixels');
	}
}

Chargement en cours