medias.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. /**
  13. * Interfaces des tables breves pour le compilateur
  14. *
  15. * @param array $interfaces
  16. * @return array
  17. */
  18. function medias_declarer_tables_interfaces($interfaces) {
  19. $interfaces['table_des_tables']['documents']='documents';
  20. $interfaces['table_des_tables']['types_documents']='types_documents';
  21. $interfaces['exceptions_des_tables']['documents']['type_document']=array('types_documents', 'titre');
  22. $interfaces['exceptions_des_tables']['documents']['extension_document']=array('types_documents', 'extension');
  23. $interfaces['exceptions_des_tables']['documents']['mime_type']=array('types_documents', 'mime_type');
  24. $interfaces['exceptions_des_tables']['documents']['media_document']=array('types_documents', 'media');
  25. $interfaces['exceptions_des_jointures']['spip_documents']['id_forum']=array('spip_documents_liens','id_forum');
  26. $interfaces['exceptions_des_jointures']['spip_documents']['vu']=array('spip_documents_liens', 'vu');
  27. $interfaces['table_date']['types_documents']='date';
  28. $interfaces['table_des_traitements']['FICHIER']['documents']= 'get_spip_doc(%s)';
  29. return $interfaces;
  30. }
  31. /**
  32. * Table principale spip_documents et spip_types_documents
  33. *
  34. * @param array $tables_principales
  35. * @return array
  36. */
  37. function medias_declarer_tables_principales($tables_principales) {
  38. $spip_types_documents = array(
  39. "extension" => "varchar(10) DEFAULT '' NOT NULL",
  40. "titre" => "text DEFAULT '' NOT NULL",
  41. "descriptif" => "text DEFAULT '' NOT NULL",
  42. "mime_type" => "varchar(100) DEFAULT '' NOT NULL",
  43. "inclus" => "ENUM('non', 'image', 'embed') DEFAULT 'non' NOT NULL",
  44. "upload" => "ENUM('oui', 'non') DEFAULT 'oui' NOT NULL",
  45. "media_defaut" => "varchar(10) DEFAULT 'file' NOT NULL",
  46. "maj" => "TIMESTAMP");
  47. $spip_types_documents_key = array(
  48. "PRIMARY KEY" => "extension",
  49. "KEY inclus" => "inclus");
  50. $tables_principales['spip_types_documents'] =
  51. array('field' => &$spip_types_documents, 'key' => &$spip_types_documents_key);
  52. return $tables_principales;
  53. }
  54. /**
  55. * Table des liens documents-objets spip_documents_liens
  56. * @param array $tables_auxiliaires
  57. * @return array
  58. */
  59. function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
  60. $spip_documents_liens = array(
  61. "id_document" => "bigint(21) DEFAULT '0' NOT NULL",
  62. "id_objet" => "bigint(21) DEFAULT '0' NOT NULL",
  63. "objet" => "VARCHAR (25) DEFAULT '' NOT NULL",
  64. "vu" => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL");
  65. $spip_documents_liens_key = array(
  66. "PRIMARY KEY" => "id_document,id_objet,objet",
  67. "KEY id_document" => "id_document",
  68. "KEY id_objet" => "id_objet",
  69. "KEY objet" => "objet",
  70. );
  71. $tables_auxiliaires['spip_documents_liens'] = array(
  72. 'field' => &$spip_documents_liens,
  73. 'key' => &$spip_documents_liens_key);
  74. return $tables_auxiliaires;
  75. }
  76. /**
  77. * Declarer le surnom des breves
  78. *
  79. * @param array $surnoms
  80. * @return array
  81. */
  82. function medias_declarer_tables_objets_surnoms($surnoms) {
  83. $surnoms['type_document'] = "types_documents"; # hum
  84. #$surnoms['extension'] = "types_documents"; # hum
  85. #$surnoms['type'] = "types_documents"; # a ajouter pour id_table_objet('type')=='extension' ?
  86. return $surnoms;
  87. }
  88. function medias_declarer_tables_objets_sql($tables){
  89. $tables['spip_articles']['champs_versionnes'][] = 'jointure_documents';
  90. $tables['spip_documents'] = array(
  91. 'table_objet_surnoms'=>array('doc','img','emb'),
  92. 'type_surnoms' => array(),
  93. 'url_voir' => 'document_edit',
  94. 'url_edit' => 'document_edit',
  95. 'page'=>'',
  96. 'texte_retour' => 'icone_retour',
  97. 'texte_objets' => 'medias:objet_documents',
  98. 'texte_objet' => 'medias:objet_document',
  99. 'texte_modifier' => 'medias:info_modifier_document',
  100. 'info_aucun_objet'=> 'medias:aucun_document',
  101. 'info_1_objet' => 'medias:un_document',
  102. 'info_nb_objets' => 'medias:des_documents',
  103. 'titre' => "CASE WHEN length(titre)>0 THEN titre ELSE fichier END as titre, '' AS lang",
  104. 'date' => 'date',
  105. 'principale'=>'oui',
  106. 'field' => array(
  107. "id_document" => "bigint(21) NOT NULL",
  108. "id_vignette" => "bigint(21) DEFAULT '0' NOT NULL",
  109. "extension" => "VARCHAR(10) DEFAULT '' NOT NULL",
  110. "titre" => "text DEFAULT '' NOT NULL",
  111. "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
  112. "descriptif" => "text DEFAULT '' NOT NULL",
  113. "fichier" => "text NOT NULL DEFAULT ''",
  114. "taille" => "bigint",
  115. "largeur" => "integer",
  116. "hauteur" => "integer",
  117. "media" => "varchar(10) DEFAULT 'file' NOT NULL",
  118. "mode" => "varchar(10) DEFAULT 'document' NOT NULL",
  119. "distant" => "VARCHAR(3) DEFAULT 'non'",
  120. "statut" => "varchar(10) DEFAULT '0' NOT NULL",
  121. "credits" => "varchar(255) DEFAULT '' NOT NULL",
  122. "date_publication" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
  123. "brise" => "tinyint DEFAULT 0",
  124. "maj" => "TIMESTAMP"
  125. ),
  126. 'key' => array(
  127. "PRIMARY KEY" => "id_document",
  128. "KEY id_vignette" => "id_vignette",
  129. "KEY mode" => "mode",
  130. "KEY extension" => "extension"
  131. ),
  132. 'join' => array(
  133. "id_document"=>"id_document",
  134. "extension"=>"extension"
  135. ),
  136. 'statut'=> array(
  137. array(
  138. 'champ' => 'statut',
  139. 'publie' => 'publie',
  140. 'previsu' => 'publie,prop,prepa',
  141. 'post_date' => 'date_publication',
  142. 'exception' => array('statut','tout')
  143. )
  144. ),
  145. 'tables_jointures' => array('types_documents'),
  146. 'rechercher_champs' => array(
  147. 'titre' => 3, 'descriptif' => 1, 'fichier' => 1, 'credits' => 1,
  148. ),
  149. 'champs_editables' => array('titre', 'descriptif', 'date', 'taille', 'largeur','hauteur','mode','credits','fichier','distant','extension', 'id_vignette', 'media'),
  150. 'champs_versionnes' => array('id_vignette', 'titre', 'descriptif', 'hauteur', 'largeur', 'mode','credits','distant'),
  151. 'modeles' => array('document','doc','img','emb','image','video','text','audio','application'),
  152. );
  153. // jointures sur les forum pour tous les objets
  154. $tables[]['tables_jointures'][]= 'documents_liens';
  155. // recherche jointe sur les documents pour les articles et rubriques
  156. $tables['spip_articles']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
  157. $tables['spip_rubriques']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
  158. return $tables;
  159. }
  160. /**
  161. * Creer la table des types de document
  162. *
  163. * http://code.spip.net/@creer_base_types_doc
  164. *
  165. * @param string $serveur
  166. * @return void
  167. */
  168. function creer_base_types_doc($serveur='', $champ_media="media_defaut") {
  169. global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
  170. include_spip('base/typedoc');
  171. include_spip('base/abstract_sql');
  172. // charger en memoire tous les types deja definis pour limiter les requettes
  173. $rows = sql_allfetsel('mime_type,titre,inclus,extension,'.$champ_media.',upload,descriptif','spip_types_documents','','','','','',$serveur);
  174. $deja = array();
  175. foreach ($rows as $k=>$row){
  176. $deja[$row['extension']] = &$rows[$k];
  177. }
  178. $insertions = array();
  179. $updates = array();
  180. foreach ($tables_mime as $extension => $type_mime) {
  181. if (isset($tables_images[$extension])) {
  182. $titre = $tables_images[$extension];
  183. $inclus='image';
  184. }
  185. else if (isset($tables_sequences[$extension])) {
  186. $titre = $tables_sequences[$extension];
  187. $inclus='embed';
  188. }
  189. else {
  190. $inclus='non';
  191. if (isset($tables_documents[$extension]))
  192. $titre = $tables_documents[$extension];
  193. else
  194. $titre = '';
  195. }
  196. // type de media
  197. $media = "file";
  198. if (preg_match(",^image/,",$type_mime) OR in_array($type_mime,array('application/illustrator')))
  199. $media = "image";
  200. elseif (preg_match(",^audio/,",$type_mime))
  201. $media = "audio";
  202. elseif (preg_match(",^video/,",$type_mime) OR in_array($type_mime,array('application/ogg','application/x-shockwave-flash','application/mp4')))
  203. $media = "video";
  204. $set = array(
  205. 'mime_type' => $type_mime,
  206. 'titre' => $titre,
  207. 'inclus' => $inclus,
  208. 'extension' => $extension,
  209. $champ_media => $media,
  210. 'upload' => 'oui',
  211. 'descriptif' => '',
  212. );
  213. if (!isset($deja[$extension])){
  214. $insertions[] = $set;
  215. }
  216. elseif (array_diff($deja[$extension],$set)){
  217. $updates[$extension] = $set;
  218. }
  219. }
  220. if (count($updates)){
  221. foreach ($updates as $extension=>$set){
  222. sql_updateq('spip_types_documents',$set,'extension='.sql_quote($extension));
  223. }
  224. }
  225. if ($insertions)
  226. sql_insertq_multi('spip_types_documents', $insertions, '', $serveur);
  227. }
  228. /**
  229. * Optimiser la base de donnee en supprimant les liens orphelins
  230. *
  231. * @param int $n
  232. * @return int
  233. */
  234. function medias_optimiser_base_disparus($flux){
  235. include_spip('action/editer_liens');
  236. // optimiser les liens morts :
  237. // entre documents vers des objets effaces
  238. // depuis des documents effaces
  239. $flux['data'] += objet_optimiser_liens(array('document'=>'*'),'*');
  240. // on ne nettoie volontairement pas automatiquement les documents orphelins
  241. return $flux;
  242. }
  243. ?>