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

Last change on this file since 44974 was 44974, checked in by cedric@…, 10 years ago

declarations des tables_objets : generaliser les jointures forum, documents et mots qui peuvent s'appliquer a n'importe quel objet de SPIP

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                'field' => array(
120                        "id_document"   => "bigint(21) NOT NULL",
121                        "id_vignette"   => "bigint(21) DEFAULT '0' NOT NULL",
122                        "extension"     => "VARCHAR(10) DEFAULT '' NOT NULL",
123                        "titre" => "text DEFAULT '' NOT NULL",
124                        "date"  => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
125                        "descriptif"    => "text DEFAULT '' NOT NULL",
126                        "fichier"       => "text NOT NULL DEFAULT ''",
127                        "taille"        => "integer",
128                        "largeur"       => "integer",
129                        "hauteur"       => "integer",
130                        "mode"  => "varchar(10) DEFAULT 'document' NOT NULL",
131                        "distant"       => "VARCHAR(3) DEFAULT 'non'",
132                        "statut" => "varchar(10) DEFAULT '0' NOT NULL",
133                        "credits" => "varchar(255) DEFAULT '' NOT NULL",
134                        "date_publication" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
135                        "brise" => "tinyint DEFAULT 0",
136                        "maj"   => "TIMESTAMP"
137                ),
138                'key' => array(
139                        "PRIMARY KEY"   => "id_document",
140                        "KEY id_vignette"       => "id_vignette",
141                        "KEY mode"      => "mode",
142                        "KEY extension" => "extension"
143                ),
144                'join' => array(
145                        "id_document"=>"id_document",
146                        "extension"=>"extension"
147                ),
148                'tables_jointures' => array('types_documents'),
149                'rechercher_champs' => array(
150                        'titre' => 3, 'descriptif' => 1, 'fichier' => 1
151                ),
152                'champs_versionnes' => array('id_vignette', 'titre', 'descriptif', 'hauteur', 'largeur', 'mode','distant'),
153        );
154
155        // jointures sur les forum pour tous les objets
156        $tables[]['tables_jointures'][]= 'documents_liens';
157
158        // recherche jointe sur les documents pour les articles et rubriques
159        $tables['spip_articles']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
160        $tables['spip_rubriques']['rechercher_jointures']['document'] = array('titre' => 2, 'descriptif' => 1);
161        return $tables;
162}
163
164
165/**
166 * Creer la table des types de document
167 *
168 * http://doc.spip.org/@creer_base_types_doc
169 *
170 * @param string $serveur
171 * @return void
172 */
173function creer_base_types_doc($serveur='') {
174        global $tables_images, $tables_sequences, $tables_documents, $tables_mime;
175        include_spip('base/typedoc');
176        include_spip('base/abstract_sql');
177
178        foreach ($tables_mime as $extension => $type_mime) {
179                if (isset($tables_images[$extension])) {
180                        $titre = $tables_images[$extension];
181                        $inclus='image';
182                }
183                else if (isset($tables_sequences[$extension])) {
184                        $titre = $tables_sequences[$extension];
185                        $inclus='embed';
186                }
187                else {
188                        $inclus='non';
189                        if (isset($tables_documents[$extension]))
190                                $titre = $tables_documents[$extension];
191                        else
192                                $titre = '';
193                }
194
195                // type de media
196          $media = "file";
197          if (preg_match(",^image/,",$type_mime) OR in_array($type_mime,array('application/illustrator')))
198                  $media = "image";
199          elseif (preg_match(",^audio/,",$type_mime))
200                  $media = "audio";
201          elseif (preg_match(",^video/,",$type_mime) OR in_array($type_mime,array('application/ogg','application/x-shockwave-flash','application/mp4')))
202                  $media = "video";
203         
204                // Init ou Re-init ==> replace pas insert
205                sql_replace('spip_types_documents',
206                        array('mime_type' => $type_mime,
207                                'titre' => $titre,
208                                'inclus' => $inclus,
209                                'extension' => $extension,
210                                'media' => $media,
211                                'upload' => 'oui'
212                        ),
213                        '', $serveur);
214        }
215}
216
217
218function medias_check_statuts($affiche = false){
219        $trouver_table = charger_fonction('trouver_table','base');
220        $desc = $trouver_table('documents');
221        # securite, si jamais on arrive ici avant un upgrade de base
222        if (!isset($desc['field']['statut']))
223                return;
224
225        // utiliser sql_allfetsel pour clore la requete avant la mise a jour en base sur chaque doc (sqlite)
226        // iterer par groupe de 100 pour ne pas exploser sur les grosses bases
227        $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100"));
228        while (count($docs)){
229                include_spip('action/editer_document');
230                foreach($docs as $id_document)
231                        // mettre a jour le statut si necessaire
232                        instituer_document($id_document);
233                if ($affiche) echo " .";
234          $docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100"));
235        }
236}
237
238function medias_upgrade($nom_meta_base_version,$version_cible){
239        $current_version = 0.0;
240        if (   (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
241                        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
242                if (spip_version_compare($current_version,'0.1.0','<')){
243                        include_spip('base/create');
244                        maj_tables(array('spip_documents','spip_documents_liens','spip_types_documents'));
245                        creer_base_types_doc();
246                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible,'non');
247                }
248                if (spip_version_compare($current_version,'0.2.0','<')){
249                        include_spip('base/abstract_sql');
250                        sql_alter("TABLE spip_documents ADD statut varchar(10) DEFAULT '0' NOT NULL");
251                        ecrire_meta($nom_meta_base_version,$current_version="0.2",'non');
252                }
253                if (spip_version_compare($current_version,'0.3.0','<')){
254                        include_spip('base/abstract_sql');
255                        // ajouter un champ
256                        sql_alter("TABLE spip_documents ADD date_publication datetime DEFAULT '0000-00-00 00:00:00' NOT NULL");
257                        // vider le cache des descriptions de tables
258                        $trouver_table = charger_fonction('trouver_table','base');
259                        $trouver_table(false);
260                        // ecrire la version pour ne plus passer la
261                        ecrire_meta($nom_meta_base_version,$current_version="0.3.0",'non');
262                }
263                if (spip_version_compare($current_version,'0.4.0','<')){
264                        // recalculer tous les statuts en tenant compte de la date de publi des articles...
265                        echo "Mise a jour des statuts de documents...";
266                        medias_check_statuts(true);
267                        ecrire_meta($nom_meta_base_version,$current_version="0.4.0",'non');
268                }
269                if (spip_version_compare($current_version,'0.5.0','<')){
270                        include_spip('base/abstract_sql');
271                        // ajouter un champ
272                        sql_alter("TABLE spip_documents ADD brise tinyint DEFAULT 0");
273                        // vider le cache des descriptions de tables
274                        $trouver_table = charger_fonction('trouver_table','base');
275                        $trouver_table(false);
276                        ecrire_meta($nom_meta_base_version,$current_version="0.5.0",'non');
277                }
278                if (spip_version_compare($current_version,'0.6.0','<')){
279                        include_spip('base/abstract_sql');
280                        sql_alter("TABLE spip_types_documents ADD media varchar(10) DEFAULT 'file' NOT NULL");
281                        creer_base_types_doc();
282                        ecrire_meta($nom_meta_base_version,$current_version="0.6.0",'non');
283                }
284                if (spip_version_compare($current_version,'0.7.0','<')){
285                        include_spip('base/abstract_sql');
286                        sql_alter("TABLE spip_documents ADD credits varchar(255) DEFAULT '' NOT NULL");
287                        ecrire_meta($nom_meta_base_version,$current_version="0.7.0",'non');
288                }
289                if (spip_version_compare($current_version,'0.10.0','<')){
290                        // Augmentation de la taille du champ fichier pour permettre les URL longues
291                        include_spip('base/abstract_sql');
292                        sql_alter("TABLE spip_documents CHANGE fichier fichier TEXT NOT NULL DEFAULT ''");
293                        ecrire_meta($nom_meta_base_version,$current_version="0.10.0",'non');
294                }
295                if (version_compare($current_version,'0.11.0','<')){
296                        // Passage du mode en varchar
297                        include_spip('base/abstract_sql');
298                        sql_alter("TABLE spip_documents CHANGE mode mode varchar(10) DEFAULT 'document' NOT NULL");
299                        ecrire_meta($nom_meta_base_version,$current_version="0.11.0",'non');
300                }
301                if (version_compare($current_version,'0.12.0','<')){
302                        // generalisation des metas documents_article et documents_rubriques
303                        $config = array();
304                        if (isset($GLOBALS['meta']['documents_article']) AND $GLOBALS['meta']['documents_article']!=='non')
305                                $config[] = 'spip_articles';
306                        if (isset($GLOBALS['meta']['documents_rubrique']) AND $GLOBALS['meta']['documents_rubrique']!=='non')
307                                $config[] = 'spip_rubriques';
308                        ecrire_meta('documents_objets',implode(',',$config));
309                        ecrire_meta($nom_meta_base_version,$current_version="0.12.0",'non');
310                }
311        }
312        medias_check_statuts();
313}
314
315function medias_install($action,$prefix,$version_cible){
316        $version_base = $GLOBALS[$prefix."_base_version"];
317        switch ($action){
318                case 'test':
319                        # plus necessaire si pas de bug :p
320                        # medias_check_statuts();
321                        return (isset($GLOBALS['meta'][$prefix."_base_version"])
322                                AND version_compare($GLOBALS['meta'][$prefix."_base_version"],$version_cible,">="));
323                        break;
324                case 'install':
325                        medias_upgrade('medias_base_version',$version_cible);
326                        break;
327                case 'uninstall':
328                        # pas de deinstallation sur les documents pour le moment, trop dangereux
329                        # medias_vider_tables();
330                        break;
331        }
332}
333
334
335function medias_optimiser_base_disparus($flux){
336        //
337        // Documents
338        //
339
340        include_spip('action/editer_liens');
341        // optimiser les liens de tous les documents vers des objets effaces
342        $flux['data'] += objet_optimiser_liens(array('document'=>'*'),'*');
343        // on ne nettoie volontairement pas automatiquement les documents orphelins
344       
345        return $flux;
346 
347}
348?>
Note: See TracBrowser for help on using the repository browser.