From bb59380052256f893e397025b30b8edee8f181af Mon Sep 17 00:00:00 2001
From: "cedric@yterium.com" <>
Date: Wed, 16 Feb 2011 18:41:46 +0000
Subject: [PATCH] generalisation du branchement sur objet, fusion des deux meta
 documents_article et documents_rubrique en une seule meta documents_objets

---
 .gitattributes                        |  1 +
 base/medias.php                       | 10 +++++++++
 formulaires/configurer_documents.html | 28 ++++--------------------
 formulaires/configurer_documents.php  | 16 ++++++--------
 formulaires/inc-choisir-objets.html   |  8 +++++++
 lang/medias_fr.php                    |  1 +
 medias_autoriser.php                  | 31 ++++++++++++++++++---------
 medias_pipelines.php                  | 18 ++++++----------
 plugin.xml                            |  2 +-
 9 files changed, 59 insertions(+), 56 deletions(-)
 create mode 100644 formulaires/inc-choisir-objets.html

diff --git a/.gitattributes b/.gitattributes
index 4bc466d5..16c2b6ce 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -19,6 +19,7 @@ formulaires/editer_document.html -text
 formulaires/editer_document.php -text
 formulaires/illustrer_document.html -text
 formulaires/illustrer_document.php -text
+formulaires/inc-choisir-objets.html -text
 formulaires/inc-lister_archive_jointe.html -text
 formulaires/inc-upload_document.html -text
 formulaires/joindre_document.html -text
diff --git a/base/medias.php b/base/medias.php
index 5ce4e88a..1027cfcb 100644
--- a/base/medias.php
+++ b/base/medias.php
@@ -279,6 +279,16 @@ function medias_upgrade($nom_meta_base_version,$version_cible){
 			sql_alter("TABLE spip_documents CHANGE mode mode varchar(10) DEFAULT 'document' NOT NULL");
 			ecrire_meta($nom_meta_base_version,$current_version="0.11.0",'non');
 		}
+		if (version_compare($current_version,'0.12.0','<')){
+			// generalisation des metas documents_article et documents_rubriques
+			$config = array();
+			if (isset($GLOBALS['meta']['documents_article']) AND $GLOBALS['meta']['documents_article']!=='non')
+				$config[] = 'spip_articles';
+			if (isset($GLOBALS['meta']['documents_rubrique']) AND $GLOBALS['meta']['documents_rubrique']!=='non')
+				$config[] = 'spip_rubriques';
+			ecrire_meta('documents_objets',implode(',',$config));
+			ecrire_meta($nom_meta_base_version,$current_version="0.12.0",'non');
+		}
 	}
 	medias_check_statuts();
 }
