38d39f8b75a461368a7373292661d76e87573e31
[lhc/web/www.git] / www / plugins-dist / medias / medias_pipelines.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 * Utilisations de pipelines
15 *
16 * @package SPIP\Medias\Pipelines
17 **/
18
19
20 if (!defined('_ECRIRE_INC_VERSION')) {
21 return;
22 }
23
24 /**
25 * Traiter le cas pathologique d'un upload de document ayant echoué
26 * car étant trop gros
27 *
28 * @uses erreur_upload_trop_gros()
29 * @pipeline detecter_fond_par_defaut
30 * @param string $fond
31 * Nom du squelette par défaut qui sera utilisé
32 * @return string
33 * Nom du squelette par défaut qui sera utilisé
34 **/
35 function medias_detecter_fond_par_defaut($fond) {
36 if (empty($_GET) and empty($_POST) and empty($_FILES)
37 and isset($_SERVER['CONTENT_LENGTH'])
38 and isset($_SERVER['CONTENT_TYPE'])
39 and strstr($_SERVER['CONTENT_TYPE'], 'multipart/form-data;')
40 ) {
41 include_spip('inc/getdocument');
42 erreur_upload_trop_gros();
43 }
44
45 return $fond;
46 }
47
48
49 /**
50 * À chaque insertion d'un nouvel objet editorial
51 * auquel on a attaché des documents, restituer l'identifiant
52 * du nouvel objet crée sur les liaisons documents/objet,
53 * qui ont ponctuellement un identifiant id_objet négatif.
54 *
55 * @see medias_affiche_gauche()
56 * @pipeline post_insertion
57 *
58 * @param array $flux
59 * Données du pipeline
60 * @return array
61 * Données du pipeline
62 **/
63 function medias_post_insertion($flux) {
64
65 $objet = objet_type($flux['args']['table']);
66 $id_objet = $flux['args']['id_objet'];
67 $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : 0;
68
69 include_spip('inc/autoriser');
70
71 if (autoriser('joindredocument', $objet, $id_objet) and $id_auteur) {
72 # cf. HACK medias_affiche_gauche()
73 # rattrapper les documents associes a cet objet nouveau
74 # ils ont un id = 0-id_auteur
75
76 # utiliser l'api editer_lien pour les appels aux pipeline edition_lien
77 include_spip('action/editer_liens');
78 $liens = objet_trouver_liens(array('document' => '*'), array($objet => 0 - $id_auteur));
79 foreach ($liens as $lien) {
80 objet_associer(array('document' => $lien['document']), array($objet => $id_objet), $lien);
81 }
82 // un simple delete pour supprimer les liens temporaires
83 sql_delete('spip_documents_liens', array('id_objet = ' . (0 - $id_auteur), 'objet=' . sql_quote($objet)));
84 }
85
86 return $flux;
87 }
88
89 /**
90 * Ajoute la configuration des documents à la page de configuration des contenus
91 *
92 * @pipeline affiche_milieu
93 * @param array $flux
94 * @return array
95 */
96 function medias_affiche_milieu($flux) {
97 if ($flux['args']['exec'] == 'configurer_contenu') {
98 $flux['data'] .= recuperer_fond(
99 'prive/squelettes/inclure/configurer',
100 array('configurer' => 'configurer_documents')
101 );
102 }
103
104 return $flux;
105 }
106
107 /**
108 * Définir les meta de configuration liées aux documents
109 *
110 * @pipeline configurer_liste_metas
111 * @param array $config
112 * Couples nom de la méta => valeur par défaut
113 * @return array
114 * Couples nom de la méta => valeur par défaut
115 */
116 function medias_configurer_liste_metas($config) {
117 $config['documents_objets'] = 'spip_articles';
118 $config['documents_date'] = 'non';
119
120 return $config;
121 }
122
123 /**
124 * Institue ou met à jour les liens de documents après l'édition d'un objet
125 *
126 * @pipeline post_edition
127 * @param array $flux
128 * Données du pipeline
129 * @return array
130 * Données du pipeline
131 **/
132 function medias_post_edition($flux) {
133 // le serveur n'est pas toujours la
134 $serveur = (isset($flux['args']['serveur']) ? $flux['args']['serveur'] : '');
135 // si on ajoute un document, mettre son statut a jour
136 if (isset($flux['args']['action']) and $flux['args']['action'] == 'ajouter_document') {
137 include_spip('action/editer_document');
138 // mettre a jour le statut si necessaire
139 document_instituer($flux['args']['id_objet']);
140 } // si on institue un objet, mettre ses documents lies a jour
141 elseif (isset($flux['args']['table']) and $flux['args']['table'] !== 'spip_documents') {
142 $type = isset($flux['args']['type']) ? $flux['args']['type'] : objet_type($flux['args']['table']);
143 // verifier d'abord les doublons !
144 include_spip('inc/autoriser');
145 if (autoriser('autoassocierdocument', $type, $flux['args']['id_objet'])) {
146 $table_objet = isset($flux['args']['table_objet']) ?
147 $flux['args']['table_objet'] : table_objet($flux['args']['table'], $serveur);
148 $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
149 $marquer_doublons_doc($flux['data'], $flux['args']['id_objet'], $type, id_table_objet($type, $serveur),
150 $table_objet, $flux['args']['table'], '', $serveur);
151 }
152
153 if (($flux['args']['action'] and $flux['args']['action'] == 'instituer') or isset($flux['data']['statut'])) {
154 include_spip('base/abstract_sql');
155 $id = $flux['args']['id_objet'];
156 $docs = array_map(
157 'reset',
158 sql_allfetsel('id_document', 'spip_documents_liens', 'id_objet=' . intval($id) . ' AND objet=' . sql_quote($type))
159 );
160 include_spip('action/editer_document');
161 foreach ($docs as $id_document) {
162 // mettre a jour le statut si necessaire
163 document_instituer($id_document);
164 }
165 }
166 } else {
167 if (isset($flux['args']['table']) and $flux['args']['table'] !== 'spip_documents') {
168 // verifier les doublons !
169 $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
170 $marquer_doublons_doc($flux['data'], $flux['args']['id_objet'], $flux['args']['type'],
171 id_table_objet($flux['args']['type'], $serveur), $flux['args']['table_objet'],
172 $flux['args']['spip_table_objet'], '', $serveur);
173 }
174 }
175
176 return $flux;
177 }
178
179 /**
180 * Ajouter le portfolio et ajout de document sur les fiches objet
181 *
182 * Uniquement sur les objets pour lesquelles les medias ont été activés
183 *
184 * @pipeline afficher_complement_objet
185 * @param array $flux
186 * @return array
187 */
188 function medias_afficher_complement_objet($flux) {
189 if ($type = $flux['args']['type']
190 and $id = intval($flux['args']['id'])
191 and (autoriser('joindredocument', $type, $id))
192 ) {
193 $documenter_objet = charger_fonction('documenter_objet', 'inc');
194 $flux['data'] .= $documenter_objet($id, $type);
195 }
196
197 return $flux;
198 }
199
200 /**
201 * Ajoute le formulaire d'ajout de document au formulaire d'édition
202 * d'un objet (lorsque cet objet peut recevoir des documents).
203 *
204 * @note
205 * HACK : Lors d'une première création de l'objet, celui-ci n'ayant pas
206 * encore d'identifiant tant que le formulaire d'édition n'est pas enregistré,
207 * les liaisions entre les documents liés et l'objet à créer sauvegardent
208 * un identifiant d'objet négatif de la valeur de id_auteur (l'auteur
209 * connecte). Ces liaisons seront corrigées après validation dans
210 * le pipeline medias_post_insertion()
211 *
212 * @pipeline affiche_gauche
213 * @see medias_post_insertion()
214 *
215 * @param array $flux
216 * Données du pipeline
217 * @return array
218 * Données du pipeline
219 */
220 function medias_affiche_gauche($flux) {
221 if ($en_cours = trouver_objet_exec($flux['args']['exec'])
222 and $en_cours['edition'] !== false // page edition uniquement
223 and $type = $en_cours['type']
224 and $id_table_objet = $en_cours['id_table_objet']
225 // id non defini sur les formulaires de nouveaux objets
226 and (isset($flux['args'][$id_table_objet]) and $id = intval($flux['args'][$id_table_objet])
227 // et justement dans ce cas, on met un identifiant negatif
228 or $id = 0 - $GLOBALS['visiteur_session']['id_auteur'])
229 and autoriser('joindredocument', $type, $id)
230 ) {
231 $flux['data'] .= recuperer_fond(
232 'prive/objets/editer/colonne_document',
233 array('objet' => $type, 'id_objet' => $id)
234 );
235 }
236
237 return $flux;
238 }
239
240 /**
241 * Utilisation du pipeline document_desc_actions
242 *
243 * Ne fait rien ici.
244 *
245 * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
246 * sur les formulaires d'ajouts de documents
247 *
248 * @pipeline document_desc_actions
249 * @param array $flux
250 * Données du pipeline
251 * @return array
252 * Données du pipeline
253 **/
254 function medias_document_desc_actions($flux) {
255 return $flux;
256 }
257
258 /**
259 * Utilisation du pipeline editer_document_actions
260 *
261 * Ne fait rien ici.
262 *
263 * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
264 * sur les formulaires d'édition de documents
265 *
266 * @pipeline editer_document_actions
267 * @param array $flux
268 * Données du pipeline
269 * @return array
270 * Données du pipeline
271 **/
272 function medias_editer_document_actions($flux) {
273 return $flux;
274 }
275
276 /**
277 * Utilisation du pipeline renseigner_document_distant
278 *
279 * Ne fait rien ici.
280 *
281 * Ce pipeline permet aux plugins de renseigner les clés `fichier` et
282 * `mode` d'un document distant à partir de l'URL du fichier dans
283 * la clé `source`.
284 *
285 * @see renseigner_source_distante()
286 * @pipeline renseigner_document_distant
287 * @param array $flux
288 * Données du pipeline
289 * @return array
290 * Données du pipeline
291 **/
292 function medias_renseigner_document_distant($flux) {
293 return $flux;
294 }
295
296 /**
297 * Compter les documents dans un objet
298 *
299 * @pipeline objet_compte_enfants
300 * @param array $flux
301 * @return array
302 */
303 function medias_objet_compte_enfants($flux) {
304 if ($objet = $flux['args']['objet']
305 and $id = intval($flux['args']['id_objet'])
306 ) {
307 // juste les publies ?
308 if (array_key_exists('statut', $flux['args']) and ($flux['args']['statut'] == 'publie')) {
309 $flux['data']['document'] = sql_countsel(
310 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
311 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie')"
312 );
313 } else {
314 $flux['data']['document'] = sql_countsel(
315 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
316 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie' OR D.statut='prepa')"
317 );
318 }
319 }
320
321 return $flux;
322 }
323
324 /**
325 * Afficher le nombre de documents dans chaque rubrique
326 *
327 * @pipeline boite_infos
328 * @param array $flux
329 * @return array
330 */
331 function medias_boite_infos($flux) {
332 if ($flux['args']['type'] == 'rubrique'
333 and $id_rubrique = $flux['args']['id']
334 ) {
335 if ($nb = sql_countsel('spip_documents_liens', "objet='rubrique' AND id_objet=" . intval($id_rubrique))) {
336 $nb = '<div>' . singulier_ou_pluriel($nb, 'medias:un_document', 'medias:des_documents') . '</div>';
337 if ($p = strpos($flux['data'], '<!--nb_elements-->')) {
338 $flux['data'] = substr_replace($flux['data'], $nb, $p, 0);
339 }
340 }
341 }
342
343 return $flux;
344 }
345
346 /**
347 * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
348 * Trouver le bon label à afficher sur les champs dans les listes de révisions
349 *
350 * Si un champ est un champ extra, son label correspond au label défini du champs extra
351 *
352 * @pipeline revisions_chercher_label
353 * @param array $flux Données du pipeline
354 * @return array Données du pipeline
355 **/
356 function medias_revisions_chercher_label($flux) {
357 foreach (array('id_vignette', 'hauteur', 'largeur', 'mode', 'taille') as $champ) {
358 if ($flux['args']['champ'] == $champ) {
359 $flux['data'] = _T('medias:info_' . $champ);
360
361 return $flux;
362 }
363 }
364 foreach (array('fichier', 'taille', 'mode', 'credits') as $champ) {
365 if ($flux['args']['champ'] == $champ) {
366 $flux['data'] = _T('medias:label_' . $champ);
367
368 return $flux;
369 }
370 }
371 if ($flux['args']['champ'] == 'distant') {
372 $flux['data'] = $flux['data'] = _T('medias:fichier_distant');
373 }
374
375 return $flux;
376 }