source: spip-zone/_core_/plugins/medias/base/medias.php @ 45408

Last change on this file since 45408 was 45408, checked in by cedric@…, 10 years ago
  • la table des documents est principale (repare l'autoincrement manquant a la creation)
  • la meta de configuration a change de nom, prendre en compte la nouvelle dans l'affichage du formulaire d'ajout de document
File size: 12.6 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13
14/**
15 * Interfaces des tables breves pour le compilateur
16 *
17 * @param array $interfaces
18 * @return array
19 */
20function medias_declarer_tables_interfaces($interfaces) {
21        $interfaces['table_des_tables']['documents']='documents';
22        $interfaces['table_des_tables']['types_documents']='types_documents';
23
24        $interfaces['exceptions_des_tables']['documents']['type_document']=array('types_documents'
25        , 'titre');
26        $interfaces['exceptions_des_tables']['documents']['extension_document']=array('types_documents', 'extension');
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       
30        $interfaces['table_date']['types_documents']='date';
31
32        $interfaces['table_des_traitements']['FICHIER']['documents']= 'get_spip_doc(%s)';
33
34        return $interfaces;
35}
36
37
38/**
39 * Table principale spip_documents et spip_types_documents
40 *
41 * @param array $tables_principales
42 * @return array
43 */
44function medias_declarer_tables_principales($tables_principales) {
45
46        $spip_types_documents = array(
47                        "extension"     => "varchar(10) DEFAULT '' NOT NULL",
48                        "titre" => "text DEFAULT '' NOT NULL",
49                        "descriptif"    => "text DEFAULT '' NOT NULL",
50                        "mime_type"     => "varchar(100) DEFAULT '' NOT NULL",
51                        "inclus"        => "ENUM('non', 'image', 'embed') DEFAULT 'non'  NOT NULL",
52                        "upload"        => "ENUM('oui', 'non') DEFAULT 'oui'  NOT NULL",
53                        "media" => "varchar(10) DEFAULT 'file' NOT NULL",
54                        "maj"   => "TIMESTAMP");
55
56        $spip_types_documents_key = array(
57                        "PRIMARY KEY"   => "extension",
58                        "KEY inclus"    => "inclus");
59
60        $tables_principales['spip_types_documents']     =
61                array('field' => &$spip_types_documents, 'key' => &$spip_types_documents_key);
62
63        return $tables_principales;
64}
65
66/**
67 * Table des liens documents-objets spip_documents_liens
68 * @param  $tables_auxiliaires
69 * @return
70 */
71function medias_declarer_tables_auxiliaires($tables_auxiliaires) {
72
73        $spip_documents_liens = array(
74                        "id_document"   => "bigint(21) DEFAULT '0' NOT NULL",
75                        "id_objet"      => "bigint(21) DEFAULT '0' NOT NULL",
76                        "objet" => "VARCHAR (25) DEFAULT '' NOT NULL",
77                        "vu"    => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL");
78
79        $spip_documents_liens_key = array(
80                        "PRIMARY KEY"           => "id_document,id_objet,objet",
81                        "KEY id_document"       => "id_document");
82
83        $tables_auxiliaires['spip_documents_liens'] = array(
84                'field' => &$spip_documents_liens,
85                'key' => &$spip_documents_liens_key);
86
87        return $tables_auxiliaires;
88}
89
90/**
91 * Declarer le surnom des breves
92 *
93 * @param array $surnoms
94 * @return array
95 */
96function medias_declarer_tables_objets_surnoms($surnoms) {
97        $surnoms['type_document'] = "types_documents"; # hum
98        $surnoms['extension'] = "types_documents"; # hum
99        #$surnoms['type'] = "types_documents"; # a ajouter pour id_table_objet('type')=='extension' ?
100        return $surnoms;
101}
102
103function medias_declarer_tables_objets_sql($tables){
104        $tables['spip_documents'] = array(
105                'table_objet_surnoms'=>array('doc','img','emb'),
106          'type_surnoms' => array(),
107                'url_voir' => 'document_edit',
108                'url_edit' => 'document_edit',
109                'page'=>'',
110                'texte_retour' => 'icone_retour',
111                'texte_objets' => 'medias:objet_documents',
112                'texte_objet' => 'medias:objet_document',
113                'texte_modifier' => 'medias:info_modifier_document',
114                'info_aucun_objet'=> 'medias:aucun_document',
115                'info_1_objet' => 'medias:un_document',
116                'info_nb_objets' => 'medias:des_documents',
117                'titre' => "CASE WHEN length(titre)>0 THEN titre ELSE fichier END as titre, '' AS lang",
118                'date' => 'date',
119                'principale'=>'oui',
120                'field' => array(
121                        "id_document"   => "bigint(21) NOT NULL",
122                        "id_vignette"   => "bigint(21) DEFAULT '0' NOT NULL",
123                        "extension"     => "VARCHAR(10) DEFAULT '' NOT NULL",
124                        "titre" => "text DEFAULT '' NOT NULL",
125                        "date"  => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
126                        "descriptif"    => "text DEFAULT '' NOT NULL",
127                        "fichier"       => "text NOT NULL DEFAULT ''",
128                        "taille"        => "integer",
129                        "largeur"       => "integer",
130                        "hauteur"       => "integer",
131                        "mode"  => "varchar(10) DEFAULT 'document' NOT NULL",
132                        "distant"       => "VARCHAR(3) DEFAULT 'non'",
133                        "statut" => "varchar(10) DEFAULT '0' NOT NULL",
134                        "credits" => "varchar(255) DEFAULT '' NOT NULL",
135                        "date_publication" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
136                        "brise" => "tinyint DEFAULT 0",
137                        "maj"   => "TIMESTAMP"
138                ),
139                'key' => array(
140                        "PRIMARY KEY"   => "id_document",
141                        "KEY id_vignette"       => "id_vignette",
142                        "KEY mode"      => "mode",
143                        "KEY extension" => "extension"
144                ),
145                'join' => array(
146                        "id_document"=>"id_document",
147                        "extension"=>"extension"
148                ),
149                'tables_jointures' => array('types_documents'),
150                'rechercher_champs' => array(
151                        'titre' => 3, 'descriptif' => 1, 'fichier' => 1
152                ),
153                'champs_versionnes' => array('id_vignette', 'titre', 'descriptif', 'hauteur', 'largeur', 'mode','distant'),
154        );
155
156        // jointures sur les forum pour tous les objets
157        $tables[]['tables_jointures'][]= 'documents_liens';
158
159        // recherche jointe sur les documents pour les articles et rubriques
160        $tables['spip_articles']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
161        $tables['spip_rubriques']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
162        return $tables;
163}
164
165
166/**
167 * Creer la table des types de document
168 *
169 * http://doc.spip.org/@creer_base_types_doc
170 *
171 * @param string $serveur
172 * @return void
173 */
174function creer_base_types_doc($serveur='') {
175        global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
176        include_spip('base/typedoc');
177        include_spip('base/abstract_sql');
178
179        foreach ($tables_mime as $extension => $type_mime) {
180                if (isset($tables_images[$extension])) {
181                        $titre = $tables_images[$extension];
182                        $inclus='image';
183                }
184                else if (isset($tables_sequences[$extension])) {
185                        $titre = $tables_sequences[$extension];
186                        $inclus='embed';
187                }
188                else {
189                        $inclus='non';
190                        if (isset($tables_documents[$extension]))
191                                $titre = $tables_documents[$extension];
192                        else
193                                $titre = '';
194                }
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         
205                // Init ou Re-init ==> replace pas insert
206                sql_replace('spip_types_documents',
207                        array('mime_type' => $type_mime,
208                                'titre' => $titre,
209                                'inclus' => $inclus,
210                                'extension' => $extension,
211                                'media' => $media,
212                                'upload' => 'oui'
213                        ),
214                        '', $serveur);
215        }
216}
217
218
219function medias_check_statuts($affiche = false){
220        $trouver_table = charger_fonction('trouver_table','base');
221        $desc = $trouver_table('documents');
222        # securite, si jamais on arrive ici avant un upgrade de base
223        if (!isset($desc['field']['statut']))
224                return;
225
226        // utiliser sql_allfetsel pour clore la requete avant la mise a jour en base sur chaque doc (sqlite)
227        // iterer par groupe de 100 pour ne pas exploser sur les grosses bases
228        $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100"));
229        while (count($docs)){
230                include_spip('action/editer_document');
231                foreach($docs as $id_document)
232                        // mettre a jour le statut si necessaire
233                        instituer_document($id_document);
234                if ($affiche) echo " .";
235          $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100"));
236        }
237}
238
239function medias_upgrade($nom_meta_base_version,$version_cible){
240        $current_version = 0.0;
241        if (   (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
242                        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
243                if (spip_version_compare($current_version,'0.1.0','<')){
244                        include_spip('base/create');
245                        maj_tables(array('spip_documents','spip_documents_liens','spip_types_documents'));
246                        creer_base_types_doc();
247                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible,'non');
248                }
249                if (spip_version_compare($current_version,'0.2.0','<')){
250                        include_spip('base/abstract_sql');
251                        sql_alter("TABLE spip_documents ADD statut varchar(10) DEFAULT '0' NOT NULL");
252                        ecrire_meta($nom_meta_base_version,$current_version="0.2",'non');
253                }
254                if (spip_version_compare($current_version,'0.3.0','<')){
255                        include_spip('base/abstract_sql');
256                        // ajouter un champ
257                        sql_alter("TABLE spip_documents ADD date_publication datetime DEFAULT '0000-00-00 00:00:00' NOT NULL");
258                        // vider le cache des descriptions de tables
259                        $trouver_table = charger_fonction('trouver_table','base');
260                        $trouver_table(false);
261                        // ecrire la version pour ne plus passer la
262                        ecrire_meta($nom_meta_base_version,$current_version="0.3.0",'non');
263                }
264                if (spip_version_compare($current_version,'0.4.0','<')){
265                        // recalculer tous les statuts en tenant compte de la date de publi des articles...
266                        echo "Mise a jour des statuts de documents...";
267                        medias_check_statuts(true);
268                        ecrire_meta($nom_meta_base_version,$current_version="0.4.0",'non');
269                }
270                if (spip_version_compare($current_version,'0.5.0','<')){
271                        include_spip('base/abstract_sql');
272                        // ajouter un champ
273                        sql_alter("TABLE spip_documents ADD brise tinyint DEFAULT 0");
274                        // vider le cache des descriptions de tables
275                        $trouver_table = charger_fonction('trouver_table','base');
276                        $trouver_table(false);
277                        ecrire_meta($nom_meta_base_version,$current_version="0.5.0",'non');
278                }
279                if (spip_version_compare($current_version,'0.6.0','<')){
280                        include_spip('base/abstract_sql');
281                        sql_alter("TABLE spip_types_documents ADD media varchar(10) DEFAULT 'file' NOT NULL");
282                        creer_base_types_doc();
283                        ecrire_meta($nom_meta_base_version,$current_version="0.6.0",'non');
284                }
285                if (spip_version_compare($current_version,'0.7.0','<')){
286                        include_spip('base/abstract_sql');
287                        sql_alter("TABLE spip_documents ADD credits varchar(255) DEFAULT '' NOT NULL");
288                        ecrire_meta($nom_meta_base_version,$current_version="0.7.0",'non');
289                }
290                if (spip_version_compare($current_version,'0.10.0','<')){
291                        // Augmentation de la taille du champ fichier pour permettre les URL longues
292                        include_spip('base/abstract_sql');
293                        sql_alter("TABLE spip_documents CHANGE fichier fichier TEXT NOT NULL DEFAULT ''");
294                        ecrire_meta($nom_meta_base_version,$current_version="0.10.0",'non');
295                }
296                if (version_compare($current_version,'0.11.0','<')){
297                        // Passage du mode en varchar
298                        include_spip('base/abstract_sql');
299                        sql_alter("TABLE spip_documents CHANGE mode mode varchar(10) DEFAULT 'document' NOT NULL");
300                        ecrire_meta($nom_meta_base_version,$current_version="0.11.0",'non');
301                }
302                if (version_compare($current_version,'0.12.0','<')){
303                        // generalisation des metas documents_article et documents_rubriques
304                        $config = array();
305                        if (isset($GLOBALS['meta']['documents_article']) AND $GLOBALS['meta']['documents_article']!=='non')
306                                $config[] = 'spip_articles';
307                        if (isset($GLOBALS['meta']['documents_rubrique']) AND $GLOBALS['meta']['documents_rubrique']!=='non')
308                                $config[] = 'spip_rubriques';
309                        ecrire_meta('documents_objets',implode(',',$config));
310                        ecrire_meta($nom_meta_base_version,$current_version="0.12.0",'non');
311                }
312        }
313        medias_check_statuts();
314}
315
316function medias_install($action,$prefix,$version_cible){
317        $version_base = $GLOBALS[$prefix."_base_version"];
318        switch ($action){
319                case 'test':
320                        # plus necessaire si pas de bug :p
321                        # medias_check_statuts();
322                        return (isset($GLOBALS['meta'][$prefix."_base_version"])
323                                AND version_compare($GLOBALS['meta'][$prefix."_base_version"],$version_cible,">="));
324                        break;
325                case 'install':
326                        medias_upgrade('medias_base_version',$version_cible);
327                        break;
328                case 'uninstall':
329                        # pas de deinstallation sur les documents pour le moment, trop dangereux
330                        # medias_vider_tables();
331                        break;
332        }
333}
334
335
336function medias_optimiser_base_disparus($flux){
337        //
338        // Documents
339        //
340
341        include_spip('action/editer_liens');
342        // optimiser les liens de tous les documents vers des objets effaces
343        $flux['data'] += objet_optimiser_liens(array('document'=>'*'),'*');
344        // on ne nettoie volontairement pas automatiquement les documents orphelins
345       
346        return $flux;
347 
348}
349?>
Note: See TracBrowser for help on using the repository browser.