From a1f6242c262abdbd84f2a1dcc124df93c8815387 Mon Sep 17 00:00:00 2001
From: "cedric@yterium.com" <>
Date: Mon, 14 Nov 2011 18:39:14 +0000
Subject: [PATCH] Le media d'un document (image, video, audio, file) utilise
 par convenance dans l'interface ne peut dependre en dur de l'extension du
 fichier : avec oEmbed, on peut se retrouver a integrer toute sorte de media
 au format html Du coup on revoit la structure de la base :
 spip_types_documents porte un champ media_defaut (renommage de l'ancien
 media) utilise comme valeur par defaut du media si non renseigne quand un
 document est ajoute spip_documents porte son propre champ media, qui est
 peuple en fonction de media_defaut, sauf si renseigne lors de l'ajout du
 document (ie via fonction de description ou pipeline) Revision du code
 partout ou on referencait media, en dispatchant sur l'un ou l'autre selon les
 cas upgrade de la base (en deux fois)

---
 .gitattributes                                |  1 +
 action/ajouter_documents.php                  |  9 ++++++--
 action/editer_document.php                    |  2 +-
 action/supprimer_tous_orphelins.php           |  6 ++---
 base/medias.php                               |  7 +++---
 inc/renseigner_document.php                   |  2 +-
 medias_administrations.php                    | 23 +++++++++++++++++++
 paquet.xml                                    |  4 ++--
 .../inclure/mediatheque-navigation.html       | 10 ++++----
 .../mediatheque-navigation_fonctions.php      | 19 +++++++++++++++
 10 files changed, 65 insertions(+), 18 deletions(-)
 create mode 100644 prive/squelettes/inclure/mediatheque-navigation_fonctions.php

diff --git a/.gitattributes b/.gitattributes
index ddd8631c..4f80a591 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -139,6 +139,7 @@ prive/squelettes/inclure/document_infos.html -text
 prive/squelettes/inclure/mediatheque-choisir.html -text
 prive/squelettes/inclure/mediatheque-galerie.html -text
 prive/squelettes/inclure/mediatheque-navigation.html -text
+prive/squelettes/inclure/mediatheque-navigation_fonctions.php -text
 prive/squelettes/inclure/portfolio-documents.html -text
 prive/squelettes/navigation/document_edit.html -text
 prive/squelettes/top/documents.html -text
diff --git a/action/ajouter_documents.php b/action/ajouter_documents.php
index 066d2666..b3428c49 100644
--- a/action/ajouter_documents.php
+++ b/action/ajouter_documents.php
@@ -161,6 +161,11 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
 		unset($champs['inclus']);
 		$champs['fichier'] = set_spip_doc($champs['fichier']);
 	}
+
+	// si le media est pas renseigne, le faire, en fonction de l'extension
+	if (!isset($champs['media'])){
+		$champs['media'] = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($champs['extension']));
+	}
 	
 	// lier le parent si necessaire
 	if ($id_objet=intval($id_objet) AND $objet)