diff --git a/formulaires/configurer_documents.html b/formulaires/configurer_documents.html
index 882e84f2..e5605213 100644
--- a/formulaires/configurer_documents.html
+++ b/formulaires/configurer_documents.html
@@ -4,37 +4,17 @@
 	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
 	[(#ENV{editable})
 	<p><:texte_documents_joints:></p>
-	<p><:texte_documents_joints_2:></p>
 	<form method='post' action='#ENV{action}' enctype='multipart/form-data'><div>
 		[(#REM) declarer les hidden qui declencheront le service du formulaire
 		parametre : url d'action ]
 		#ACTION_FORMULAIRE{#ENV{action}}
 		<ul>
-			#SET{name,documents_article}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
+			#SET{name,documents_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
 			<li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
-				[
+				<label><:medias:label_activer_document_objets:></label>[
 				<span class='erreur_message'>(#GET{erreurs})</span>
-				]<div class="choix">
-						<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
-						[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_autoriser_documents_joints:></label>
-					</div>
-					<div class="choix">
-						<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
-						[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_autoriser_documents_joints:></label>
-					</div>
-			</li>
-			#SET{name,documents_rubrique}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
-			<li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
-				[
-				<span class='erreur_message'>(#GET{erreurs})</span>
-				]<div class="choix">
-						<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
-						[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_autoriser_documents_joints_rubriques:></label>
-					</div>
-					<div class="choix">
-						<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
-						[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_autoriser_documents_joints_rubriques:></label>
-					</div>
+				]<p class="explication"><:texte_documents_joints_2:></p>
+				#INCLURE{fond=formulaires/inc-choisir-objets,name=#GET{name},selected=#ENV**{#GET{name}}}
 			</li>
 			#SET{name,documents_date}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
 			<li class="editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
diff --git a/formulaires/configurer_documents.php b/formulaires/configurer_documents.php
index 34bca203..96f805d3 100644
--- a/formulaires/configurer_documents.php
+++ b/formulaires/configurer_documents.php
@@ -14,25 +14,21 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 
 function formulaires_configurer_documents_charger_dist(){
 	foreach(array(
-		"documents_article",
-		"documents_rubrique",
+		"documents_objets",
 		"documents_date",
 		) as $m)
 		$valeurs[$m] = $GLOBALS['meta'][$m];
-
+	$valeurs['documents_objets']=explode(',',$valeurs['documents_objets']);
 	return $valeurs;
 }
 
 
 function formulaires_configurer_documents_traiter_dist(){
 	$res = array('editable'=>true);
-	foreach(array(
-		"documents_article",
-		"documents_rubrique",
-		"documents_date",
-		) as $m)
-		if (!is_null($v=_request($m)))
-			ecrire_meta($m, $v=='oui'?'oui':'non');
+	if (!is_null($v=_request($m='documents_date')))
+		ecrire_meta($m, $v=='oui'?'oui':'non');
+	if (!is_null($v=_request($m='documents_objets')))
+		ecrire_meta($m, is_array($v)?impode(',',$v):'');
 
 	$res['message_ok'] = _T('config_info_enregistree');
 	return $res;
diff --git a/formulaires/inc-choisir-objets.html b/formulaires/inc-choisir-objets.html
new file mode 100644
index 00000000..2f1607cb
--- /dev/null
+++ b/formulaires/inc-choisir-objets.html
@@ -0,0 +1,8 @@
+<BOUCLE_objets(POUR){tableau #REM|lister_tables_objets_sql}{cle!=#ENV{exclus,''}}>
+#SET{id,#ENV{name}|replace{\W,'_'}|concat{'_',#CLE}}
+<div class="choix choix_#CLE">
+	<input type="checkbox"  id="#GET{id}" name="#ENV{name}[]" value="#CLE"[(#CLE|in_any{#ENV{selected}})checked="checked"] />
+	<label for="#GET{id}">[(#VALEUR{texte_objets}|_T)]</label>
+</div>
+</BOUCLE_objets>
+<input type="hidden" name="#ENV{name}[]" value="" />
diff --git a/lang/medias_fr.php b/lang/medias_fr.php
index e16c44e6..529f8e54 100644
--- a/lang/medias_fr.php
+++ b/lang/medias_fr.php
@@ -93,6 +93,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
 	// L
 	'logo' => 'Logo',
+	'label_activer_document_objets' => 'Activer les documents pour les contenus&nbsp;:',
 	'label_refdoc_joindre' => 'Document num&eacute;ro',
 	'label_parents' => 'Ce document est li&eacute; &agrave;',
 	'label_fichier' => 'Fichier',
diff --git a/medias_autoriser.php b/medias_autoriser.php
index 61c36d45..38cd9efc 100644
--- a/medias_autoriser.php
+++ b/medias_autoriser.php
@@ -67,18 +67,29 @@ function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) {
 		return true;
 }
 
-// On ne peut joindre un document qu'a un article qu'on a le droit d'editer
-// mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
-// au hack id_article = 0-id_auteur
-// http://doc.spip.org/@autoriser_joindredocument_dist
+/**
+ * On ne peut joindre un document qu'a un objet qu'on a le droit d'editer
+ * mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
+ * au hack id_objet = 0-id_auteur
+ * Il faut aussi que les documents aient ete actives sur les objets concernes
+ * ou que ce soit un article, sur lequel on peut toujours uploader des images
+ *
+ * http://doc.spip.org/@autoriser_joindredocument_dist
+ *
+ * @return bool
+ */
 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
 	return
-		autoriser('modifier', $type, $id, $qui, $opt)
-		OR (
-			$type == 'article'
-			AND $id<0
-			AND abs($id) == $qui['id_auteur']
-			AND autoriser('ecrire', $type, $id, $qui, $opt)
+		(autoriser('modifier', $type, $id, $qui, $opt)
+			OR (
+				$id<0
+				AND abs($id) == $qui['id_auteur']
+				AND autoriser('ecrire', $type, $id, $qui, $opt)
+			)
+		)
+		AND
+		(
+			$type=='article' OR in_array(table_objet_sql($type),explode(',',$GLOBALS['meta']['documents_objets']))
 		);
 }
 
diff --git a/medias_pipelines.php b/medias_pipelines.php
index 3e284ef8..4374da08 100644
--- a/medias_pipelines.php
+++ b/medias_pipelines.php
@@ -42,8 +42,7 @@ function medias_post_insertion($flux){
 }
 
 function medias_configurer_liste_metas($config){
-	$config['documents_article'] = 'non';
-	$config['documents_rubrique'] = 'non';
+	$config['documents_objets'] = '';
 	$config['documents_date'] = 'non';
 	return $config;
 }
@@ -82,21 +81,19 @@ function medias_post_edition($flux){
 	return $flux;
 }
 
-// liste des exec avec la colonne document
-$GLOBALS['medias_exec_colonne_document'][] = 'article_edit';
-$GLOBALS['medias_exec_colonne_document'][] = 'breve_edit';
-$GLOBALS['medias_exec_colonne_document'][] = 'rubriques_edit';
-
 /**
  * Pipeline afficher_complement_objet
- * afficher le portfolio et ajout de document sur les fiches objet (article, rubrique..)
+ * afficher le portfolio et ajout de document sur les fiches objet
+ * sur lesquelles les medias ont ete activees
+ * Pour les articles, on ajoute toujours !
  * 
  * @param  $flux
  * @return
  */
 function medias_afficher_complement_objet($flux){
 	if ($type=$flux['args']['type']
-		AND $id=intval($flux['args']['id'])) {
+		AND $id=intval($flux['args']['id'])
+	  AND (autoriser('joindredocument',$type,$id))) {
 		$documenter_objet = charger_fonction('documenter_objet','inc');
 		$flux['data'] .= $documenter_objet($id,$type);
 	}
@@ -104,8 +101,7 @@ function medias_afficher_complement_objet($flux){
 }
 
 function medias_affiche_gauche($flux){
-	if (in_array($flux['args']['exec'],$GLOBALS['medias_exec_colonne_document'])
-		AND $table = preg_replace(",_edit$,","",$flux['args']['exec'])
+	if ($table = preg_replace(",_edit$,","",$flux['args']['exec'])
 		AND $type = objet_type($table)
 		AND $id_table_objet = id_table_objet($type)
 		AND ($id = intval($flux['args'][$id_table_objet]) OR $id = 0-$GLOBALS['visiteur_session']['id_auteur'])
diff --git a/plugin.xml b/plugin.xml
index 40d3ac89..47d7c1a7 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -3,7 +3,7 @@
 	<auteur>Collectif SPIP, Cedric Morin &amp; Romy Duhem-Verdiere pour la mediatheque</auteur>
 	<icon>images/portfolio-64.png</icon>
 	<version>2.0.0</version>
-	<version_base>0.11.0</version_base>
+	<version_base>0.12.0</version_base>
 	<etat>dev</etat>
 	<description>Gestion des medias de SPIP</description>
 	<install>base/medias.php</install>
-- 
GitLab