source: spip-zone/_core_/plugins/medias/action/editer_document.php @ 48933

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

Mise a jour des appels de l'api editer/document
utilisation de la fonction objet_test_si_publie() pour publier un document en fonction du statut des objets liés

File size: 8.2 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
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16/**
17 * Action editer_document
18 *
19 * @param int $arg
20 * @return array
21 */
22function action_editer_document_dist($arg=null) {
23
24        if (is_null($arg)){
25                $securiser_action = charger_fonction('securiser_action', 'inc');
26                $arg = $securiser_action();
27        }
28
29        // Envoi depuis le formulaire de creation d'un document
30        if (!$id_document = intval($arg)) {
31                $id_document = document_inserer();
32        }
33
34        if (!$id_document)
35                return array(0,''); // erreur
36
37        $err = document_modifier($id_document);
38
39        return array($id_document,$err);
40}
41
42/**
43 * Creer un nouveau document
44 *
45 * @return int
46 */
47function document_inserer() {
48
49        $champs = array(
50                'statut' => 'prop',
51                'date' => 'NOW()',
52        );
53
54        // Envoyer aux plugins
55        $champs = pipeline('pre_insertion',
56                array(
57                        'args' => array(
58                                'table' => 'spip_documents',
59                        ),
60                        'data' => $champs
61                )
62        );
63        $id_document = sql_insertq("spip_documents", $champs);
64        pipeline('post_insertion',
65                array(
66                        'args' => array(
67                                'table' => 'spip_documents',
68                                'id_objet' => $id_document
69                        ),
70                        'data' => $champs
71                )
72        );
73
74        return $id_document;
75}
76
77
78/**
79 * Enregistre une revision de document.
80 * $set est un contenu (par defaut on prend le contenu via _request())
81 *
82 * @param int $id_document
83 * @param array|bool $set
84 */
85function document_modifier($id_document, $set=false) {
86
87        include_spip('inc/modifier');
88        // champs normaux
89        $champs = collecter_requests(
90                // white list
91                array(
92                 'titre', 'descriptif', 'date', 'taille', 'largeur','hauteur','mode','credits',
93                 'fichier','distant','extension', 'id_vignette',
94                ),
95                // black list
96                array('parents', 'ajout_parents'),
97                // donnees eventuellement fournies
98                $set
99        );
100
101
102        // Si le document est publie, invalider les caches et demander sa reindexation
103        $t = sql_getfetsel("statut", "spip_documents", 'id_document='.intval($id_document));
104        if ($t == 'publie') {
105                $invalideur = "id='id_document/$id_document'";
106                $indexation = true;
107        }
108       
109        $ancien_fichier = "";
110        // si le fichier est modifie, noter le nom de l'ancien pour faire le menage
111        if (isset($champs['fichier'])){
112                $ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document));
113        }
114
115        modifier_contenu('document', $id_document,
116                array(
117                        'invalideur' => $invalideur,
118                        'indexation' => $indexation
119                ),
120                $champs);
121
122        // nettoyer l'ancien fichier si necessaire
123        if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ
124         AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
125         AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
126         AND @file_exists($f = get_spip_doc($ancien_fichier)))
127                spip_unlink($f);
128
129        // Changer le statut du document ?
130        // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies
131        $champs = collecter_requests(array('parents','ajouts_parents'),array(),$set);
132        if(document_instituer($id_document,$champs)) {
133
134                //
135                // Post-modifications
136                //
137       
138                // Invalider les caches
139                include_spip('inc/invalideur');
140                suivre_invalideur("id='id_document/$id_document'");     
141        }
142
143}
144
145
146/**
147 * determiner le statut d'un document : prepa/publie
148 * si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
149 *
150 * @param int $id_document
151 * @param array $champs
152 * @return bool
153 */
154function document_instituer($id_document,$champs=array()){
155       
156        $statut=isset($champs['statut'])?$champs['statut']:null;
157        $date_publication = isset($champs['date_publication'])?$champs['date_publication']:null;
158        if (isset($champs['parents']))
159                medias_revision_document_parents($id_document,$champs['parents']);
160        if (isset($champs['ajout_parents']))
161                medias_revision_document_parents($id_document,$champs['ajout_parents'],true);
162       
163        $row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document");
164        $statut_ancien = $row['statut'];
165        $date_publication_ancienne = $row['date_publication'];
166        if (is_null($statut)){
167                $statut = 'prepa';
168
169                $trouver_table = charger_fonction('trouver_table','base');
170                $res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document));
171                // dans 10 ans, ca nous fera un bug a corriger vers 2018
172                // penser a ouvrir un ticket d'ici la :p
173                $date_publication=time()+10*365*24*3600;
174                include_spip('base/objets');
175                while($row = sql_fetch($res)){
176                        if (
177                                // si pas de champ statut, c'est un objet publie, donc c'est bon
178                                !isset($desc['field']['statut'])
179                                // cas particulier des rubriques qui sont publiees des qu'elles contiennent un document !
180                          OR $row['objet']=='rubrique'
181                                // ou si objet publie selon sa declaration
182                          OR objet_test_si_publie($row['objet'],$row['id_objet'])){
183                                $statut = 'publie';
184                                $date_publication=0;
185                                continue;
186                        }
187                        // si pas publie, et article, il faut checker la date de post-publi eventuelle
188                        elseif ($row['objet']=='article'
189                          AND $row2 = sql_fetsel('date','spip_articles','id_article='.intval($row['id_objet'])." AND statut='publie'")){
190                                $date_publication = min($date_publication,strtotime($row2['date']));
191                        }
192                }
193                $date_publication = date('Y-m-d H:i:s',$date_publication);
194                if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publication==$date_publication_ancienne)
195                        return false;
196                if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0')
197                        return false;
198        }
199        if ($statut!==$statut_ancien
200          OR $date_publication!=$date_publication_ancienne){
201                sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document));
202                if ($statut!==$statut_ancien){
203                        $publier_rubriques = sql_allfetsel('id_objet','spip_documents_liens',"objet='rubrique' AND id_document=".intval($id_document));
204                        if (count($publier_rubriques)){
205                                include_spip('inc/rubriques');
206                                foreach($publier_rubriques as $r)
207                                        calculer_rubriques_if($r['id_objet'],array('statut'=>$statut),$statut_ancien,false);
208                        }
209                }
210                return true;
211        }
212        return false;
213}
214
215
216/**
217 * Revision des parents d'un document
218 * chaque parent est liste au format objet|id_objet
219 *
220 * @param int $id_document
221 * @param array $parents
222 * @param bool $ajout
223 */
224function medias_revision_document_parents($id_document, $parents=null, $ajout=false){
225        if (!is_array($parents))
226                return;
227       
228        $insertions = array();
229        $objets_parents = array(); // array('article'=>array(12,23))
230       
231        // au format objet|id_objet
232        foreach($parents as $p){
233                $p = explode('|',$p);
234                if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0])
235                  AND $p[1]=intval($p[1])){ // securite
236                        $objets_parents[$p[0]][] = $p[1];
237                }
238        }
239       
240        include_spip('action/editer_liens');
241        // les liens actuels
242        $liens = objet_trouver_liens(array('document'=>$id_document),'*');
243        $deja_parents = array();
244        // si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents
245        if (!$ajout){
246                foreach($liens as $k=>$lien)
247                        if (!isset($objets_parents[$lien['objet']]) OR !in_array($lien['id_objet'],$objets_parents[$lien['objet']])) {
248                                objet_dissocier(array('document'=>$id_document),array($lien['objet']=>$lien['id_objet']));
249                                unset($liens[$k]);
250                        }
251                        else $deja_parents[$lien['objet']][] = $lien['id_objet'];
252        }
253
254        objet_associer(array('document'=>$id_document),$objets_parents);
255
256}
257
258
259// obsoletes
260function insert_document() {
261        return document_inserer();
262}
263function document_set($id_document, $set=false) {
264        return document_modifier($id_document, $set);
265}
266function instituer_document($id_document,$champs=array()){
267        return document_instituer($id_document,$champs);
268}
269function revision_document($id_document, $c=false) {
270        return document_modifier($id_document,$c);
271}
272
273?>
Note: See TracBrowser for help on using the repository browser.