@@ -256,11 +261,11 @@ function verifier_upload_autorise($source, $mode=''){
 	  AND $ext = $match[1]){
 		
 	  $ext = corriger_extension(strtolower($ext));
-		if ($res = sql_fetsel("extension,inclus,media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
+		if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"))
 			$infos = array_merge($infos,$res);
 	}
 	if (!$res){
-		if ($res = sql_fetsel("extension,inclus,media", "spip_types_documents", "extension='zip' AND upload='oui'")){
+		if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension='zip' AND upload='oui'")){
 			$infos = array_merge($infos,$res);
 			$res['autozip'] = true;
 		}
diff --git a/action/editer_document.php b/action/editer_document.php
index 2ccb2e35..4df43869 100644
--- a/action/editer_document.php
+++ b/action/editer_document.php
@@ -90,7 +90,7 @@ function document_modifier($id_document, $set=false) {
 		// white list
 		array(
 		 'titre', 'descriptif', 'date', 'taille', 'largeur','hauteur','mode','credits',
-		 'fichier','distant','extension', 'id_vignette',
+		 'fichier','distant','extension', 'id_vignette', 'media',
 		),
 		// black list
 		array('parents', 'ajout_parents'),
diff --git a/action/supprimer_tous_orphelins.php b/action/supprimer_tous_orphelins.php
index 6920654a..6964bf1f 100644
--- a/action/supprimer_tous_orphelins.php
+++ b/action/supprimer_tous_orphelins.php
@@ -23,10 +23,8 @@ function action_supprimer_tous_orphelins() {
 	list($media,$distant,$statut,$sanstitre) = explode('/',$arg);
 	
 	//critere sur le media
-	if($media) {
-		$select = sql_get_select("extension","spip_types_documents as nnnn","media=".sql_quote($media));
-		$where[] = "spip_documents.extension IN ($select)";
-	}
+	if($media)
+		$select = "media=".sql_quote($media);
 
 	//critere sur le distant
 	if($distant)
diff --git a/base/medias.php b/base/medias.php
index 9fb22816..80eb8b64 100644
--- a/base/medias.php
+++ b/base/medias.php
@@ -25,7 +25,7 @@ function medias_declarer_tables_interfaces($interfaces) {
 	$interfaces['exceptions_des_tables']['documents']['type_document']=array('types_documents', 'titre');
 	$interfaces['exceptions_des_tables']['documents']['extension_document']=array('types_documents', 'extension');
 	$interfaces['exceptions_des_tables']['documents']['mime_type']=array('types_documents', 'mime_type');
-	$interfaces['exceptions_des_tables']['documents']['media']=array('types_documents', 'media');
+	$interfaces['exceptions_des_tables']['documents']['media_document']=array('types_documents', 'media');
 
 	$interfaces['exceptions_des_jointures']['spip_documents']['id_forum']=array('spip_documents_liens','id_forum');
 	$interfaces['exceptions_des_jointures']['spip_documents']['vu']=array('spip_documents_liens', 'vu');
@@ -52,7 +52,7 @@ function medias_declarer_tables_principales($tables_principales) {
 			"mime_type"	=> "varchar(100) DEFAULT '' NOT NULL",
 			"inclus"	=> "ENUM('non', 'image', 'embed') DEFAULT 'non'  NOT NULL",
 			"upload"	=> "ENUM('oui', 'non') DEFAULT 'oui'  NOT NULL",
-			"media" => "varchar(10) DEFAULT 'file' NOT NULL",
+			"media_defaut" => "varchar(10) DEFAULT 'file' NOT NULL",
 			"maj"	=> "TIMESTAMP");
 
 	$spip_types_documents_key = array(
@@ -131,6 +131,7 @@ function medias_declarer_tables_objets_sql($tables){
 			"taille"	=> "bigint",
 			"largeur"	=> "integer",
 			"hauteur"	=> "integer",
+			"media" => "varchar(10) DEFAULT 'file' NOT NULL",
 			"mode"	=> "varchar(10) DEFAULT 'document' NOT NULL",
 			"distant"	=> "VARCHAR(3) DEFAULT 'non'",
 			"statut" => "varchar(10) DEFAULT '0' NOT NULL",
@@ -221,7 +222,7 @@ function creer_base_types_doc($serveur='') {
 		'titre' => $titre,
 		'inclus' => $inclus,
 		'extension' => $extension,
-		'media' => $media,
+		'media_defaut' => $media,
 		'upload' => 'oui'
 		);
 	}
diff --git a/inc/renseigner_document.php b/inc/renseigner_document.php
index 9b185f8e..343afe91 100644
--- a/inc/renseigner_document.php
+++ b/inc/renseigner_document.php
@@ -82,7 +82,7 @@ function renseigner_taille_dimension_image($fichier,$ext){
 		$meta = $metadata($fichier);
 	}
   else {
-	  $media = sql_getfetsel('media','spip_types_documents','extension='.sql_quote($ext));
+	  $media = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($ext));
 	  if ($metadata = charger_fonction($media,"metadata",true)){
 		  $meta = $metadata($fichier);
 	  }
diff --git a/medias_administrations.php b/medias_administrations.php
index 4e83216b..36ef49fe 100644
--- a/medias_administrations.php
+++ b/medias_administrations.php
@@ -99,6 +99,19 @@ function medias_upgrade($nom_meta_base_version,$version_cible){
 	$maj['0.16.0'] = array(
 		array('creer_base_types_doc'),
 	);
+
+	$maj['1.0.0'] = array(
+		// on cree le champ en defaut '?' pour reperer les nouveaux a peupler
+		array('sql_alter',"TABLE spip_documents ADD media varchar(10) DEFAULT '?' NOT NULL"),
+		array('medias_peuple_media_document'),
+		// puis on retablit le bon defaut
+		array('sql_alter',"TABLE spip_documents CHANGE media media varchar(10) DEFAULT 'file' NOT NULL"),
+	);
+	$maj['1.0.1'] = array(
+		// puis on retablit le bon defaut
+		array('sql_alter',"TABLE spip_types_documents CHANGE media media_defaut varchar(10) DEFAULT 'file' NOT NULL"),
+	);
+
 	include_spip('base/upgrade');
 	maj_plugin($nom_meta_base_version, $version_cible, $maj);
 
@@ -117,6 +130,16 @@ function medias_maj_meta_documents(){
 	ecrire_meta('documents_objets',implode(',',$config));
 }
 
+function medias_peuple_media_document(){
+	$res = sql_select("DISTINCT extension","spip_documents","media=".sql_quote('?'));
+	while($row = sql_fetch($res)){
+		$media = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($row['extension']));
+		sql_updateq('spip_documents',array('media'=>$media),"media=".sql_quote('?').' AND extension='.sql_quote($row['extension']));
+		if (time() >= _TIME_OUT)
+			return;
+	}
+}
+
 /*
 function medias_install($action,$prefix,$version_cible){
 	$version_base = $GLOBALS[$prefix."_base_version"];
diff --git a/paquet.xml b/paquet.xml
index 78d2adb2..3742036b 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,11 +1,11 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.6.0"
+	version="2.7.0"
 	etat="test"
 	compatibilite="[3.0.0-alpha2;["
 	logo="prive/themes/spip/images/portfolio-32.png"
-	schema="0.16.0"
+	schema="1.0.1"
 >	
 
 	<nom>Medias</nom>
diff --git a/prive/squelettes/inclure/mediatheque-navigation.html b/prive/squelettes/inclure/mediatheque-navigation.html
index abcbc098..7e174e4e 100644
--- a/prive/squelettes/inclure/mediatheque-navigation.html
+++ b/prive/squelettes/inclure/mediatheque-navigation.html
@@ -45,11 +45,11 @@
 
 <B_types>
 <ul class='choix-type'>
-<BOUCLE_types(TYPES_DOCUMENTS){media=#ENV{media,''}}>
-<BOUCLE_compte(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}{id_document ?}{recherche ?}{statut==.*}{extension} />
-[(#TOTAL_BOUCLE|oui)[<li>(#GET{self}|parametre_url{extension,#EXTENSION}|lien_ou_expose{#TITRE|concat{' (',#TOTAL_BOUCLE,')'},#ENV{extension}|=={#EXTENSION},ajax})<span> | </span></li>]]
-<//B_compte>
-</BOUCLE_types>
+	<BOUCLE_types(TYPES_DOCUMENTS){par titre}{extension IN #ENV{media,''}|liste_extensions_utilisees}>
+	<BOUCLE_compte(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}{id_document ?}{recherche ?}{statut==.*}{extension}{media=#ENV{media}} />
+	[(#_compte:TOTAL_BOUCLE|oui)[<li>(#GET{self}|parametre_url{extension,#EXTENSION}|lien_ou_expose{#TITRE|concat{' (',#_compte:TOTAL_BOUCLE,')'},#ENV{extension}|=={#EXTENSION},ajax})<span> | </span></li>]]
+	<//B_compte>
+	</BOUCLE_types>
 </ul>
 </B_types>
 
diff --git a/prive/squelettes/inclure/mediatheque-navigation_fonctions.php b/prive/squelettes/inclure/mediatheque-navigation_fonctions.php
new file mode 100644
index 00000000..3429dfff
--- /dev/null
+++ b/prive/squelettes/inclure/mediatheque-navigation_fonctions.php
@@ -0,0 +1,19 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2011                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+
+if (!defined('_ECRIRE_INC_VERSION')) return;
+
+
+function liste_extensions_utilisees($media){
+	return $media?array_map('reset',sql_allfetsel('extension','spip_documents','media='.sql_quote($media))):array();
+}
\ No newline at end of file
-- 
GitLab