Changeset 43743 in spip-zone
- Timestamp:
- Jan 21, 2011, 6:04:38 PM (10 years ago)
- Location:
- _core_/plugins/medias
- Files:
-
- 12 deleted
- 15 edited
- 49 copied
Legend:
- Unmodified
- Added
- Removed
-
_core_/plugins/medias/action/ajouter_documents.php
r43741 r43743 4 4 * SPIP, Systeme de publication pour l'internet * 5 5 * * 6 * Copyright (c) 2001-20 11*6 * Copyright (c) 2001-2009 * 7 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 8 * * … … 11 11 \***************************************************************************/ 12 12 13 if (!defined( '_ECRIRE_INC_VERSION')) return;13 if (!defined("_ECRIRE_INC_VERSION")) return; 14 14 15 15 include_spip('inc/getdocument'); 16 16 include_spip('inc/documents'); 17 18 // Joindre un document ou un Zip a deballer (fonction pour action/joindre) 19 // Distinguer les deux cas pour commencer 20 21 // http://doc.spip.org/@inc_ajouter_documents_dist 22 function inc_ajouter_documents_dist ($sources, $file, $type, $id, $mode, $id_document, &$actifs, $hout='', $redirect='', $iframe_redirect='') 23 { 24 if (is_array($sources)) 25 return liste_archive_jointe($sources, $file, $type, $id, $mode, $id_document, $hout, $redirect, $iframe_redirect); 17 include_spip('inc/ajouter_documents'); // compat core 18 include_spip('inc/choisir_mode_document'); // compat core 19 include_spip('inc/renseigner_document'); 20 21 function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet, $mode){ 22 $ajouter_un_document = charger_fonction('ajouter_un_document','action'); 23 $ajoutes = array(); 24 25 // on ne peut mettre qu'un seul document a la place d'un autre ou en vignette d'un autre 26 if (intval($id_document)){ 27 $ajoutes[] = $ajouter_un_document($id_document, reset($files), $objet, $id_objet, $mode); 28 } 26 29 else 27 return ajouter_un_document($sources, $file, $type, $id, $mode, $id_document, $actifs, $hout); 28 } 29 30 31 /** 32 * Choisir le mode du document : image/document 33 * fonction surchargeable 34 * 35 * @param unknown_type $fichier 36 * @param string $type_lien Le type de l'objet sur lequel lier le document (article, rubrique, ...) 37 * @param unknown_type $type_image 38 * @param unknown_type $largeur 39 * @param unknown_type $hauteur 40 */ 41 function inc_choisir_mode_document_dist($fichier, $type_lien, $type_image, $largeur, $hauteur){ 42 43 // si ce n'est pas une image, c'est forcement un document 44 if (!in_array($type_image, array('gif', 'png', 'jpg'))) 45 return 'document'; 46 47 // si on a pas le droit d'ajouter de document a l'objet, c'est donc un mode image 48 if ($type_lien AND isset($GLOBALS['meta']["documents_$type_lien"]) AND ($GLOBALS['meta']["documents_$type_lien"]=='non')) 49 return 'image'; 50 51 52 // _INTERFACE_DOCUMENTS 53 // en fonction de la taille de l'image 54 // par defaut l'affectation en fonction de la largeur de l'image 55 // est desactivee car pas comprehensible par le novice 56 // il suffit de faire dans mes_options 57 // define('_LARGEUR_MODE_IMAGE', 450); 58 // pour beneficier de cette detection auto 59 if (!defined('_LARGEUR_MODE_IMAGE')) define('_LARGEUR_MODE_IMAGE', 0); 60 61 if (!_LARGEUR_MODE_IMAGE) 62 return 'image'; 63 64 if ($largeur > 0 65 AND $largeur < _LARGEUR_MODE_IMAGE) 66 return 'image'; 67 else 68 return 'document'; 69 } 70 30 foreach($files as $file){ 31 $ajoutes[] = $ajouter_un_document('new', $file, $objet, $id_objet, $mode); 32 } 33 return $ajoutes; 34 } 71 35 72 36 /** 73 37 * Ajouter un document (au format $_FILES) 38 * $id_document, # document a remplacer, ou pour une vignette, l'id_document de maman 39 * $source, # le fichier sur le serveur (/var/tmp/xyz34) 40 * $nom_envoye, # son nom chez le client (portequoi.pdf) 41 * $objet, # lie a un article, une breve ou une rubrique ? 42 * $id_objet, # identifiant de l'article (ou rubrique) lie 43 * $mode, # 'image' => image en mode image 44 * 'vignette' => personnalisee liee a un document 45 * 'document' => doc ou image en mode document 46 * 'distant' => lien internet 47 * $actifs # les documents dont il faudra ouvrir la boite de dialogue 74 48 * 75 * @param string $source 76 * le fichier sur le serveur (/var/tmp/xyz34) 77 * @param string $nom_envoye 78 * son nom chez le client (portequoi.pdf) 79 * @param string $type_lien 80 * lie a un article, une rubrique ou un autre objet ? 81 * @param int $id_lien 82 * identifiant de l'article (ou rubrique ou objet) lie 83 * @param string $mode 84 * - 'image' => image en mode image 85 * - 'vignette' => personnalisee liee a un document 86 * - 'document' => doc ou image en mode document 87 * - 'distant' => lien internet 88 * @param int $id_document 89 * pour une vignette, l'id_document de maman 90 * 91 * @param unknown $documents_actifs 92 * les documents dont il faudra ouvrir la boite de dialogue 93 * @param unknown $titrer 94 * 95 * 96 * @return mixed 97 * int : Identifiant du nouveau document insere 98 * NULL : echec 99 **/ 100 49 * @param unknown_type $id_document 50 * @param array $source 51 * @param unknown_type $nom_envoye 52 * @param unknown_type $objet 53 * @param unknown_type $id_objet 54 * @param unknown_type $mode 55 * @param unknown_type $documents_actifs 56 * @param unknown_type $titrer 57 * @return unknown 58 */ 101 59 // http://doc.spip.org/@ajouter_un_document 102 function ajouter_un_document($source, $nom_envoye, $type_lien, $id_lien, $mode, $id_document, &$documents_actifs, $titrer=false) { 60 function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) { 61 62 $source = $file['tmp_name']; 63 $nom_envoye = $file['name']; 64 65 // passer en minuscules le nom du fichier, pour eviter les collisions 66 // si le file system fait la difference entre les deux il ne detectera 67 // pas que Toto.pdf et toto.pdf 68 // et on aura une collision en cas de changement de file system 69 $file['name'] = strtolower(translitteration($file['name'])); 70 71 // Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut 72 if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); } 73 74 $titrer = isset($file['titrer'])?$file['titrer']:_TITRER_DOCUMENTS; 75 $mode = ((isset($file['mode']) AND $file['mode'])?$file['mode']:$mode); 103 76 104 77 include_spip('inc/modifier'); 105 106 // Documents distants : pas trop de verifications bloquantes, mais un test 107 // via une requete HEAD pour savoir si la ressource existe (non 404), si le 108 // content-type est connu, et si possible recuperer la taille, voire plus. 109 if ($mode == 'distant') { 78 if (isset($file['distant']) AND $file['distant'] AND $mode=='vignette') { 110 79 include_spip('inc/distant'); 111 if ($a = recuperer_infos_distantes($source)) { 112 80 $file['tmp_name'] = _DIR_RACINE . copie_locale($source); 81 $source = $file['tmp_name']; 82 unset($file['distant']); 83 } 84 85 // Documents distants : pas trop de verifications bloquantes, mais un test 86 // via une requete HEAD pour savoir si la ressource existe (non 404), si le 87 // content-type est connu, et si possible recuperer la taille, voire plus. 88 if (isset($file['distant']) AND $file['distant']) { 89 include_spip('inc/distant'); 90 if (is_array($a = renseigner_source_distante($source))) { 91 92 $champs = $a; 113 93 # NB: dans les bonnes conditions (fichier autorise et pas trop gros) 114 94 # $a['fichier'] est une copie locale du fichier 115 95 116 $type_image = $a['type_image']; 117 118 unset($a['type_image']); 119 unset($a['body']); 120 121 $a['date'] = date('Y-m-d H:i:s'); 122 $a['distant'] = 'oui'; 123 $a['mode'] = 'document'; 124 $a['fichier'] = set_spip_doc($source); 125 } 96 unset($champs['type_image']); 97 } 98 // on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie ! 126 99 else { 127 100 spip_log("Echec du lien vers le document $source, abandon"); 128 return; 129 } 130 } else { // pas distant 131 101 return $a; // message d'erreur 102 } 103 } 104 else { // pas distant 105 106 $champs = array( 107 'distant' => 'non' 108 ); 109 132 110 $type_image = ''; // au pire 133 // tester le type de document : 134 // - interdit a l'upload ? 135 // - quelle extension dans spip_types_documents ? 136 // - est-ce "inclus" comme une image ? 137 138 preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match); 139 @list(,$titre,$ext) = $match; 140 // securite : pas de . en dehors de celui separant l'extension 141 // sinon il est possible d'injecter du php dans un toto.php.txt 142 $nom_envoye = str_replace('.','-',$titre).'.'.$ext; 143 if ($titrer) { 111 $champs['titre'] = ''; 112 if ($titrer){ 113 $titre = substr($nom_envoye,0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier 144 114 $titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre); 145 } else $titre = ''; 146 $ext = corriger_extension(strtolower($ext)); 147 148 $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); 149 150 if ($row) { 151 $type_inclus_image = ($row['inclus'] == 'image'); 152 $fichier = copier_document($ext, $nom_envoye, $source); 153 } else { 154 155 /* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */ 156 $type_inclus_image = false; 157 158 if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) { 159 spip_log("Extension $ext interdite a l'upload"); 160 return; 161 } 162 163 $ext = 'zip'; 164 if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return; 165 spip_unlink($tmp_dir); @mkdir($tmp_dir); 166 $tmp = $tmp_dir.'/'.translitteration($nom_envoye); 167 $nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip 168 deplacer_fichier_upload($source, $tmp); 169 include_spip('inc/pclzip'); 170 $source = _DIR_TMP . 'archive.zip'; 171 $archive = new PclZip($source); 172 $v_list = $archive->create($tmp, 115 $champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre); 116 } 117 118 if (!$fichier = fixer_fichier_upload($file)) 119 return ("Impossible de telecharger le fichier"); 120 121 $champs['inclus'] = $fichier['inclus']; 122 $champs['extension'] = $fichier['extension']; 123 $champs['fichier'] = $fichier['fichier']; 124 125 126 $infos = renseigner_taille_dimension_image($champs['fichier'],$champs['extension']); 127 if (is_string($infos)) 128 return $infos; // c'est un message d'erreur ! 129 130 $champs = array_merge($champs,$infos); 131 132 // Si mode == 'choix', fixer le mode image/document 133 if ($mode == 'choix' OR !in_array($mode, array('vignette', 'image', 'document'))) { 134 $choisir_mode_document = charger_fonction('choisir_mode_document','inc'); 135 $mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet); 136 } 137 $champs['mode'] = $mode; 138 139 if (($test = verifier_taille_document_acceptable($champs))!==true){ 140 spip_unlink($champs['fichier']); 141 return $test; // erreur sur les dimensions du fichier 142 } 143 144 145 unset($champs['type_image']); 146 unset($champs['inclus']); 147 $champs['fichier'] = set_spip_doc($champs['fichier']); 148 } 149 150 // lier le parent si necessaire 151 if ($id_objet=intval($id_objet) AND $objet) 152 $champs['parents'][] = "$objet|$id_objet"; 153 154 // "mettre a jour un document" si on lui 155 // passe un id_document 156 if ($id_document=intval($id_document)){ 157 unset($champs['titre']); // garder le titre d'origine 158 unset($champs['date']); // garder la date d'origine 159 unset($champs['descriptif']); // garder la desc d'origine 160 // unset($a['distant']); # on peut remplacer un doc statique par un doc distant 161 // unset($a['mode']); # on peut remplacer une image par un document ? 162 } 163 164 include_spip('action/editer_document'); 165 // Installer le document dans la base 166 // attention piege semantique : les images s'installent en mode 'vignette' 167 if (!$id_document){ 168 $id_document = insert_document(); 169 spip_log ("ajout du document ".$file['tmp_name']." ".$file['name']." (M '$mode' T '$objet' L '$id_objet' D '$id_document')"); 170 } 171 172 document_set($id_document,$champs); 173 174 // permettre aux plugins de faire des modifs a l'ajout initial 175 // ex EXIF qui tourne les images si necessaire 176 pipeline('post_edition', 177 array( 178 'args' => array( 179 'table' => 'spip_documents', // compatibilite 180 'table_objet' => 'documents', 181 'spip_table_objet' => 'spip_documents', 182 'type' =>'document', 183 'id_objet' => $id_document, 184 'champs' => array_keys($champs), 185 'serveur' => '', // serveur par defaut, on ne sait pas faire mieux pour le moment 186 'action' => 'ajouter_document', 187 'operation' => 'ajouter_document', // compat <= v2.0 188 ), 189 'data' => $champs 190 ) 191 ); 192 193 return $id_document ; 194 } 195 196 197 if (!function_exists('corriger_extension')){ 198 /** 199 * Corrige l'extension du fichier dans quelques cas particuliers 200 * (a passer dans ecrire/base/typedoc) 201 * A noter : une extension 'pdf ' passe dans la requete de controle 202 * mysql> SELECT * FROM spip_types_documents WHERE extension="pdf "; 203 * 204 * @param string $ext 205 * @return string 206 */ 207 function corriger_extension($ext) { 208 $ext = preg_replace(',[^a-z0-9],i', '', $ext); 209 switch ($ext) { 210 case 'htm': 211 $ext='html'; 212 break; 213 case 'jpeg': 214 $ext='jpg'; 215 break; 216 case 'tiff': 217 $ext='tif'; 218 break; 219 } 220 return $ext; 221 } 222 } 223 224 /** 225 * Verifie la possibilite d'uploader une extension 226 * renvoie un tableau descriptif si l'extension est acceptee 227 * une chaine 'zip' si il faut zipper 228 * false si l'extension est refusee 229 * 230 */ 231 function verifier_upload_autorise($source){ 232 if (preg_match(",\.([^.]+)$,", $source, $match) 233 AND $ext = $match[1]){ 234 235 $ext = corriger_extension(strtolower($ext)); 236 if ($row = sql_fetsel("extension,inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'")) 237 return $row; 238 } 239 240 if (sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) 241 return 'zip'; 242 243 spip_log("Extension $ext interdite a l'upload"); 244 return false; 245 } 246 247 248 /** 249 * tester le type de document : 250 * - interdit a l'upload ? 251 * - quelle extension dans spip_types_documents ? 252 * - est-ce "inclus" comme une image ? 253 * 254 * le zipper si necessaire 255 * 256 * @param array $file //format $_FILES 257 * @return array 258 */ 259 function fixer_fichier_upload($file){ 260 261 262 263 if (is_array($row=verifier_upload_autorise($file['name']))) { 264 $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']); 265 return $row; 266 } 267 // creer un zip comme demande 268 // pour encapsuler un fichier dont l'extension n'est pas supportee 269 elseif($row==='zip'){ 270 271 $row = array('extension'=>'zip','inclus'=>false); 272 273 $ext = 'zip'; 274 if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) 275 return false; 276 277 spip_unlink($tmp_dir); 278 @mkdir($tmp_dir); 279 280 include_spip('inc/charset'); 281 $tmp = $tmp_dir.'/'.translitteration($file['name']); 282 283 $file['name'] .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip 284 285 // deplacer le fichier tmp_name dans le dossier tmp 286 deplacer_fichier_upload($file['tmp_name'], $tmp, true); 287 288 include_spip('inc/pclzip'); 289 $source = _DIR_TMP . basename($tmp_dir) . '.zip'; 290 $archive = new PclZip($source); 291 292 $v_list = $archive->create($tmp, 173 293 PCLZIP_OPT_REMOVE_PATH, $tmp_dir, 174 294 PCLZIP_OPT_ADD_PATH, ''); 175 effacer_repertoire_temporaire($tmp_dir); 176 if (!$v_list) { 177 spip_log("Echec creation du zip "); 178 return; 179 } 180 $fichier = copier_document($ext, $nom_envoye, $source); 181 spip_unlink($source); 182 } 183 184 // Prevoir traitement specifique pour videos 185 // (http://www.getid3.org/ peut-etre 186 if ($ext == "mov") { 187 $largeur = 0; 188 $hauteur = 0; 189 } else if ($ext == "svg") { 190 // recuperer les dimensions et supprimer les scripts 191 list($largeur,$hauteur)= traite_svg($fichier); 192 } else { // image ? 193 // Si c'est une image, recuperer sa taille et son type (detecte aussi swf) 194 $size_image = @getimagesize($fichier); 195 $largeur = intval($size_image[0]); 196 $hauteur = intval($size_image[1]); 197 $type_image = decoder_type_image($size_image[2]); 198 } 199 200 // Quelques infos sur le fichier 201 if (!$fichier OR !@file_exists($fichier) 202 OR !$taille = @intval(filesize($fichier))) { 203 spip_log ("Echec copie du fichier $fichier"); 204 return; 205 } 206 207 208 209 // _INTERFACE_DOCUMENTS 210 // Si mode == 'choix', fixer le mode image/document 211 if ($mode == 'choix') { 212 $choisir_mode_document = charger_fonction('choisir_mode_document','inc'); 213 $mode = $choisir_mode_document($fichier, $type_lien, $type_image, $largeur, $hauteur); 214 } 215 216 217 if (!$type_image) { 218 if (_DOC_MAX_SIZE > 0 219 AND $taille > _DOC_MAX_SIZE*1024) { 220 spip_unlink ($fichier); 221 check_upload_error(6, 222 _T('info_logo_max_poids', 223 array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 224 'actuel' => taille_en_octets($taille)))); 225 } 226 if ($mode == 'image') { 227 spip_log ("le format de $fichier ne convient pas pour une image"); 228 spip_unlink($fichier); 229 return; 230 } 231 } 232 else { // image 233 if (_IMG_MAX_SIZE > 0 234 AND $taille > _IMG_MAX_SIZE*1024) { 235 spip_unlink ($fichier); 236 check_upload_error(6, 237 _T('info_logo_max_poids', 238 array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 239 'actuel' => taille_en_octets($taille)))); 240 } 241 242 if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT 243 AND ($size_image[0] > _IMG_MAX_WIDTH 244 OR $size_image[1] > _IMG_MAX_HEIGHT)) { 245 spip_unlink ($fichier); 246 check_upload_error(6, 247 _T('info_logo_max_taille', 295 296 effacer_repertoire_temporaire($tmp_dir); 297 if (!$v_list) { 298 spip_log("Echec creation du zip "); 299 return false; 300 } 301 302 $row['fichier'] = copier_document($row['extension'], $file['name'], $source); 303 spip_unlink($source); 304 return $row; 305 } 306 307 return false; 308 } 309 310 311 function verifier_taille_document_acceptable($infos){ 312 313 // si ce n'est pas une image 314 if (!$infos['type_image']) { 315 if (_DOC_MAX_SIZE > 0 316 AND $infos['taille'] > _DOC_MAX_SIZE*1024) 317 return _T('medias:info_doc_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille']))); 318 319 if ($infos['mode'] == 'image') 320 return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); 321 } 322 323 // si c'est une image 324 else { 325 326 if (_IMG_MAX_SIZE > 0 327 AND $infos['taille'] > _IMG_MAX_SIZE*1024) 328 return _T('medias:info_image_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille']))); 329 330 if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT 331 AND ($infos['largeur'] > _IMG_MAX_WIDTH 332 OR $infos['hauteur'] > _IMG_MAX_HEIGHT)) 333 334 return _T('info_logo_max_taille', 248 335 array( 249 336 'maxi' => … … 253 340 'actuel' => 254 341 _T('info_largeur_vignette', 255 array('largeur_vignette' => $size_image[0], 256 'hauteur_vignette' => $size_image[1])) 257 ))); 258 } 259 } 260 261 // Si on veut uploader une vignette, il faut qu'elle ait ete bien lue 262 if ($mode == 'vignette') { 263 if (!$type_inclus_image) { 264 spip_log ("le format de $fichier ne convient pas pour une image"); # SVG 265 spip_unlink($fichier); 266 return; 267 } 268 269 if (!($largeur OR $hauteur)) { 270 spip_log('erreur upload vignette '.$fichier); 271 spip_unlink($fichier); 272 return; 273 } 274 } elseif (!in_array($mode, array('distant', 'image', 'document'))) { 275 if ($type_image AND $type_inclus_image) 276 $mode = 'image'; 277 else 278 $mode = 'document'; 279 } 280 $a = array( 281 'date' => date('Y-m-d H:i:s'), 282 'distant' => 'non', 283 'mode' => $mode, 284 'titre'=> $titre, 285 'largeur' => $largeur, 286 'hauteur' => $hauteur, 287 'taille' => $taille, 288 'extension'=> $ext, 289 'fichier' => set_spip_doc($fichier)); 290 } 291 292 if (($id_document=intval($id_document)) AND $mode!='vignette') { 293 294 // Mise a jour des descripteurs d'un vieux doc 295 unset($a['titre']); 296 unset($a['date']); 297 unset($a['distant']); 298 unset($a['mode']); 299 300 sql_updateq('spip_documents', $a, "id_document=$id_document"); 301 $id = $id_document; 302 303 } else { 304 // Installer le document dans la base 305 // attention piege semantique : les images s'installent en mode 'vignette' 306 // note : la fonction peut "mettre a jour un document" si on lui 307 // passe "mode=document" et "id_document=.." (pas utilise) 308 309 $id = sql_insertq("spip_documents", $a); 310 311 spip_log ("ajout du document $source $nom_envoye (M '$mode' T '$type_lien' L '$id_lien' D '$id')"); 312 313 if ($id_lien AND $id 314 AND preg_match('/^[a-z0-9_]+$/i', $type_lien) # securite 315 ) { 316 sql_insertq('spip_documents_liens', 317 array('id_document' => $id, 318 'id_objet' => $id_lien, 319 'objet' => $type_lien)); 320 } else spip_log("Pb d'insertion $id_lien $type_lien"); 321 322 if ($id_document) { 323 sql_updateq("spip_documents", array("id_vignette" => $id, "mode" => 'document'), "id_document=$id_document"); 324 325 } else $id_document = $id; 326 327 328 // Appliquer l'exif orientation 329 // http://trac.rezo.net/trac/spip/ticket/1494 330 define('_TOURNER_SELON_EXIF', false); # par defaut non, risque memoire 331 if (defined('_TOURNER_SELON_EXIF') 332 AND _TOURNER_SELON_EXIF 333 AND $mode == 'document' 334 AND $a['distant'] == 'non' 335 AND $a['extension'] == 'jpg') { 336 include_spip('action/tourner'); 337 tourner_selon_exif_orientation($id_document, $fichier); 338 } 339 340 } 341 // pour que le retour vers ecrire/ active le bon doc. 342 $documents_actifs[$fichier] = $id_document; 343 // Notifications, gestion des revisions, reindexation... 344 pipeline('post_edition', 345 array( 346 'args' => array( 347 'operation' => 'ajouter_document', 348 'table' => 'spip_documents', 349 'id_objet' => $id, 350 'type_image' => $type_image 351 ), 352 'data' => null 353 ) 354 ); 355 356 return $id ; 357 } 358 359 // http://doc.spip.org/@verifier_compactes 360 function verifier_compactes($zip) { 361 if (!$list = $zip->listContent()) return array(); 362 // si pas possible de decompacter: installer comme fichier zip joint 363 // Verifier si le contenu peut etre uploade (verif extension) 364 $aff_fichiers = array(); 365 foreach ($list as $file) { 366 if (accepte_fichier_upload($f = $file['stored_filename'])) 367 $aff_fichiers[$f] = $file; 368 else spip_log("chargement de $f interdit"); 369 } 370 ksort($aff_fichiers); 371 return $aff_fichiers; 372 } 373 374 // 375 // Convertit le type numerique retourne par getimagesize() en extension fichier 376 // 377 378 // http://doc.spip.org/@decoder_type_image 379 function decoder_type_image($type, $strict = false) { 380 switch ($type) { 381 case 1: 382 return "gif"; 383 case 2: 384 return "jpg"; 385 case 3: 386 return "png"; 387 case 4: 388 return $strict ? "" : "swf"; 389 case 5: 390 return "psd"; 391 case 6: 392 return "bmp"; 393 case 7: 394 case 8: 395 return "tif"; 396 default: 397 return ""; 398 } 399 } 400 401 402 // http://doc.spip.org/@traite_svg 403 function traite_svg($file) 404 { 405 $texte = spip_file_get_contents($file); 406 407 // Securite si pas admin : virer les scripts et les references externes 408 // sauf si on est en mode javascript 'ok' (1), cf. inc_version 409 if ($GLOBALS['filtrer_javascript'] < 1 410 AND $GLOBALS['visiteur_session']['statut'] != '0minirezo') { 411 include_spip('inc/texte'); 412 $new = trim(safehtml($texte)); 413 // petit bug safehtml 414 if (substr($new,0,2) == ']>') $new = ltrim(substr($new,2)); 415 if ($new != $texte) ecrire_fichier($file, $texte = $new); 416 } 417 418 $width = $height = 150; 419 if (preg_match(',<svg[^>]+>,', $texte, $s)) { 420 $s = $s[0]; 421 if (preg_match(',\WviewBox\s*=\s*.\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+),i', $s, $r)){ 422 $width = $r[3]; 423 $height = $r[4]; 424 } else { 425 // si la taille est en centimetre, estimer le pixel a 1/64 de cm 426 if (preg_match(',\Wwidth\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ 427 if ($r[2] != '%') { 428 $width = $r[1]; 429 if ($r[2] == 'cm') $width <<=6; 430 } 431 } 432 if (preg_match(',\Wheight\s*=\s*.(\d+)([^"\']*),i', $s, $r)){ 433 if ($r[2] != '%') { 434 $height = $r[1]; 435 if ($r[2] == 'cm') $height <<=6; 436 } 437 } 438 } 439 } 440 return array($width, $height); 441 } 442 443 // 444 // Corrige l'extension du fichier dans quelques cas particuliers 445 // (a passer dans ecrire/base/typedoc) 446 // A noter : une extension 'pdf ' passe dans la requete de controle 447 // mysql> SELECT * FROM spip_types_documents WHERE extension="pdf "; 448 // http://doc.spip.org/@corriger_extension 449 function corriger_extension($ext) { 450 $ext = preg_replace(',[^a-z0-9],i', '', $ext); 451 switch ($ext) { 452 case 'htm': 453 return 'html'; 454 case 'jpeg': 455 return 'jpg'; 456 case 'tiff': 457 return 'tif'; 458 case 'aif': 459 return 'aiff'; 460 default: 461 return $ext; 462 } 463 } 464 465 // Cherche dans la base le type-mime du tableau representant le document 466 // et corrige le nom du fichier ; retourne array(extension, nom corrige) 467 // s'il ne trouve pas, retourne '' et le nom inchange 468 // http://doc.spip.org/@fixer_extension_document 469 function fixer_extension_document($doc) { 470 $extension = ''; 471 $name = $doc['name']; 472 if (preg_match(',[.]([^.]+)$,', $name, $r) 473 AND $t = sql_fetsel("extension", "spip_types_documents", 474 "extension=" . sql_quote(corriger_extension($r[1])))) { 475 $extension = $t['extension']; 476 $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension; 477 } 478 else if ($t = sql_fetsel("extension", "spip_types_documents", 479 "mime_type=" . sql_quote($doc['type']))) { 480 $extension = $t['extension']; 481 $name = preg_replace(',[.][^.]*$,', '', $doc['name']).'.'.$extension; 482 } 483 484 return array($extension,$name); 485 } 486 487 // Afficher un formulaire de choix: decompacter et/ou garder tel quel 488 // et reconstruire un generer_action_auteur. 489 // Passer ca en squelette un de ces jours. 490 491 // http://doc.spip.org/@liste_archive_jointe 492 function liste_archive_jointe($valables, $zip, $type, $id, $mode, $id_document, $hash, $redirect, $iframe_redirect) 493 { 494 include_spip('inc/layer'); 495 496 $arg = (intval($id) .'/' .intval($id_document) . "/$mode/$type"); 497 498 $texte = "<div style='text-align: left'> 499 <input type='hidden' name='redirect' value='$redirect' /> 500 <input type='hidden' name='iframe_redirect' value='$iframe_redirect' /> 501 <input type='hidden' name='hash' value='$hash' /> 502 <input type='hidden' name='chemin' value='$zip' /> 503 <input type='hidden' name='arg' value='$arg' /> 504 <input type='radio' checked='checked' name='sousaction5' id='sousaction5_5' value='5' onchange='jQuery(\"#options_deballe_zip\").slideUp();' />" . 505 "<label for='sousaction5_5'>" . _T('upload_zip_telquel'). "</label>" . 506 "<br />". 507 "<input type='radio' name='sousaction5' id='sousaction5_6' value='6' onchange='jQuery(\"#options_deballe_zip\").slideDown();' />". 508 "<label for='sousaction5_6'>" . _T('upload_zip_decompacter') . "</label>" . 509 "<ol>" . 510 liste_archive_taille($valables) . 511 "</ol>" 512 513 . debut_block_depliable(false,'options_deballe_zip') 514 . "<input type='checkbox' name='sousaction4' id='sousaction4_4' value='4' />". 515 "<label for='sousaction4_4'>" . _T('upload_zip_conserver') . "</label>" . 516 "<br /><input type='checkbox' name='titrer' id='titrer' />" 517 . "<label for='titrer'>" . _T('upload_zip_titrer') . 518 "</label>". 519 "</div></div>" 520 . fin_block() 521 522 523 . "<div style='text-align: right;'><input class='fondo spip_xx-small' type='submit' value='". 524 _T('bouton_valider'). 525 "' />"; 526 527 $texte = "<p>" . 528 _T('upload_fichier_zip_texte') . 529 "</p><p>" . 530 _T('upload_fichier_zip_texte2') . 531 "</p>" . 532 generer_form_action('joindre', $texte,' method="post"'); 533 534 if(_request("iframe")=="iframe") { 535 return "<p>build form $iframe_redirect</p>" . 536 "<div class='upload_answer upload_zip_list'>" . 537 $texte . 538 "</div>"; 539 } else { return minipres(_T('upload_fichier_zip'), $texte); } 540 } 541 542 // http://doc.spip.org/@liste_archive_taille 543 function liste_archive_taille($files) { 544 $res = ''; 545 foreach ($files as $nom => $file) { 546 $date = date_interface(date("Y-m-d H:i:s", $file['mtime'])); 547 548 $taille = taille_en_octets($file['size']); 549 $res .= "<li title=\"".texte_backend($title)."\"><b>$nom</b> – $taille<br /> $date</li>\n"; 550 } 551 return $res; 552 } 342 array('largeur_vignette' => $infos['largeur'], 343 'hauteur_vignette' => $infos['hauteur'])) 344 )); 345 } 346 347 // Si on veut uploader une vignette, il faut qu'elle ait ete bien lue 348 if ($infos['mode'] == 'vignette') { 349 if ($infos['inclus'] != 'image') 350 return _T('medias:erreur_format_fichier_image',array('nom'=> $infos['fichier'])); #SVG 351 352 if (!($infos['largeur'] OR $infos['hauteur'])) 353 return _T('medias:erreur_upload_vignette',array('nom'=>$infos['fichier'])); 354 } 355 356 return true; 357 } 358 359 553 360 ?> -
_core_/plugins/medias/action/changer_mode_document.php
r43738 r43743 4 4 * SPIP, Systeme de publication pour l'internet * 5 5 * * 6 * Copyright (c) 2001-20 11*6 * Copyright (c) 2001-2009 * 7 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 8 * * … … 11 11 \***************************************************************************/ 12 12 13 if (!defined( '_ECRIRE_INC_VERSION')) return;13 if (!defined("_ECRIRE_INC_VERSION")) return; 14 14 15 15 … … 24 24 if (!preg_match(",^(\d+)\W(\w+)$,", $arg, $r)) 25 25 spip_log("action_changer_mode_document $arg pas compris"); 26 else action_changer_mode_document_post($r );26 else action_changer_mode_document_post($r[1],$r[2]); 27 27 } 28 28 29 29 // http://doc.spip.org/@action_changer_mode_document_post 30 function action_changer_mode_document_post($ r)30 function action_changer_mode_document_post($id_document, $mode) 31 31 { 32 32 // - id_document le doc a modifier 33 33 // - mode le mode a lui donner 34 list(, $id_document, $mode) = $r;35 34 if ($id_document = intval($id_document) 36 35 AND in_array($mode, array('vignette', 'image', 'document'))) { 37 36 sql_updateq('spip_documents', array('mode'=>$mode), 'id_document='.$id_document); 38 37 } 39 if ($case = _request('afficher_case')){40 $case = explode('-',$case);41 list($id,$type,$script) = $case;42 include_spip('inc/presentation');43 include_spip('inc/documents');44 include_spip('inc/actions');45 // vilain hack pour ne pas recharger un script js46 affiche_raccourci_doc('doc', $id_document, 'left');47 // voila48 ajax_retour(afficher_case_document($id_document, $id, $script, $type, true));49 exit();50 }51 38 } 52 39 ?> -
_core_/plugins/medias/action/copier_local.php
r43738 r43743 4 4 * SPIP, Systeme de publication pour l'internet * 5 5 * * 6 * Copyright (c) 2001-20 11*6 * Copyright (c) 2001-2009 * 7 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 8 * * … … 11 11 \***************************************************************************/ 12 12 13 if (!defined( '_ECRIRE_INC_VERSION')) return;13 if (!defined("_ECRIRE_INC_VERSION")) return; 14 14 15 15 // Fonction appellee lorsque l'utilisateur clique sur le bouton … … 19 19 20 20 // http://doc.spip.org/@action_copier_local_dist 21 function action_copier_local_dist( ) {21 function action_copier_local_dist($id_document=null) { 22 22 23 // Recupere les arguments. 24 $securiser_action = charger_fonction('securiser_action', 'inc'); 25 $arg = $securiser_action(); 26 27 $id_document = intval($arg); 23 if (!$id_document){ 24 // Recupere les arguments. 25 $securiser_action = charger_fonction('securiser_action', 'inc'); 26 $arg = $securiser_action(); 27 28 $id_document = intval($arg); 29 } 28 30 29 31 if (!$id_document) { 30 32 spip_log("action_copier_local_dist $arg pas compris"); 33 return false; 31 34 } else { 32 35 // arguments recuperes, on peut maintenant appeler la fonction. 33 action_copier_local_post($id_document);36 return action_copier_local_post($id_document); 34 37 } 35 38 } … … 39 42 40 43 // Il faut la source du document pour le copier 41 $row = sql_fetsel(" fichier, descriptif", "spip_documents", "id_document=$id_document");44 $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document=$id_document"); 42 45 $source = $row['fichier']; 43 46 44 47 include_spip('inc/distant'); // pour 'copie_locale' 45 include_spip('inc/documents'); // pour 'set_spip_doc'46 48 $fichier = copie_locale($source); 47 49 if ($fichier) { 48 50 $fichier = _DIR_RACINE . $fichier; 49 $taille = filesize($fichier); 50 // On le sort du repertoire IMG/distant/ 51 $dest = preg_replace(',^.*/distant/[^/_]+[/_],', '', $fichier); 52 $dest = sous_repertoire(_DIR_IMG, preg_replace(',^.*\.,', '', $fichier)) . $dest; 53 if ($dest != $fichier 54 AND @rename($fichier, $dest)) 55 $fichier = $dest; 51 $files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier)); 52 $ajouter_documents = charger_fonction('ajouter_documents','action'); 53 spip_log("convertit doc $id_document en local: $source => $fichier"); 54 $liste = array(); 55 $ajouter_documents($id_document,$files,'',0,$row['mode'],$liste); 56 56 57 // On indique l'ancien URL dans le descriptif (pis-aller) 58 $row['descriptif'] .= ($row['descriptif'] ? "\n\n":'') . "[->$source]"; 59 60 // $fichier contient IMG/distant/... 61 // or, dans la table documents, IMG doit etre exclu. 62 $fichier = set_spip_doc($fichier); 63 spip_log("convertit doc $id_document en local: $source => $fichier"); 64 sql_updateq('spip_documents', array('fichier' =>$fichier, 'distant'=>'non', 'taille'=>$taille, 'descriptif'=> $row['descriptif']),"id_document=".$id_document); 57 spip_unlink($fichier); 65 58 66 pipeline('post_edition', 67 array( 68 'args' => array( 69 'operation' => 'copier_local_post', 70 'table' => 'spip_documents', 71 'id_objet' => $id_document 72 ), 73 'data' => null 74 ) 75 ); 59 // ajouter l'origine du document aux credits 60 include_spip('action/editer_document'); 61 document_set($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source)); 62 return true; 76 63 77 64 } else { 78 65 spip_log("echec copie locale $source"); 79 66 } 67 return _T('medias:erreur_copie_fichier',array('nom'=>$source)); 80 68 } 81 69 -
_core_/plugins/medias/action/supprimer_document.php
r43738 r43743 4 4 * SPIP, Systeme de publication pour l'internet * 5 5 * * 6 * Copyright (c) 2001-20 11*6 * Copyright (c) 2001-2009 * 7 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 8 * * … … 11 11 \***************************************************************************/ 12 12 13 if (!defined( '_ECRIRE_INC_VERSION')) return;13 if (!defined("_ECRIRE_INC_VERSION")) return; 14 14 15 15 // http://doc.spip.org/@supprimer_document 16 function action_supprimer_document_dist($id_document) { 16 function action_supprimer_document_dist($id_document=0) { 17 if (!$id_document){ 18 $securiser_action = charger_fonction('securiser_action','inc'); 19 $id_document = $securiser_action(); 20 } 21 include_spip('inc/autoriser'); 17 22 if (!autoriser('supprimer','document',$id_document)) 18 23 return false; 19 24 25 // si c'etait une vignette, modifier le document source ! 26 if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette='.intval($id_document))){ 27 include_spip('action/editer_document'); 28 document_set($source,array("id_vignette" => 0)); 29 } 30 20 31 include_spip('inc/documents'); 21 if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document='. $id_document))32 if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document='.intval($id_document))) 22 33 return false; 23 34 … … 30 41 } 31 42 43 // dereferencer dans la base 44 sql_delete('spip_documents', 'id_document='.intval($id_document)); 45 46 32 47 // Supprimer le fichier si le doc est local, 33 48 // et la copie locale si le doc est distant 34 49 if ($doc['distant'] == 'oui') { 35 50 include_spip('inc/distant'); 36 if ($local = copie_locale($doc['fichier'],'test'))51 if ($local = _DIR_RACINE . copie_locale($doc['fichier'],'test')) 37 52 spip_unlink($local); 38 53 } 39 else spip_unlink(get_spip_doc($doc['fichier'])); 54 else 55 spip_unlink(get_spip_doc($doc['fichier'])); 40 56 41 sql_delete('spip_documents', 'id_document='.$id_document); 57 pipeline('post_edition', 58 array( 59 'args' => array( 60 'operation' => 'supprimer_document', 61 'table' => 'spip_documents', 62 'id_objet' => $id_document 63 ), 64 'data' => null 65 ) 66 ); 42 67 } 43 68 -
_core_/plugins/medias/action/tourner.php
r43738 r43743 4 4 * SPIP, Systeme de publication pour l'internet * 5 5 * * 6 * Copyright (c) 2001-20 11*6 * Copyright (c) 2001-2009 * 7 7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * 8 8 * * … … 11 11 \***************************************************************************/ 12 12 13 if (!defined( '_ECRIRE_INC_VERSION')) return;13 if (!defined("_ECRIRE_INC_VERSION")) return; 14 14 15 15 // http://doc.spip.org/@action_tourner_dist … … 20 20 if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) { 21 21 spip_log("action_tourner_dist $arg pas compris"); 22 } else action_tourner_post($r );22 } else action_tourner_post($r[1],$r[2]); 23 23 } 24 24 25 25 // http://doc.spip.org/@action_tourner_post 26 function action_tourner_post($ r)26 function action_tourner_post($id_document,$angle) 27 27 { 28 $arg = $r[1]; 29 $row = sql_fetsel("fichier", "spip_documents", "id_document=$arg"); 28 $row = sql_fetsel("fichier,extension", "spip_documents", "id_document=".intval($id_document)); 30 29 31 30 if (!$row) return; … … 34 33 include_spip('inc/documents'); 35 34 // Fichier destination : on essaie toujours de repartir de l'original 36 $var_rot = $r[2]; 35 $var_rot = $angle; 36 37 37 include_spip('inc/distant'); # pour copie_locale 38 38 $src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier'])); … … 48 48 spip_log("rotation $var_rot $src : $dest"); 49 49 50 $process = $GLOBALS['meta']['image_process']; 50 include_spip('inc/filtres'); 51 include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0 52 $res = filtrer('image_rotation',$src,$var_rot); 53 $res = filtrer('image_format',$res,$row['extension']); 51 54 52 // imagick (php4-imagemagick) 53 if ($process == 'imagick') { 54 $handle = imagick_readimage($src); 55 imagick_rotate($handle, $var_rot); 56 imagick_write($handle, $dest); 57 if (!@file_exists($dest)) return; // echec imagick 58 } 59 else if ($process == "gd2") { // theoriquement compatible gd1, mais trop forte degradation d'image 60 gdRotate ($src, $dest, $var_rot); 61 } 62 else if ($process == "convert") { 63 if (_CONVERT_COMMAND!='') { 64 define ('_CONVERT_COMMAND', 'convert'); 65 define ('_ROTATE_COMMAND', _CONVERT_COMMAND.' -rotate %t %src %dest'); 66 } else 67 define ('_ROTATE_COMMAND', ''); 68 if (_ROTATE_COMMAND!=='') { 69 $commande = str_replace( 70 array('%t', '%src', '%dest'), 71 array( 72 $var_rot, 73 escapeshellcmd($src), 74 escapeshellcmd($dest) 75 ), 76 _ROTATE_COMMAND); 77 spip_log($commande); 78 exec($commande); 79 } else 80 $dest = $src; 81 } 55 list($hauteur,$largeur) = taille_image($res); 56 $res = extraire_attribut($res,'src'); 57 58 include_spip('inc/getdocument'); 59 deplacer_fichier_upload($res,$dest); 82 60 } 83 else 61 else { 84 62 $dest = $src; 85 86 $size_image = @getimagesize($dest);87 $largeur = $size_image[0];88 $hauteur = $size_image[1];63 $size_image = @getimagesize($dest); 64 $largeur = $size_image[0]; 65 $hauteur = $size_image[1]; 66 } 89 67 90 68 // succes ! 91 69 if ($largeur>0 AND $hauteur>0) { 92 sql_updateq('spip_documents', array('fichier' => set_spip_doc($dest), 'largeur'=>$largeur, 'hauteur'=>$hauteur), "id_document=$arg"); 70 $set = array( 71 'fichier' => set_spip_doc($dest), 72 'largeur'=>$largeur, 'hauteur'=>$hauteur, 73 'distant'=>'non' // le document n'est plus distant apres une transformation 74 ); 75 if ($taille = @filesize($dest)) 76 $set['taille'] = $taille; 77 sql_updateq('spip_documents', $set, "id_document=".intval($id_document)); 93 78 if ($effacer) { 94 spip_log(" j'efface $effacer");79 spip_log("rotation : j'efface $effacer"); 95 80 spip_unlink($effacer); 96 81 } … … 103 88 'spip_table_objet' => 'spip_documents', 104 89 'type' =>'document', 105 'id_objet' => $ arg,106 'champs' => array('rotation'=>$ r[2],'orientation'=>$var_rot,'fichier'=>$row),90 'id_objet' => $id_document, 91 'champs' => array('rotation'=>$angle,'orientation'=>$var_rot,'fichier'=>$row['fichier']), 107 92 'serveur' => $serveur, 108 93 'action'=>'tourner', 109 94 ), 110 'data' => array('fichier'=>$row)95 'data' => $set 111 96 ) 112 97 ); 113 98 } 114 99 115 }116 117 118 /////////////////////////////////////////////////////////////////////119 //120 // Faire tourner une image121 //122 // http://doc.spip.org/@gdRotate123 function gdRotate ($src, $dest, $rtt){124 $src_img = '';125 if(preg_match("/\.(png|gif|jpe?g|bmp)$/i", $src, $regs)) {126 switch($regs[1]) {127 case 'png':128 if (function_exists('ImageCreateFromPNG')) {129 $src_img=ImageCreateFromPNG($src);130 $save = 'imagepng';131 }132 break;133 case 'gif':134 if (function_exists('ImageCreateFromGIF')) {135 $src_img=ImageCreateFromGIF($src);136 $save = 'imagegif';137 }138 break;139 case 'jpeg':140 case 'jpg':141 if (function_exists('ImageCreateFromJPEG')) {142 $src_img=ImageCreateFromJPEG($src);143 $save = 'Imagejpeg';144 }145 break;146 case 'bmp':147 if (function_exists('ImageCreateFromWBMP')) {148 $src_img=@ImageCreateFromWBMP($src);149 $save = 'imagewbmp';150 }151 break;152 }153 }154 155 if (!$src_img) {156 spip_log("gdrotate: image non lue, $src");157 return false;158 }159 160 $size=@getimagesize($src);161 if (!($size[0] * $size[1])) return false;162 163 if (function_exists('imagerotate')) {164 $dst_img = imagerotate($src_img, -$rtt, 0);165 } else {166 167 // Creer l'image destination (hauteur x largeur) et la parcourir168 // pixel par pixel (un truc de fou)169 if ($rtt == 180)170 $size_dest = $size;171 else172 $size_dest = array($size[1],$size[0]);173 174 if ($GLOBALS['meta']['image_process'] == "gd2")175 $dst_img=ImageCreateTrueColor($size_dest[0],$size_dest[1]);176 else177 $dst_img=ImageCreate($size_dest[0],$size_dest[1]);178 179 // t=top; b=bottom; r=right; l=left180 for ($t=0;$t<=$size_dest[0]-1; $t++) {181 $b = $size_dest[0] -1 - $t;182 for ($l=0;$l<=$size_dest[1]-1; $l++) {183 $r = $size_dest[1] -1 - $l;184 switch ($rtt) {185 case 90:186 imagecopy($dst_img,$src_img,$t,$r,$r,$b,1,1);187 break;188 case 270:189 imagecopy($dst_img,$src_img,$t,$l,$r,$t,1,1);190 break;191 case 180:192 imagecopy($dst_img,$src_img,$t,$l,$b,$r,1,1);193 break;194 }195 }196 }197 }198 ImageDestroy($src_img);199 ImageInterlace($dst_img,0);200 201 // obligatoire d'enregistrer dans le meme format, puisqu'on change le doc202 // mais pas son extension203 $save($dst_img,$dest);204 100 } 205 101 … … 210 106 211 107 if (function_exists('exif_read_data') 212 AND function_exists('imagerotate')213 108 AND $exif = exif_read_data($fichier) 214 109 AND ( -
_core_/plugins/medias/base/medias.php
r43738 r43743 21 21 $interfaces['table_des_tables']['documents']='documents'; 22 22 $interfaces['table_des_tables']['types_documents']='types_documents'; 23 23 24 $interfaces['exceptions_des_tables']['documents']['type_document']=array('types_documents' 24 25 , 'titre'); 25 26 $interfaces['exceptions_des_tables']['documents']['extension_document']=array('types_documents', 'extension'); 26 $interfaces['exceptions_des_tables']['documents']['mime_type']=array('types_documents' 27 , 'mime_type'); 27 $interfaces['exceptions_des_tables']['documents']['mime_type']=array('types_documents', 'mime_type'); 28 $interfaces['exceptions_des_tables']['documents']['media']=array('types_documents', 'media'); 29 28 30 $interfaces['table_titre']['documents']= "titre, fichier AS surnom, '' AS lang"; 29 31 $interfaces['table_date']['documents']='date'; … … 58 60 "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", 59 61 "descriptif" => "text DEFAULT '' NOT NULL", 60 "fichier" => " varchar(255) DEFAULT '' NOT NULL",62 "fichier" => "text NOT NULL DEFAULT ''", 61 63 "taille" => "integer", 62 64 "largeur" => "integer", … … 64 66 "mode" => "ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL", 65 67 "distant" => "VARCHAR(3) DEFAULT 'non'", 68 "statut" => "varchar(10) DEFAULT '0' NOT NULL", 69 "credits" => "varchar(255) DEFAULT '' NOT NULL", 70 "date_publication" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", 71 "brise" => "tinyint DEFAULT 0", 66 72 "maj" => "TIMESTAMP"); 67 73 … … 82 88 "inclus" => "ENUM('non', 'image', 'embed') DEFAULT 'non' NOT NULL", 83 89 "upload" => "ENUM('oui', 'non') DEFAULT 'oui' NOT NULL", 90 "media" => "varchar(10) DEFAULT 'file' NOT NULL", 84 91 "maj" => "TIMESTAMP"); 85 92 … … 148 155 global $tables_images, $tables_sequences, $tables_documents, $tables_mime; 149 156 include_spip('base/typedoc'); 157 include_spip('base/abstract_sql'); 150 158 151 159 foreach ($tables_mime as $extension => $type_mime) { … … 165 173 $titre = ''; 166 174 } 175 176 // type de media 177 $media = "file"; 178 if (preg_match(",^image/,",$type_mime) OR in_array($type_mime,array('application/illustrator'))) 179 $media = "image"; 180 elseif (preg_match(",^audio/,",$type_mime)) 181 $media = "audio"; 182 elseif (preg_match(",^video/,",$type_mime) OR in_array($type_mime,array('application/ogg','application/x-shockwave-flash','application/mp4'))) 183 $media = "video"; 184 167 185 // Init ou Re-init ==> replace pas insert 168 186 sql_replace('spip_types_documents', … … 171 189 'inclus' => $inclus, 172 190 'extension' => $extension, 191 'media' => $media, 173 192 'upload' => 'oui' 174 193 ), … … 177 196 } 178 197 198 199 function medias_check_statuts($affiche = false){ 200 $trouver_table = charger_fonction('trouver_table','base'); 201 $desc = $trouver_table('documents'); 202 # securite, si jamais on arrive ici avant un upgrade de base 203 if (!isset($desc['field']['statut'])) 204 return; 205 206 // utiliser sql_allfetsel pour clore la requete avant la mise a jour en base sur chaque doc (sqlite) 207 // iterer par groupe de 100 pour ne pas exploser sur les grosses bases 208 $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100")); 209 while (count($docs)){ 210 include_spip('action/editer_document'); 211 foreach($docs as $id_document) 212 // mettre a jour le statut si necessaire 213 instituer_document($id_document); 214 if ($affiche) echo " ."; 215 $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100")); 216 } 217 } 179 218 180 219 function medias_upgrade($nom_meta_base_version,$version_cible){ … … 186 225 maj_tables(array('spip_documents','spip_documents_liens','spip_types_documents')); 187 226 creer_base_types_doc(); 188 ecrire_meta($nom_meta_base_version,$current_version="0.1",'non'); 227 ecrire_meta($nom_meta_base_version,$current_version=$version_cible,'non'); 228 } 229 if (spip_version_compare($current_version,'0.2.0','<')){ 230 include_spip('base/abstract_sql'); 231 sql_alter("TABLE spip_documents ADD statut varchar(10) DEFAULT '0' NOT NULL"); 232 ecrire_meta($nom_meta_base_version,$current_version="0.2",'non'); 233 } 234 if (spip_version_compare($current_version,'0.3.0','<')){ 235 include_spip('base/abstract_sql'); 236 // ajouter un champ 237 sql_alter("TABLE spip_documents ADD date_publication datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); 238 // vider le cache des descriptions de tables 239 $trouver_table = charger_fonction('trouver_table','base'); 240 $trouver_table(false); 241 // ecrire la version pour ne plus passer la 242 ecrire_meta($nom_meta_base_version,$current_version="0.3.0",'non'); 243 } 244 if (spip_version_compare($current_version,'0.4.0','<')){ 245 // recalculer tous les statuts en tenant compte de la date de publi des articles... 246 echo "Mise a jour des statuts de documents..."; 247 medias_check_statuts(true); 248 ecrire_meta($nom_meta_base_version,$current_version="0.4.0",'non'); 249 } 250 if (spip_version_compare($current_version,'0.5.0','<')){ 251 include_spip('base/abstract_sql'); 252 // ajouter un champ 253 sql_alter("TABLE spip_documents ADD brise tinyint DEFAULT 0"); 254 // vider le cache des descriptions de tables 255 $trouver_table = charger_fonction('trouver_table','base'); 256 $trouver_table(false); 257 ecrire_meta($nom_meta_base_version,$current_version="0.5.0",'non'); 258 } 259 if (spip_version_compare($current_version,'0.6.0','<')){ 260 include_spip('base/abstract_sql'); 261 sql_alter("TABLE spip_types_documents ADD media varchar(10) DEFAULT 'file' NOT NULL"); 262 creer_base_types_doc(); 263 ecrire_meta($nom_meta_base_version,$current_version="0.6.0",'non'); 264 } 265 if (spip_version_compare($current_version,'0.7.0','<')){ 266 include_spip('base/abstract_sql'); 267 sql_alter("TABLE spip_documents ADD credits varchar(255) DEFAULT '' NOT NULL"); 268 ecrire_meta($nom_meta_base_version,$current_version="0.7.0",'non'); 269 } 270 if (spip_version_compare($current_version,'0.10.0','<')){ 271 // Augmentation de la taille du champ fichier pour permettre les URL longues 272 include_spip('base/abstract_sql'); 273 sql_alter("TABLE spip_documents CHANGE fichier fichier TEXT NOT NULL DEFAULT ''"); 274 ecrire_meta($nom_meta_base_version,$current_version="0.10.0",'non'); 189 275 } 190 276 } 191 } 277 medias_check_statuts(); 278 } 279 280 function medias_install($action,$prefix,$version_cible){ 281 $version_base = $GLOBALS[$prefix."_base_version"]; 282 switch ($action){ 283 case 'test': 284 # plus necessaire si pas de bug :p 285 # medias_check_statuts(); 286 return (isset($GLOBALS['meta'][$prefix."_base_version"]) 287 AND version_compare($GLOBALS['meta'][$prefix."_base_version"],$version_cible,">=")); 288 break; 289 case 'install': 290 medias_upgrade('medias_base_version',$version_cible); 291 break; 292 case 'uninstall': 293 # pas de deinstallation sur les documents pour le moment, trop dangereux 294 # medias_vider_tables(); 295 break; 296 } 297 } 298 192 299 193 300 function medias_optimiser_base_disparus($flux){ -
_core_/plugins/medias/inc/documents.php
r43738 r43743 88 88 . '&file=' . rawurlencode($f) 89 89 ,false,true); 90 }91 92 // http://doc.spip.org/@document_et_vignette93 function document_et_vignette($document, $url, $portfolio=false) {94 $image = $document['id_vignette'];95 96 if ($image)97 $image = sql_fetsel("*", "spip_documents", "id_document = ".$image);98 if ($image) {99 if (!$portfolio OR !($GLOBALS['meta']['creer_preview'] == 'oui')) {100 $x = $image['largeur'];101 $y = $image['hauteur'];102 } else {103 $x = 120;104 $y = 110;105 }106 $image = get_spip_doc($image['fichier']);107 } else {108 if ($portfolio) {109 $x = 110;110 $y = 120;111 } else $x = $y =-1;112 }113 if (!$url) $url = generer_url_document_dist($document['id_document'], 'document');114 return vignette_automatique($image, $document, $url, $x, $y, '', "miniature_document");115 90 } 116 91 … … 199 174 // http://doc.spip.org/@afficher_documents_colonne 200 175 function afficher_documents_colonne($id, $type="article",$script=NULL) { 201 include_spip('inc/autoriser'); 202 203 // il faut avoir les droits de modif sur l'article pour pouvoir uploader ! 204 if (!autoriser('joindredocument',$type,$id)) 205 return ""; 206 207 include_spip('inc/presentation'); // pour l'aide quand on appelle afficher_documents_colonne depuis un squelette 208 // seuls cas connus : article, breve ou rubrique 209 if ($script==NULL){ 210 $script = $type.'s_edit'; 211 if (!test_espace_prive()) 212 $script = parametre_url(self(),"show_docs",''); 213 } 214 $id_document_actif = _request('show_docs'); 215 216 $joindre = charger_fonction('joindre', 'inc'); 217 218 define('_INTERFACE_DOCUMENTS', true); 219 if (!_INTERFACE_DOCUMENTS 220 OR $GLOBALS['meta']["documents_$type"]=='non') { 221 222 // Ajouter nouvelle image 223 $ret = "<div id='images'>\n" 224 . $joindre(array( 225 'cadre' => 'relief', 226 'icone' => 'image-24.gif', 227 'fonction' => 'new', 228 'titre' => majuscules(_T('bouton_ajouter_image')).aide("ins_img"), 229 'script' => $script, 230 'args' => "id_$type=$id", 231 'id' => $id, 232 'intitule' => _T('info_telecharger'), 233 'mode' => 'image', 234 'type' => $type, 235 'ancre' => '', 236 'id_document' => 0, 237 'iframe_script' => generer_url_ecrire("documents_colonne","id=$id&type=$type",true) 238 )) 239 . '</div><br />'; 240 241 if (!_INTERFACE_DOCUMENTS) { 242 //// Images sans documents 243 $res = sql_select("D.id_document", "spip_documents AS D LEFT JOIN spip_documents_liens AS T ON T.id_document=D.id_document", "T.id_objet=" . intval($id) . " AND T.objet=" . sql_quote($type) . " AND D.mode='image'", "", "D.id_document"); 244 245 $ret .= "\n<div id='liste_images'>"; 246 247 while ($doc = sql_fetch($res)) { 248 $id_document = $doc['id_document']; 249 $deplier = ($id_document_actif==$id_document); 250 $ret .= afficher_case_document($id_document, $id, $script, $type, $deplier); 251 } 252 253 $ret .= "</div><br /><br />\n"; 254 } 255 } 256 257 /// Ajouter nouveau document 258 $bouton = !_INTERFACE_DOCUMENTS 259 ? majuscules(_T('bouton_ajouter_document')).aide("ins_doc") 260 : (_T('bouton_ajouter_image_document')).aide("ins_doc"); 261 262 $ret .= "<div id='documents'></div>\n<div id='portfolio'></div>\n"; 263 if ($GLOBALS['meta']["documents_$type"]!='non') { 264 $ret .= $joindre(array( 265 'cadre' => _INTERFACE_DOCUMENTS ? 'relief' : 'enfonce', 266 'icone' => 'doc-24.gif', 267 'fonction' => 'new', 268 'titre' => $bouton, 269 'script' => $script, 270 'args' => "id_$type=$id", 271 'id' => $id, 272 'intitule' => _T('info_telecharger'), 273 'mode' => _INTERFACE_DOCUMENTS ? 'choix' : 'document', 274 'type' => $type, 275 'ancre' => '', 276 'id_document' => 0, 277 'iframe_script' => generer_url_ecrire("documents_colonne","id=$id&type=$type",true) 278 )); 279 } 280 281 // Afficher les documents lies 282 $ret .= "<br /><div id='liste_documents'>\n"; 283 284 //// Documents associes 285 $res = sql_select("D.id_document", "spip_documents AS D LEFT JOIN spip_documents_liens AS T ON T.id_document=D.id_document", "T.id_objet=" . intval($id) . " AND T.objet=" . sql_quote($type) 286 . ((!_INTERFACE_DOCUMENTS) 287 ? " AND D.mode='document'" 288 : " AND D.mode IN ('image','document')" 289 ), "", "D.mode, D.id_document"); 290 291 while($row = sql_fetch($res)) 292 $ret .= afficher_case_document($row['id_document'], $id, $script, $type, ($id_document_actif==$row['id_document'])); 293 294 $ret .= "</div>"; 295 if (test_espace_prive()){ 296 $ret .= http_script('', "async_upload.js") 297 . http_script('$("form.form_upload").async_upload(async_upload_article_edit)'); 298 } 299 300 return $ret; 176 if (!is_array($GLOBALS['medias_exec_colonne_document']) OR !in_array(_request('exec'),$GLOBALS['medias_exec_colonne_document'])) 177 $GLOBALS['medias_exec_colonne_document'][] = _request('exec'); 178 return ""; 301 179 } 302 180 … … 323 201 } 324 202 325 326 // Est-ce que le document est inclus dans le texte ?327 // http://doc.spip.org/@est_inclus328 function est_inclus($id_document) {329 return isset($GLOBALS['doublons_documents_inclus']) ?330 in_array($id_document,$GLOBALS['doublons_documents_inclus']) : false;331 }332 333 //334 // Afficher un document sous forme de bloc depliable335 // en donnant un apercu336 // et en indiquer le raccourci permettant l'incrustation337 // Pour les distant, donner un bouton pour rappatriement (trombone)338 // Pour les images, donnner les boutons de rotations339 340 341 // http://doc.spip.org/@afficher_case_document342 function afficher_case_document($id_document, $id, $script, $type, $deplier=false) {343 global $spip_lang_right;344 345 $document = sql_fetsel("D.id_document, D.id_vignette,D.extension,D.titre,D.descriptif,D.fichier,D.largeur,D.hauteur,D.taille,D.mode,D.distant, D.date, L.vu", "spip_documents AS D INNER JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "L.id_objet=".intval($id)." AND objet=".sql_quote($type)." AND L.id_document=".intval($id_document));346 347 if (!$document) return "";348 349 $id_vignette = $document['id_vignette'];350 $extension = $document['extension'];351 $descriptif = $document['descriptif'];352 $fichier = $document['fichier'];353 $largeur = $document['largeur'];354 $hauteur = $document['hauteur'];355 $mode = $document['mode'];356 $distant = $document['distant'];357 $titre = $document['titre'];358 $legender = charger_fonction('legender', 'inc');359 $dist = '';360 361 $r = sql_fetsel("titre,inclus", "spip_types_documents", "extension=".sql_quote($extension));362 if ($r) {363 $type_inclus = $r['inclus'];364 $type_titre = $r['titre'];365 }366 367 if ($mode == 'document') {368 369 if ($distant == 'oui') {370 include_spip('inc/tourner');371 $dist = "\n<div class='verdana1' style='float: $spip_lang_right; text-align: $spip_lang_right;'>"372 . "\n<img src='" . chemin_image('attachment.gif') . "'\n\talt=\"$fichier\"\n\ttitle=\"$fichier\" />\n"373 . bouton_copier_local($document, $type, $id, $id_document, $script)374 . "</div>\n";375 }376 377 if (est_inclus($id_document))378 $raccourci = affiche_raccourci_doc('doc', $id_document, '');379 else {380 $vign= (($type_inclus == "embed" OR $type_inclus == "image") AND $largeur > 0 AND $hauteur > 0);381 $raccourci = $vign ? ("<b>"._T('info_inclusion_vignette')."</b><br />") : '';382 383 $raccourci .= "<div style='color: 333333'>"384 . affiche_raccourci_doc('doc', $id_document, 'left')385 . affiche_raccourci_doc('doc', $id_document, 'center')386 . affiche_raccourci_doc('doc', $id_document, 'right')387 . "</div>\n";388 389 if ($vign) {390 $raccourci .= "<div style='padding:2px; ' class='arial1 spip_xx-small'>";391 $raccourci .= "<b>"._T('info_inclusion_directe')."</b><br />";392 $raccourci .= "<div style='color: 333333'>"393 . affiche_raccourci_doc('emb', $id_document, 'left')394 . affiche_raccourci_doc('emb', $id_document, 'center')395 . affiche_raccourci_doc('emb', $id_document, 'right')396 . "</div>\n";397 $raccourci .= "</div>";398 }399 }400 $ninclus = false;401 $icone = 'doc-24.gif';402 $style = 'e';403 404 } else if ($mode == 'image') {405 406 $icone = 'image-24.gif';407 $style = 'r';408 $ninclus = ($type_inclus !== 'image');409 $doc = ($descriptif OR $titre) ? 'doc' : 'img';410 411 if (est_inclus($id_document))412 $raccourci = affiche_raccourci_doc($doc, $id_document, '');413 else {414 $raccourci =415 affiche_raccourci_doc($doc, $id_document, 'left')416 . affiche_raccourci_doc($doc, $id_document, 'center')417 . affiche_raccourci_doc($doc, $id_document, 'right');418 }419 420 }421 $cadre = lignes_longues(typo($titre ? $titre : basename($fichier)), 20);422 // encapsuler chaque document dans un container pour permettre son remplacement en ajax423 return '<div>'424 . debut_cadre($style, $icone, '', $cadre, "document$id_document")425 . ($ninclus ? '' :426 ("\n<div style='text-align: center'>"427 . $dist428 . document_et_vignette($document, '', true)429 . '</div>'430 . "\n<div class='verdana1' style='text-align: center; color: black;'>\n"431 . ($type_titre ? $type_titre :432 ( _T('info_document').' '.majuscules($extension)))433 . "</div>"))434 . $apercu435 . "\n<div style='padding:2px; ' class='arial1 spip_xx-small'>"436 . $raccourci437 . "</div>\n"438 . $legender($id_document, $document, $script, $type, $id, "document$id_document", $deplier)439 . fin_cadre($style)440 . '</div>';441 }442 443 // Etablit la liste des documents orphelins, c'est-a-dire qui ne sont lies444 // a rien ; renvoie un tableau (id_document)445 // ici on ne join pas avec la table objet pour voir si l'objet existe vraiment446 // on considere que c'est le role d'optimiser que de nettoyer les liens morts447 // sinon eventuellement appeler avant une fonction nettoyer_liens_documents448 // http://doc.spip.org/@lister_les_documents_orphelins449 function lister_les_documents_orphelins() {450 $s = sql_select("D.id_document, D.id_vignette", "spip_documents AS D LEFT JOIN spip_documents_liens AS L ON D.id_document=L.id_document", "(L.id_objet IS NULL)");451 452 $orphelins = array();453 while ($t = sql_fetch($s)) {454 $orphelins[$t['id_document']] = true;455 // la vignette d'un orphelin est orpheline456 if ($t['id_vignette'])457 $orphelins[$t['id_vignette']] = true;458 459 }460 461 // les vignettes qui n'appartiennent a aucun document sont aussi orphelines462 $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");463 while ($t = sql_fetch($s))464 $orphelins[$t['id_document']] = true;465 466 return array_keys(array_filter($orphelins));467 }468 469 // Supprimer les documents de la table spip_documents,470 // ainsi que les fichiers correspondants dans IMG/471 // Fonction a n'appeler que sur des documents orphelins472 // http://doc.spip.org/@supprimer_documents473 function supprimer_documents($liste = array()) {474 if (!count($liste))475 return;476 477 $in = sql_in('id_document', $liste);478 479 // Supprimer les fichiers locaux et les copies locales480 // des docs distants481 $s = sql_select("fichier, distant", "spip_documents", $in);482 while ($t = sql_fetch($s)) {483 if ($t['distant'] == 'oui') {484 include_spip('inc/distant');485 if ($local = copie_locale($t['fichier'], 'test'))486 spip_log("efface $local = ".$t['fichier']);487 supprimer_fichier($local);488 }489 else {490 if (@file_exists($f = get_spip_doc($t['fichier']))) {491 spip_log("efface $f");492 supprimer_fichier($f);493 }494 }495 }496 497 // Supprimer les entrees dans spip_documents et associees498 sql_delete('spip_documents', $in);499 // en principe il ne devrait rien y avoir ici si les documents sont bien orphelins500 sql_delete('spip_documents_liens', $in);501 }502 503 203 ?> -
_core_/plugins/medias/inc/getdocument.php
r43738 r43743 10 10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * 11 11 \***************************************************************************/ 12 # 13 # Fichier obsolete, a supprimer 14 # 15 # 16 # 17 # 18 # 12 19 13 20 if (!defined('_ECRIRE_INC_VERSION')) return; -
_core_/plugins/medias/medias_autoriser.php
r43738 r43743 13 13 if (!defined('_ECRIRE_INC_VERSION')) return; 14 14 15 function medias_autoriser() {} 15 /* Pour que le pipeline de rale pas ! */ 16 function medias_autoriser(){} 17 18 19 function autoriser_portfolio_administrer_dist($faire,$quoi,$id,$qui,$options) { 20 return $qui['statut'] == '0minirezo'; 21 } 22 23 function autoriser_documents_bouton_dist($faire,$quoi,$id,$qui,$options) { 24 return autoriser('administrer','portfolio',$id,$qui,$options); 25 } 26 27 /** 28 * Autoriser le changement des dimensions sur un document 29 * @param <type> $faire 30 * @param <type> $quoi 31 * @param <type> $id 32 * @param <type> $qui 33 * @param <type> $options 34 * @return <type> 35 */ 36 function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) { 37 38 if (!$id_document=intval($id)) 39 return false; 40 if (!autoriser('modifier','document',$id,$qui,$options)) 41 return false; 42 43 if (!isset($options['document']) OR !$document = $options['document']) 44 $document = sql_fetsel('*','spip_documents','id_document='.intval($id_document)); 45 46 // (on ne le propose pas pour les images qu'on sait 47 // lire : gif jpg png), sauf bug, ou document distant 48 if (in_array($document['extension'], array('gif','jpg','png')) 49 AND $document['hauteur'] 50 AND $document['largeur'] 51 AND $document['distant']!='oui') 52 return false; 53 54 // Donnees sur le type de document 55 $extension = $document['extension']; 56 $type_inclus = sql_getfetsel('inclus','spip_types_documents', "extension=".sql_quote($extension)); 57 58 if (($type_inclus == "embed" OR $type_inclus == "image") 59 AND ( 60 // documents dont la taille est definie 61 ($document['largeur'] * $document['hauteur']) 62 // ou distants 63 OR $document['distant'] == 'oui' 64 // ou tous les formats qui s'affichent en embed 65 OR $type_inclus == "embed" 66 )) 67 return true; 68 } 16 69 17 70 // On ne peut joindre un document qu'a un article qu'on a le droit d'editer … … 30 83 } 31 84 32 // On ne peut modifier un document que s'il est lie a un objet qu'on a le droit 33 // d'editer *et* qu'il n'est pas lie a un objet qu'on n'a pas le droit d'editer 34 // http://doc.spip.org/@autoriser_document_modifier_dist 35 function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){ 85 86 /** 87 * On ne peut modifier un document que s'il n'est pas lie a un objet qu'on n'a pas le droit d'editer 88 * 89 * @staticvar <type> $m 90 * @param <type> $faire 91 * @param <type> $type 92 * @param <type> $id 93 * @param <type> $qui 94 * @param <type> $opt 95 * @return <type> 96 */ 97 function autoriser_document_modifier($faire, $type, $id, $qui, $opt){ 36 98 static $m = array(); 37 99 100 // les admins ont le droit de modifier tous les documents 38 101 if ($qui['statut'] == '0minirezo' 39 102 AND !$qui['restreint']) … … 41 104 42 105 if (!isset($m[$id])) { 43 $vu = false; 106 // un document non publie peut etre modifie par tout le monde (... ?) 107 if ($s = sql_getfetsel("statut", "spip_documents", "id_document=".intval($id)) 108 AND $s!=='publie') 109 $m[$id] = true; 110 } 111 112 if (!isset($m[$id])) { 44 113 $interdit = false; 45 114 46 115 $s = sql_select("id_objet,objet", "spip_documents_liens", "id_document=".sql_quote($id)); 47 116 while ($t = sql_fetch($s)) { 48 if (autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) { 49 $vu = true; 50 } 51 else { 117 if (!autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) { 52 118 $interdit = true; 53 119 break; 54 120 } 55 121 } 56 $m[$id] = ($vu && !$interdit); 122 123 $m[$id] = ($interdit?false:true); 57 124 } 58 125 … … 61 128 62 129 63 // On ne peut supprimer un document que s'il n'est lie a aucun objet 64 // c'est autorise pour tout auteur ayant acces a ecrire 65 // http://doc.spip.org/@autoriser_document_modifier_dist 66 function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt){ 130 /** 131 * On ne peut supprimer un document que s'il n'est lie a aucun objet 132 * ET qu'on a le droit de le modifier ! 133 * 134 * @param <type> $faire 135 * @param <type> $type 136 * @param <type> $id 137 * @param <type> $qui 138 * @param <type> $opt 139 * @return <type> 140 */ 141 function autoriser_document_supprimer($faire, $type, $id, $qui, $opt){ 67 142 if (!intval($id) 68 143 OR !$qui['id_auteur'] … … 72 147 return false; 73 148 74 return true;149 return autoriser('modifier','document',$id,$qui,$opt); 75 150 } 76 151 … … 118 193 return true; 119 194 } 195 196 /** 197 * Autoriser a nettoyer les orphelins de la base des documents 198 * reserve aux admins complets 199 * 200 * @param $faire 201 * @param $type 202 * @param $id 203 * @param $qui 204 * @param $opt 205 * @return bool 206 */ 207 function autoriser_orphelins_supprimer($faire, $type, $id, $qui, $opt){ 208 if ($qui['statut'] == '0minirezo' 209 AND !$qui['restreint']) 210 return true; 211 } -
_core_/plugins/medias/medias_fonctions.php
r43738 r43743 18 18 if (!defined('_ECRIRE_INC_VERSION')) return; 19 19 20 21 /** 22 * Afficher la puce de statut pour les documents 23 * 24 * @param unknown_type $id_document 25 * @param unknown_type $statut 26 * @param unknown_type $id_rubrique 27 * @param unknown_type $type 28 * @param unknown_type $ajax 29 * @return unknown 30 */ 31 function medias_puce_statut_document($id_document, $statut){ 32 if ($statut=='publie') { 33 $puce='puce-verte.gif'; 34 } 35 else if ($statut == "prepa") { 36 $puce = 'puce-blanche.gif'; 37 } 38 else if ($statut == "poubelle") { 39 $puce = 'puce-poubelle.gif'; 40 } 41 else 42 $puce = 'puce-blanche.gif'; 43 44 return http_img_pack($puce, $statut, "class='puce'"); 45 } 46 20 47 // 21 48 // <BOUCLE(DOCUMENTS)> 22 49 // 23 50 // http://doc.spip.org/@boucle_DOCUMENTS_dist 24 function boucle_DOCUMENTS _dist($id_boucle, &$boucles) {51 function boucle_DOCUMENTS($id_boucle, &$boucles) { 25 52 $boucle = &$boucles[$id_boucle]; 26 53 $id_table = $boucle->id_table; … … 42 69 // ces complications (et tant pis si la boucle n'a pas prevu de 43 70 // verification du statut de l'article) 44 if ( (!isset($boucle->modificateur['tout']) OR !$boucle->modificateur['tout'])45 AND (!isset($boucle->modificateur['criteres']['id_objet']) OR !$boucle->modificateur['criteres']['id_objet'])71 if (!isset($boucle->modificateur['tout']) 72 AND !isset($boucle->modificateur['criteres']['statut']) 46 73 ) { 47 # Espace avant LEFT JOIN indispensable pour insertion de AS 48 # a refaire plus proprement 49 50 ## la boucle par defaut ignore les documents de forum 51 $boucle->from[$id_table] = "spip_documents LEFT JOIN spip_documents_liens AS l 52 ON $id_table.id_document=l.id_document 53 LEFT JOIN spip_articles AS aa 54 ON (l.id_objet=aa.id_article AND l.objet=\'article\') 55 LEFT JOIN spip_breves AS bb 56 ON (l.id_objet=bb.id_breve AND l.objet=\'breve\') 57 LEFT JOIN spip_rubriques AS rr 58 ON (l.id_objet=rr.id_rubrique AND l.objet=\'rubrique\')" 59 // test conditionne par la presence du plugin forum, en attendant le champ statut sur la table documents 60 . (test_plugin_actif('forum')?" LEFT JOIN spip_forum AS ff ON (l.id_objet=ff.id_forum AND l.objet=\'forum\')":""); 61 62 $boucle->group[] = "$id_table.id_document"; 63 64 if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW) { 65 array_unshift($boucle->where,"'(aa.statut IN (\'publie\',\'prop\') OR bb.statut IN (\'publie\',\'prop\') OR rr.statut IN (\'publie\',\'prive\')" 66 .(test_plugin_actif('forum')? " OR ff.statut IN (\'publie\',\'prop\')":"") 67 .")'"); 74 if ($GLOBALS['var_preview']) { 75 array_unshift($boucle->where,"'($id_table.statut IN (\"publie\",\"prop\",\"prepa\"))'"); 68 76 } else { 69 $postdates = ($GLOBALS['meta']['post_dates'] == 'non') 70 ? ' AND \'.quete_condition_postdates(\'aa.date\').\'' 71 : ''; 72 array_unshift($boucle->where,"'((aa.statut = \'publie\'$postdates) OR bb.statut = \'publie\' OR rr.statut = \'publie\'" 73 .(test_plugin_actif('forum')? " OR ff.statut=\'publie\'":"") 74 .")'"); 77 if ($GLOBALS['meta']["post_dates"] == 'non') 78 array_unshift($boucle->where,array("'<'", "'$id_table" . ".date_publication'", "sql_quote(quete_date_postdates())")); 79 array_unshift($boucle->where,"'(($id_table.statut = \"publie\"))'"); 75 80 } 76 81 } 77 78 82 79 83 return calculer_boucle($id_boucle, $boucles); 80 84 } 81 85 86 87 function lien_objet($id,$type,$longueur=80,$connect=NULL){ 88 include_spip('inc/liens'); 89 $titre = traiter_raccourci_titre($id, $type, $connect); 90 $titre = typo($titre['titre']); 91 if (!strlen($titre)) 92 $titre = _T('info_sans_titre'); 93 $url = generer_url_entite($id,$type); 94 return "<a href='$url' class='$type'>".couper($titre,$longueur)."</a>"; 95 } 96 97 function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) { 98 99 $boucle = &$boucles[$idb]; 100 $quoi = '@$Pile[0]["orphelins"]'; 101 $cond = $crit->cond; 102 $not = $crit->not?"":"NOT"; 103 104 $select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo"); 105 $where = "'".$boucle->id_table.".id_document $not IN ($select)'"; 106 if ($cond) 107 $where = "($quoi)?$where:''"; 108 109 $boucle->where[]= $where; 110 } 111 82 112 ?> -
_core_/plugins/medias/medias_pipelines.php
r43738 r43743 48 48 return $config; 49 49 } 50 51 52 function medias_post_edition($flux){ 53 // si on ajoute un document, mettre son statut a jour 54 if($flux['args']['operation']=='ajouter_document'){ 55 include_spip('action/editer_document'); 56 // mettre a jour le statut si necessaire 57 instituer_document($flux['args']['id_objet']); 58 } 59 // si on institue un objet, mettre ses documents lies a jour 60 elseif($flux['args']['operation']=='instituer' OR isset($flux['data']['statut'])){ 61 if ($flux['args']['table']!=='spip_documents'){ 62 // verifier d'abord les doublons ! 63 $marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc'); 64 $marquer_doublons_doc($flux['data'],$flux['args']['id_objet'],$flux['args']['type'],id_table_objet($flux['args']['type'], $flux['args']['serveur']),$flux['args']['table_objet'],$flux['args']['spip_table_objet'], '', $flux['args']['serveur']); 65 include_spip('base/abstract_sql'); 66 $type = objet_type($flux['args']['table']); 67 $id = $flux['args']['id_objet']; 68 $docs = array_map('reset',sql_allfetsel('id_document','spip_documents_liens','id_objet='.intval($id).' AND objet='.sql_quote($type))); 69 include_spip('action/editer_document'); 70 foreach($docs as $id_document) 71 // mettre a jour le statut si necessaire 72 instituer_document($id_document); 73 } 74 } 75 else { 76 if ($flux['args']['table']!=='spip_documents'){ 77 // verifier les doublons ! 78 $marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc'); 79 $marquer_doublons_doc($flux['data'],$flux['args']['id_objet'],$flux['args']['type'],id_table_objet($flux['args']['type'], $flux['args']['serveur']),$flux['args']['table_objet'],$flux['args']['spip_table_objet'], '', $flux['args']['serveur']); 80 } 81 } 82 return $flux; 83 } 84 85 // liste des exec avec la colonne document 86 $GLOBALS['medias_exec_colonne_document'][] = 'articles_edit'; 87 $GLOBALS['medias_exec_colonne_document'][] = 'breves_edit'; 88 $GLOBALS['medias_exec_colonne_document'][] = 'rubriques_edit'; 89 90 function medias_affiche_gauche($flux){ 91 if (in_array($flux['args']['exec'],$GLOBALS['medias_exec_colonne_document']) 92 AND $table = preg_replace(",_edit$,","",$flux['args']['exec']) 93 AND $type = objet_type($table) 94 AND $id_table_objet = id_table_objet($type) 95 AND ($id = intval($flux['args'][$id_table_objet]) OR $id = 0-$GLOBALS['visiteur_session']['id_auteur']) 96 AND (autoriser('joindredocument',$type,$id))){ 97 $flux['data'] .= recuperer_fond('prive/editer/colonne_document',array('objet'=>$type,'id_objet'=>$id)); 98 } 99 100 return $flux; 101 } 102 103 function medias_objets_extensibles($objets){ 104 return array_merge($objets, array('document' => _T('medias:objet_documents'))); 105 } 106 107 function medias_document_desc_actions($flux){ 108 return $flux; 109 } 110 111 function medias_editer_document_actions($flux){ 112 return $flux; 113 } -
_core_/plugins/medias/plugin.xml
r43738 r43743 1 1 <plugin> 2 2 <nom>Medias</nom> 3 <auteur>Collectif SPIP</auteur> 4 <version>0.1.0</version> 5 <version_base>0.1.0</version_base> 3 <auteur>Collectif SPIP, Cedric Morin & Romy Duhem-Verdiere pour la mediatheque</auteur> 4 <icon>img_pack/portfolio-64.png</icon> 5 <version>1.6.0</version> 6 <version_base>0.10.0</version_base> 6 7 <etat>dev</etat> 7 8 <description>Gestion des medias de SPIP</description> … … 25 26 <inclure>medias_pipelines.php</inclure> 26 27 </pipeline> 28 <pipeline> 29 <nom>post_edition</nom> 30 <inclure>medias_pipelines.php</inclure> 31 </pipeline> 32 <pipeline> 33 <nom>affiche_gauche</nom> 34 <inclure>medias_pipelines.php</inclure> 35 </pipeline> 36 <pipeline> 37 <nom>header_prive</nom> 38 <action>modalbox_insert_head</action> 39 <inclure>modalbox/modalbox_pipelines.php</inclure> 40 </pipeline> 27 41 28 42 <pipeline> … … 30 44 <inclure>medias_autoriser.php</inclure> 31 45 </pipeline> 46 <pipeline> 47 <nom>objets_extensibles</nom> 48 <inclure>medias_pipelines.php</inclure> 49 </pipeline> 50 <pipeline><nom>document_desc_actions</nom><action></action></pipeline> 51 <pipeline><nom>editer_document_actions</nom><action></action></pipeline> 52 53 <bouton id='documents' parent='bando_edition'> 54 <titre>medias:documents</titre> 55 <icone>images/portfolio-16.png</icone> 56 <url>portfolio</url> 57 </bouton> 58 59 <chemin dir="" /> 60 <chemin dir="squelettes" /> 32 61 <necessite id="SPIP" version="[2.3.0-dev;]" /> 62 <utilise id="Z" version="[1.2.1;]" /> 63 <utilise id="mediabox" version="[0.5.0;]" /> 33 64 <categorie>multimedia</categorie> 34 65 </plugin> -
_core_/plugins/medias/prive/inc-ajouter-documents.html
r43455 r43743 1 1 [(#ENV{ajouter}|=={oui}|oui) 2 2 <div class='nettoyeur'></div> 3 <a href='[(#SELF|parametre_url{ajouter,non})]' class='ajax bouton_fermer'>[(#CHEMIN{img_pack/frame-close.png}| tag_img)]</a>3 <a href='[(#SELF|parametre_url{ajouter,non})]' class='ajax bouton_fermer'>[(#CHEMIN{img_pack/frame-close.png}|balise_img)]</a> 4 4 #FORMULAIRE_JOINDRE_DOCUMENT{new,#ENV{id_objet,0},#ENV{objet,''}} 5 5 <div class='nettoyeur'></div> -
_core_/plugins/medias/prive/inc-galerie.html
r43458 r43743 5 5 <div class='onglets_simple'> 6 6 <ul class='medias'> 7 [<li>(#GET{self}|parametre_url{media,''}| aoustrong{<:medias:tous_les_medias:>,#ENV{media,''}|=={''},ajax})</li>]7 [<li>(#GET{self}|parametre_url{media,''}|lien_ou_expose{<:medias:tous_les_medias:>,#ENV{media,''}|=={''},ajax})</li>] 8 8 <BOUCLE_medias(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}{id_document ?}{recherche ?}{statut==.*}{compteur types_documents, media}{media IN image,audio,video,file}> 9 [<li class='#MEDIA'>(#GET{self}|parametre_url{media,#MEDIA}| aoustrong{#VAL{medias:media_}|concat{#MEDIA}|_T|concat{' (',#COMPTEUR{types_documents},')'},#ENV{media}|=={#MEDIA},ajax})</li>]9 [<li class='#MEDIA'>(#GET{self}|parametre_url{media,#MEDIA}|lien_ou_expose{#VAL{medias:media_}|concat{#MEDIA}|_T|concat{' (',#COMPTEUR{types_documents},')'},#ENV{media}|=={#MEDIA},ajax})</li>] 10 10 </BOUCLE_medias> 11 11 </ul> … … 14 14 15 15 [(#ENV{id_document}|oui) 16 <a class='annule_filtre' href='[(#GET{self}|parametre_url{id_document,''})]' title="<:medias:tout_voir|attribut_html:>">[(#CHEMIN{images/annuler-recherche.png}| tag_img|inserer_attribut{alt,<:medias:tout_voir:>})]</a>16 <a class='annule_filtre' href='[(#GET{self}|parametre_url{id_document,''})]' title="<:medias:tout_voir|attribut_html:>">[(#CHEMIN{images/annuler-recherche.png}|balise_img|inserer_attribut{alt,<:medias:tout_voir:>})]</a> 17 17 ] 18 18 19 19 <div class='onglets_simple second'> 20 20 <ul class='statut'> 21 [<li class='first'>(#GET{self}|parametre_url{statut,''}| aoustrong{<:medias:documents_tous:>,#ENV{statut,.*}|=={.*},ajax})</li>]22 [<li>(#GET{self}|parametre_url{statut,publie}| aoustrong{<:medias:documents_publies:>,#ENV{statut}|=={publie},ajax})</li>]23 [<li>(#GET{self}|parametre_url{statut,prepa|poubelle}| aoustrong{<:medias:documents_non_publies:>,#ENV{statut}|=={prepa|poubelle},ajax})</li>]21 [<li class='first'>(#GET{self}|parametre_url{statut,''}|lien_ou_expose{<:medias:documents_tous:>,#ENV{statut,.*}|=={.*},ajax})</li>] 22 [<li>(#GET{self}|parametre_url{statut,publie}|lien_ou_expose{<:medias:documents_publies:>,#ENV{statut}|=={publie},ajax})</li>] 23 [<li>(#GET{self}|parametre_url{statut,prepa|poubelle}|lien_ou_expose{<:medias:documents_non_publies:>,#ENV{statut}|=={prepa|poubelle},ajax})</li>] 24 24 </ul> 25 25 26 26 <ul class='distant'> 27 [<li class='first'>(#GET{self}|parametre_url{distant,''}| aoustrong{<:medias:documents_tous:>,#ENV{distant,''}|=={''},ajax})</li>]28 [<li>(#GET{self}|parametre_url{distant,'oui'}| aoustrong{<:medias:documents_distants:>,#ENV{distant,''}|=={'oui'},ajax})</li>]29 [<li>(#GET{self}|parametre_url{distant,'non'}| aoustrong{<:medias:documents_locaux:>,#ENV{distant,''}|=={'non'},ajax})</li>]27 [<li class='first'>(#GET{self}|parametre_url{distant,''}|lien_ou_expose{<:medias:documents_tous:>,#ENV{distant,''}|=={''},ajax})</li>] 28 [<li>(#GET{self}|parametre_url{distant,'oui'}|lien_ou_expose{<:medias:documents_distants:>,#ENV{distant,''}|=={'oui'},ajax})</li>] 29 [<li>(#GET{self}|parametre_url{distant,'non'}|lien_ou_expose{<:medias:documents_locaux:>,#ENV{distant,''}|=={'non'},ajax})</li>] 30 30 </ul> 31 31 32 32 <ul class='brises'> 33 [<li class='first'>(#GET{self}|parametre_url{brise|orphelins,''}| aoustrong{<:medias:documents_tous:>,#ENV{brise,0}|non|et{#ENV{orphelins,0}|non},ajax})</li>]34 [<li>(#GET{self}|parametre_url{brise,''}|parametre_url{orphelins,1}| aoustrong{<:medias:documents_orphelins:>,#ENV{orphelins,0}|=={1},ajax})</li>]35 [<li>(#GET{self}|parametre_url{brise,1}|parametre_url{orphelins,''}| aoustrong{<:medias:documents_brises:>,#ENV{brise,0}|=={1},ajax})</li>]33 [<li class='first'>(#GET{self}|parametre_url{brise|orphelins,''}|lien_ou_expose{<:medias:documents_tous:>,#ENV{brise,0}|non|et{#ENV{orphelins,0}|non},ajax})</li>] 34 [<li>(#GET{self}|parametre_url{brise,''}|parametre_url{orphelins,1}|lien_ou_expose{<:medias:documents_orphelins:>,#ENV{orphelins,0}|=={1},ajax})</li>] 35 [<li>(#GET{self}|parametre_url{brise,1}|parametre_url{orphelins,''}|lien_ou_expose{<:medias:documents_brises:>,#ENV{brise,0}|=={1},ajax})</li>] 36 36 </ul> 37 37 38 38 <ul class='sanstitre'> 39 [<li class='first'>(#GET{self}|parametre_url{sanstitre,''}| aoustrong{<:medias:documents_tous:>,#ENV{sanstitre,''}|=={''},ajax})</li>]40 [<li>(#GET{self}|parametre_url{sanstitre,'1'}| aoustrong{<:info_sans_titre:>,#ENV{sanstitre,''}|=={'1'},ajax})</li>]39 [<li class='first'>(#GET{self}|parametre_url{sanstitre,''}|lien_ou_expose{<:medias:documents_tous:>,#ENV{sanstitre,''}|=={''},ajax})</li>] 40 [<li>(#GET{self}|parametre_url{sanstitre,'1'}|lien_ou_expose{<:info_sans_titre:>,#ENV{sanstitre,''}|=={'1'},ajax})</li>] 41 41 </ul> 42 42 <div class='nettoyeur'></div> … … 46 46 <div class='actions'> 47 47 [(#ENV{brise,0}|oui) 48 [(#URL_ACTION_AUTEUR{verifier_documents_brises,'1',#GET{self}}| aoustrong{<:medias:verifier_documents_brises:>,0,ajax})]48 [(#URL_ACTION_AUTEUR{verifier_documents_brises,'1',#GET{self}}|lien_ou_expose{<:medias:verifier_documents_brises:>,0,ajax})] 49 49 ] 50 50 [ … … 57 57 <BOUCLE_types(TYPES_DOCUMENTS){media=#ENV{media,''}}> 58 58 <BOUCLE_compte(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}{id_document ?}{recherche ?}{statut==.*}{extension} /> 59 [(#TOTAL_BOUCLE|oui)[<li>(#GET{self}|parametre_url{extension,#EXTENSION}| aoustrong{#TITRE|concat{' (',#TOTAL_BOUCLE,')'},#ENV{extension}|=={#EXTENSION},ajax})<span> | </span></li>]]59 [(#TOTAL_BOUCLE|oui)[<li>(#GET{self}|parametre_url{extension,#EXTENSION}|lien_ou_expose{#TITRE|concat{' (',#TOTAL_BOUCLE,')'},#ENV{extension}|=={#EXTENSION},ajax})<span> | </span></li>]] 60 60 <//B_compte> 61 61 </BOUCLE_types> … … 66 66 <B_galerie> 67 67 68 <h2>[(#GRAND_TOTAL| affiche_un_ou_plusieurs{#VAL{medias:un_}|concat{#ENV{media,document}},#VAL{medias:des_}|concat{#ENV{media,document},s}})]</h2>68 <h2>[(#GRAND_TOTAL|singulier_ou_pluriel{#VAL{medias:un_}|concat{#ENV{media,document}},#VAL{medias:des_}|concat{#ENV{media,document},s}})]</h2> 69 69 <div class='pagination tri'> 70 [(#TRI{'<',#CHEMIN{img_pack/tri_asc-16.png}| tag_img{<:medias:par_tri_croissant:>}}) |]71 [(#TRI{'>',#CHEMIN{img_pack/tri_desc-16.png}| tag_img{<:medias:par_tri_decroissant:>}}) |]70 [(#TRI{'<',#CHEMIN{img_pack/tri_asc-16.png}|balise_img{<:medias:par_tri_croissant:>}}) |] 71 [(#TRI{'>',#CHEMIN{img_pack/tri_desc-16.png}|balise_img{<:medias:par_tri_decroissant:>}}) |] 72 72 [(#TRI{id_document,<:medias:par_id:>}) |] 73 73 [(#TRI{date,<:medias:par_date:>}) |] … … 92 92 <td class='infos'> 93 93 [(#DISTANT|=={oui}|non)#SET{missing,#FICHIER|file_exists|non}] 94 [(#ENV{media}|non|et{#MEDIA|!={file}})[(#CHEMIN{images/media-#MEDIA|concat{-32.png}}| tag_img|inserer_attribut{alt,#VAL{medias:media_#MEDIA}|_T}|inserer_attribut{title,#VAL{medias:media_#MEDIA}|_T})]]94 [(#ENV{media}|non|et{#MEDIA|!={file}})[(#CHEMIN{images/media-#MEDIA|concat{-32.png}}|balise_img|inserer_attribut{alt,#VAL{medias:media_#MEDIA}|_T}|inserer_attribut{title,#VAL{medias:media_#MEDIA}|_T})]] 95 95 [(#GET{missing}|oui)<img src='#CHEMIN{images/document-manquant-24.png}' width='22' height='22' alt='<:medias:fichier_manquant:>' />] 96 96 [(#DISTANT|=={oui}|oui)<img src='#CHEMIN{images/document-distant-24.png}' width='22' height='22' alt='<:medias:fichier_distant:>' />] … … 120 120 <B_liens> 121 121 [(#TOTAL_BOUCLE|>{1}|oui) 122 <a href='#' onclick="jQuery(this).next().show();$(this).hide();return false;">[(#TOTAL_BOUCLE| affiche_un_ou_plusieurs{medias:une_utilisation,medias:des_utilisations})]</a><div style='display: none;'>122 <a href='#' onclick="jQuery(this).next().show();$(this).hide();return false;">[(#TOTAL_BOUCLE|singulier_ou_pluriel{medias:une_utilisation,medias:des_utilisations})]</a><div style='display: none;'> 123 123 ] 124 124 <BOUCLE_liens(documents_liens){id_document}{'<br />'}> -
_core_/plugins/medias/prive/navigation/documents_edit.html
r43455 r43743 1 1 <div class='document_utilisations'> 2 2 <B_liens> 3 <h3>[(#TOTAL_BOUCLE| affiche_un_ou_plusieurs{medias:une_utilisation,medias:des_utilisations})]</h3>3 <h3>[(#TOTAL_BOUCLE|singulier_ou_pluriel{medias:une_utilisation,medias:des_utilisations})]</h3> 4 4 <ul class='liste_items'> 5 5 <BOUCLE_liens(documents_liens){id_document}> 6 <li class='item #OBJET'>[(#CHEMIN{images/#OBJET|concat{-12.png}}| tag_img) ][(#ID_OBJET|lien_objet{#OBJET})]6 <li class='item #OBJET'>[(#CHEMIN{images/#OBJET|concat{-12.png}}|balise_img) ][(#ID_OBJET|lien_objet{#OBJET})] 7 7 [(#VU|=={oui}|oui) 8 [<span class='vu'>(#CHEMIN{images/document-vu-24.png}| tag_img|inserer_attribut{title,<:medias:document_vu:>}|inserer_attribut{alt,<:medias:document_vu:>})</span>]8 [<span class='vu'>(#CHEMIN{images/document-vu-24.png}|balise_img|inserer_attribut{title,<:medias:document_vu:>}|inserer_attribut{alt,<:medias:document_vu:>})</span>] 9 9 ] 10 10 </li>
Note: See TracChangeset
for help on using the changeset viewer.