source: spip-zone/_plugins_/mediatheque/action/editer_document.php @ 44136

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

prevoir que l'on peut rattacher un document a un autre. C'est une pre-figuration de la reorganisation des documents.
Dans spip_documents_liens id_document designe toujours l'enfant (dependant de) et (id_objet,objet) le parent.
Donc ici un document annexe (sous-titrage, licence, ..) est designe par id_document, et (id_objet,objet='document') pointe vers le document maitre.
Des variantes du mode 'vignette' sont donc a prevoir, pour les documents annexes

File size: 6.7 KB
Line 
1<?php
2/**
3 * Plugin Portfolio/Gestion des documents
4 * Licence GPL (c) 2006-2008 Cedric Morin, romy.tetue.net
5 *
6 */
7
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10/**
11 * Action editer_document
12 *
13 * @return unknown
14 */
15function action_editer_document_dist() {
16
17        $securiser_action = charger_fonction('securiser_action', 'inc');
18        $arg = $securiser_action();
19
20        // Envoi depuis le formulaire de creation d'un document
21        if (!$id_document = intval($arg)) {
22                $id_document = insert_document();
23        } 
24
25        if ($id_document = intval($id_document)) {
26                document_set($id_document);
27        }
28        // Erreur
29        else{
30                include_spip('inc/headers');
31                redirige_url_ecrire();
32        }
33
34        if (_request('redirect')) {
35                $redirect = parametre_url(urldecode(_request('redirect')),
36                        'id_document', $id_document, '&');
37                       
38                include_spip('inc/headers');
39                redirige_par_entete($redirect);
40        }
41        else 
42                return array($id_document,'');
43}
44
45/**
46 * Creer un nouveau document
47 *
48 * @return unknown
49 */
50function insert_document() {
51
52        $champs = array(
53                'statut' => 'prop',
54                'date' => 'NOW()',
55        );
56
57        // Envoyer aux plugins
58        $champs = pipeline('pre_insertion',
59                array(
60                        'args' => array(
61                                'table' => 'spip_documents',
62                        ),
63                        'data' => $champs
64                )
65        );
66        $id_document = sql_insertq("spip_documents", $champs);
67       
68        return $id_document;
69}
70
71
72/**
73 * Enregistre une revision de document.
74 * $c est un contenu (par defaut on prend le contenu via _request())
75 *
76 * @param int $id_document
77 * @param array $c
78 */
79function document_set ($id_document, $c=false) {
80
81        // champs normaux
82        $champs = array();
83        foreach (array(
84                'titre', 'descriptif', 'date', 'taille', 'largeur','hauteur','mode','credits',
85                'fichier','distant','extension', 'id_vignette',
86          ) as $champ)
87                if (($a = _request($champ,$c)) !== null)
88                        $champs[$champ] = $a;
89
90        // Si le document est publie, invalider les caches et demander sa reindexation
91        $t = sql_getfetsel("statut", "spip_documents", 'id_document='.intval($id_document));
92        if ($t == 'publie') {
93                $invalideur = "id='id_document/$id_document'";
94                $indexation = true;
95        }
96       
97        $ancien_fichier = "";
98        // si le fichier est modifie, noter le nom de l'ancien pour faire le menage
99        if (isset($champs['fichier'])){
100                $ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document));
101        }
102
103        include_spip('inc/modifier');
104        modifier_contenu('document', $id_document,
105                array(
106                        'invalideur' => $invalideur,
107                        'indexation' => $indexation
108                ),
109                $champs);
110
111        // nettoyer l'ancien fichier si necessaire
112        if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ
113         AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
114         AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
115         AND @file_exists($f = get_spip_doc($ancien_fichier)))
116                spip_unlink($f);
117
118        // Changer le statut du document ?
119        // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies
120        if(instituer_document($id_document,array('parents'=>_request('parents',$c),'ajout_parents'=>_request('ajout_parents',$c)))) {
121
122                //
123                // Post-modifications
124                //
125       
126                // Invalider les caches
127                include_spip('inc/invalideur');
128                suivre_invalideur("id='id_document/$id_document'");     
129        }
130
131}
132/**
133 * determiner le statut d'un document : prepa/publie
134 * si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
135 *
136 * @param int $id_document
137 */
138function instituer_document($id_document,$champs=array()){
139       
140        $statut=isset($champs['statut'])?$champs['statut']:null;
141        $date_publication = isset($champs['date_publication'])?$champs['date_publication']:null;
142        if (isset($champs['parents']))
143                medias_revision_document_parents($id_document,$champs['parents']);
144        if (isset($champs['ajout_parents']))
145                medias_revision_document_parents($id_document,$champs['ajout_parents'],true);
146       
147        $row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document");
148        $statut_ancien = $row['statut'];
149        $date_publication_ancienne = $row['date_publication'];
150        if (is_null($statut)){
151                $statut = 'prepa';
152       
153                $trouver_table = charger_fonction('trouver_table','base');
154                $res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document));
155                // dans 10 ans, ca nous fera un bug a corriger vers 2018
156                // penser a ouvrir un ticket d'ici la :p
157                $date_publication=time()+10*365*24*3600;
158                while($row = sql_fetch($res)){
159                        $table = table_objet_sql($row['objet']);
160                        $desc = $trouver_table($table);
161                        // si pas de champ statut, c'est un objet publie, donc c'est bon
162                        if (!isset($desc['field']['statut'])){
163                                $statut = 'publie';
164                                $date_publication=0;
165                                continue;
166                        }
167                        $id_table = id_table_objet($row['objet']);
168                        $row2 = sql_fetsel('statut'.($table=='spip_articles'?",date":""),$table,$id_table.'='.intval($row['id_objet']));
169                        if ($row2['statut']=='publie'){
170                                $statut = 'publie';
171                                // si ce n'est pas un article, c'est donc deja publie, on met la date a 0
172                                if (!$row2['date']){
173                                        $date_publication=0;
174                                        continue;
175                                }
176                                else {
177                                        $date_publication = min($date_publication,strtotime($row2['date']));
178                                }
179                        }
180                }
181                $date_publication = date('Y-m-d H:i:s',$date_publication);
182                if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publie==$date_publication_ancienne)
183                        return false;
184                if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0')
185                        return false;
186        }
187        if ($statut!==$statut_ancien
188        OR $date_publication!=$date_publication_ancienne){
189                sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document));
190                return true;
191        }
192        return false;
193}
194
195
196/**
197 * Revision des parents d'un document
198 * chaque parent est liste au format objet|id_objet
199 *
200 * @param unknown_type $id_document
201 * @param unknown_type $parents
202 */
203function medias_revision_document_parents($id_document, $parents=null, $ajout=false){
204        if (!is_array($parents))
205                return;
206       
207        $insertions = array();
208        $cond = array();
209        // au format objet|id_objet
210        foreach($parents as $p){
211                $p = explode('|',$p);
212                if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0])){ // securite
213                        $insertions[] = array('id_document'=>$id_document,'objet'=>$p[0],'id_objet'=>$p[1]);
214                        $cond[] = "(id_objet=".intval($p[1])." AND objet=".sql_quote($p[0]).")";
215                }
216        }
217        if (!$ajout){
218                // suppression des parents obsoletes
219                $cond_notin = "id_document=".intval($id_document).(count($cond)?" AND NOT(".implode(") AND NOT(",$cond).")":"");
220                #$cond_in = "id_document=".intval($id_document).(count($cond)?" AND (".implode(" OR (",$cond).")":"");
221                sql_delete("spip_documents_liens", $cond_notin);
222        }
223
224        foreach($insertions as $ins){
225                if (!sql_countsel('spip_documents_liens','id_document='.intval($ins['id_document'])." AND id_objet=".intval($ins['id_objet'])." AND objet=".sql_quote($ins['objet'])))
226                        sql_insertq('spip_documents_liens',$ins);
227        }
228}
229?>
Note: See TracBrowser for help on using the repository browser.