source: spip-zone/_core_/plugins/medias/medias_pipelines.php @ 119908

Last change on this file since 119908 was 119908, checked in by nicod_, 9 months ago

Ne pas considérer une rubrique comme publiée quand on lui ajoute un logo.
https://core.spip.net/issues/4424

File size: 11.9 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2020                                                *
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
20if (!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 **/
35function 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 **/
63function 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 */
96function 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 */
116function 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 **/
132function 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_column(
157                                sql_allfetsel('id_document', 'spip_documents_liens', 'id_objet=' . intval($id) . ' AND objet=' . sql_quote($type)),
158                                'id_document'
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 */
188function medias_afficher_complement_objet($flux) {
189        if ($type = $flux['args']['type']
190                and $id = intval($flux['args']['id'])
191        ) {
192                include_spip('inc/config');
193                // document autorisé en upload sur cet objet ?
194                if ($type == 'article' or in_array(table_objet_sql($type), explode(',', lire_config('documents_objets', '')))) {
195                        $documenter_objet = charger_fonction('documenter_objet', 'inc');
196                        $flux['data'] .= $documenter_objet($id, $type);
197                }
198        }
199
200        return $flux;
201}
202
203/**
204 * Ajoute le formulaire d'ajout de document au formulaire d'édition
205 * d'un objet (lorsque cet objet peut recevoir des documents).
206 *
207 * @note
208 *   HACK : Lors d'une première création de l'objet, celui-ci n'ayant pas
209 *   encore d'identifiant tant que le formulaire d'édition n'est pas enregistré,
210 *   les liaisions entre les documents liés et l'objet à créer sauvegardent
211 *   un identifiant d'objet négatif de la valeur de id_auteur (l'auteur
212 *   connecte). Ces liaisons seront corrigées après validation dans
213 *   le pipeline medias_post_insertion()
214 *
215 * @pipeline affiche_gauche
216 * @see medias_post_insertion()
217 *
218 * @param array $flux
219 *     Données du pipeline
220 * @return array
221 *     Données du pipeline
222 */
223function medias_affiche_gauche($flux) {
224        if ($en_cours = trouver_objet_exec($flux['args']['exec'])
225                and $en_cours['edition'] !== false // page edition uniquement
226                and $type = $en_cours['type']
227                and $id_table_objet = $en_cours['id_table_objet']
228                // id non defini sur les formulaires de nouveaux objets
229                and (isset($flux['args'][$id_table_objet]) and $id = intval($flux['args'][$id_table_objet])
230                        // et justement dans ce cas, on met un identifiant negatif
231                        or $id = 0 - $GLOBALS['visiteur_session']['id_auteur'])
232                and autoriser('joindredocument', $type, $id)
233        ) {
234                $flux['data'] .= recuperer_fond(
235                        'prive/objets/editer/colonne_document',
236                        array('objet' => $type, 'id_objet' => $id)
237                );
238        }
239
240        return $flux;
241}
242
243/**
244 * Utilisation du pipeline document_desc_actions
245 *
246 * Ne fait rien ici.
247 *
248 * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
249 * sur les formulaires d'ajouts de documents
250 *
251 * @pipeline document_desc_actions
252 * @param array $flux
253 *     Données du pipeline
254 * @return array
255 *     Données du pipeline
256 **/
257function medias_document_desc_actions($flux) {
258        return $flux;
259}
260
261/**
262 * Utilisation du pipeline editer_document_actions
263 *
264 * Ne fait rien ici.
265 *
266 * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
267 * sur les formulaires d'édition de documents
268 *
269 * @pipeline editer_document_actions
270 * @param array $flux
271 *     Données du pipeline
272 * @return array
273 *     Données du pipeline
274 **/
275function medias_editer_document_actions($flux) {
276        return $flux;
277}
278
279/**
280 * Utilisation du pipeline renseigner_document_distant
281 *
282 * Ne fait rien ici.
283 *
284 * Ce pipeline permet aux plugins de renseigner les clés `fichier` et
285 * `mode` d'un document distant à partir de l'URL du fichier dans
286 * la clé `source`.
287 *
288 * @see renseigner_source_distante()
289 * @pipeline renseigner_document_distant
290 * @param array $flux
291 *     Données du pipeline
292 * @return array
293 *     Données du pipeline
294 **/
295function medias_renseigner_document_distant($flux) {
296        return $flux;
297}
298
299/**
300 * Compter les documents dans un objet
301 *
302 * @pipeline objet_compte_enfants
303 * @param array $flux
304 * @return array
305 */
306function medias_objet_compte_enfants($flux) {
307        if ($objet = $flux['args']['objet']
308                and $id = intval($flux['args']['id_objet'])
309        ) {
310                // juste les publies ?
311                if (array_key_exists('statut', $flux['args']) and ($flux['args']['statut'] == 'publie')) {
312                        $flux['data']['document'] = sql_countsel(
313                                'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
314                                'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie') and D.mode NOT IN ('logoon','logoff') "
315                        );
316                } else {
317                        $flux['data']['document'] = sql_countsel(
318                                'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
319                                'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie' OR D.statut='prepa') and D.mode NOT IN ('logoon','logoff')"
320                        );
321                }
322        }
323
324        return $flux;
325}
326
327/**
328 * Afficher le nombre de documents dans chaque rubrique
329 *
330 * @pipeline boite_infos
331 * @param array $flux
332 * @return array
333 */
334function medias_boite_infos($flux) {
335        if ($flux['args']['type'] == 'rubrique'
336                and $id_rubrique = $flux['args']['id']
337        ) {
338                if ($nb = sql_countsel('spip_documents_liens', "objet='rubrique' AND id_objet=" . intval($id_rubrique))) {
339                        $nb = '<div>' . singulier_ou_pluriel($nb, 'medias:un_document', 'medias:des_documents') . '</div>';
340                        if ($p = strpos($flux['data'], '<!--nb_elements-->')) {
341                                $flux['data'] = substr_replace($flux['data'], $nb, $p, 0);
342                        }
343                }
344        }
345
346        return $flux;
347}
348
349/**
350 * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
351 * Trouver le bon label à afficher sur les champs dans les listes de révisions
352 *
353 * Si un champ est un champ extra, son label correspond au label défini du champs extra
354 *
355 * @pipeline revisions_chercher_label
356 * @param array $flux Données du pipeline
357 * @return array      Données du pipeline
358 **/
359function medias_revisions_chercher_label($flux) {
360        foreach (array('id_vignette', 'hauteur', 'largeur', 'mode', 'taille') as $champ) {
361                if ($flux['args']['champ'] == $champ) {
362                        $flux['data'] = 'medias:info_' . $champ;
363
364                        return $flux;
365                }
366        }
367        foreach (array('fichier', 'taille', 'mode', 'credits') as $champ) {
368                if ($flux['args']['champ'] == $champ) {
369                        $flux['data'] = 'medias:label_' . $champ;
370
371                        return $flux;
372                }
373        }
374        if ($flux['args']['champ'] == 'distant') {
375                $flux['data'] = $flux['data'] = 'medias:fichier_distant';
376        }
377
378        return $flux;
379}
Note: See TracBrowser for help on using the repository browser.