source: spip-zone/_plugins_/roles_documents/trunk/roles_documents_pipelines.php @ 110029

Last change on this file since 110029 was 110029, checked in by tcharlss@…, 7 months ago

Améliorer un peu l'ergonomie du sélecteur de rôles en s'adaptant au contexte (chankalan). S'il n'y a qu'un seul rôle possible : input caché avec un label. S'il y a moins de 5 rôles : radio ou checkbox (si choix multiple). S'il y a 5 rôles ou plus : select avec la classe .chosen. On active la sélection mutliple aussi.

  • Property svn:executable set to *
File size: 10.5 KB
Line 
1<?php
2/**
3 * Plugin Rôles de documents
4 * (c) 2015
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Ajout de contenu dans le bloc «actions» des documents
14 *
15 * - Formulaire pour définir les rôles des documents
16 *
17 * @pipeline document_desc_actions
18 *
19 * @param  array $flux Données du pipeline
20 * @return array       Données du pipeline
21 */
22function roles_documents_document_desc_actions($flux) {
23        include_spip('inc/autoriser');
24
25        $texte               = '';
26        $exec                = trouver_objet_exec(_request('exec'));
27        $objet_exec          = $exec['type'];
28        $id_table_objet_exec = $exec['id_table_objet'];
29        $id_objet_exec       = intval(_request($id_table_objet_exec));
30        // soit objet et id_objet sont passés en paramètre, soit on prend l'objet édité sur la page
31        $objet               = !empty($flux['args']['objet']) ? $flux['args']['objet'] : $objet_exec;
32        $id_objet            = !empty($flux['args']['id_objet']) ? $flux['args']['id_objet'] : $id_objet_exec;
33
34        if (
35                $exec !== false // page d'un objet éditorial
36                and $exec['edition'] === false // pas en mode édition
37                and $flux['args']['variante'] != 'editer_logo'
38                and $id_document = intval($flux['args']['id_document'])
39                and autoriser('modifier', 'document', $id_document)
40                and $objet
41                and $id_objet
42        ) {
43                // bloc à recharger
44                $ajaxreload = !empty($flux['args']['ajaxreload']) ? $flux['args']['ajaxreload'] : '.liste_items.documents';
45                // mini-formulaire
46                $form = recuperer_fond(
47                        'prive/squelettes/inclure/editer_roles_document',
48                        array(
49                                'id_document' => $id_document,
50                                'objet'       => $objet,
51                                'id_objet'    => $id_objet,
52                                'options'     => array(
53                                        'ajaxReload' => $ajaxreload,
54                                ),
55                        )
56                );
57                $texte = $form;
58        }
59
60        if ($texte) {
61                $flux['data'] .= $texte;
62        }
63
64        return $flux;
65}
66
67
68/**
69 * Synchroniser les champs "vu" et "rang_lien" lors de la création d'un nouveau lien de document portant un rôle.
70 *
71 * @pipeline post_edition_liens
72 *
73 * @param  array $flux Données du pipeline
74 * @return array       Données du pipeline
75 */
76function roles_documents_post_edition_lien($flux) {
77        if (
78                $flux['args']['action'] == 'insert'             // il s'agit d'une création de lien
79                and $flux['args']['objet_source'] == 'document' // on a affaire à un document
80                and isset($flux['args']['role'])
81                and $role = $flux['args']['role']
82                and strlen($role)                               // et il y a un role donné
83                and isset($flux['args']['colonne_role'])
84                and $colonne_role = $flux['args']['colonne_role']
85                and $id_document = intval($flux['args']['id_objet_source'])
86                and $objet = $flux['args']['objet']
87                and $id_objet = intval($flux['args']['id_objet'])
88        ) {
89                // le champ 'rang_lien' n'est présent qu'à partir de SPIP 3.2 (ou avec le plugin ordoc)
90                $champs_synchronises = array('vu', 'rang_lien');
91
92                $trouver_table = charger_fonction('trouver_table', 'base');
93                $desc = $trouver_table('spip_documents_liens');
94                $champs_presents = array_flip(array_intersect_key(array_flip($champs_synchronises), $desc['field']));
95
96                $qualifier = sql_fetsel(
97                        $champs_presents,
98                        'spip_documents_liens',
99                        array(
100                                'id_document=' . $id_document,
101                                'objet=' . sql_quote($objet),
102                                'id_objet=' . $id_objet,
103                                $colonne_role . '=' . sql_quote('document')
104                        )
105                );
106                if ($qualifier) {
107                        include_spip('action/editer_liens');
108                        objet_qualifier_liens(
109                                array('document' => $id_document),
110                                array($objet => $id_objet),
111                                array($colonne_role => $role) + $qualifier
112                        );
113                }
114        }
115
116        return $flux;
117}
118
119
120/**
121 * Après la modif d'un objet, synchroniser le vu de tous les document liés ayant un rôle
122 * avec celui du lien de base (ayant le rôle par défaut)
123 *
124 * @pipeline post_edition
125 *
126 * @param  array $flux Données du pipeline
127 * @return array       Données du pipeline
128 */
129function roles_documents_post_edition($flux) {
130        if (
131                isset($flux['args']['action'])
132                and $flux['args']['action'] == 'modifier'       // on modifie un objet
133                and $flux['args']['table'] !== 'spip_documents'  // mais pas un document
134                and $objet = $flux['args']['type']
135                and $id_objet = intval($flux['args']['id_objet'])
136        ) {
137                include_spip('action/editer_liens');
138
139                // on regarde s'il y a des documents liés à l'objet modifié
140                if (count($liens = objet_trouver_liens(array('document'=>'*'), array($objet=>$id_objet)))) {
141                        foreach ($liens as $l) {
142                                // on récupère le champ "vu" du lien avec le rôle par défaut
143                                $vu = sql_getfetsel(
144                                        'vu',
145                                        'spip_documents_liens',
146                                        'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .'
147                                                AND id_objet='.$id_objet .' AND role='.sql_quote('document')
148                                );
149                                // on met à jour tous les autres liens avec rôle
150                                sql_updateq(
151                                        'spip_documents_liens',
152                                        array('vu'=>$vu),
153                                        'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .'
154                                                AND id_objet='.$id_objet .' AND role!='.sql_quote('document')
155                                );
156                        }
157                }
158        }
159
160        return $flux;
161}
162
163
164/**
165 * Empêcher les logos de sortir dans les boucles DOCUMENTS standards.
166 *
167 * C'est nécessaire pour la rétro-compatibilité avec les squelettes existants.
168 * Pour voir les logos dans les boucles DOCUMENTS, il faut utiliser
169 * explicitement le critère {tout} ou {role=logo}
170 *
171 * @pipeline pre_boucle
172 * @param  array $boucle Données du pipeline
173 * @return array       Données du pipeline
174 */
175function roles_documents_pre_boucle($boucle) {
176
177        // Boucle DOCUMENTS
178        if ($boucle->type_requete === 'documents') {
179
180                // Vérifier la présence du critère {role}
181                // [FIXME] vérifier sa valeur (=logo)
182                $utilise_critere_logo = false;
183                foreach ($boucle->criteres as $critere) {
184                        if ($critere->type === 'critere') {
185                                if (
186                                        (isset($critere->param[0][0]) and $critere->param[0][0]->texte === 'role')
187                                        or ($critere->op === 'role')
188                                ) {
189                                        $utilise_critere_logo = true;
190                                }
191                        }
192                }
193
194                // Gros hack : on évite le traitement pour certains squelettes,
195                // afin  d'éviter de les surcharger
196                $bypass = false;
197                $squelettes_bypass = array(
198                        array(
199                                'sourcefile' => 'document_desc.html',
200                                'id_boucle'  => '_docslies',
201                        )
202                );
203                foreach($squelettes_bypass as $squelette) {
204                        if (substr($boucle->descr['sourcefile'], -strlen($squelette['sourcefile'])) == $squelette['sourcefile']
205                                and $boucle->id_boucle == $squelette['id_boucle']
206                        ) {
207                                $bypass = true;
208                        }
209                }
210
211                // Go go go
212                if (
213                        !$utilise_critere_logo
214                        and (empty($boucle->modificateur['tout']) or $boucle->modificateur['tout'] === false)
215                        and !$bypass
216                ) {
217                        $table_liens = 'spip_documents_liens';
218                        $abbrev_table_lien = array_search($table_liens, $boucle->from);
219
220                        if ($abbrev_table_lien) {
221                                $boucle->where[] = array(
222                                        "'!='",
223                                        "'SUBSTR($abbrev_table_lien.role, 1, 4)'",
224                                        "'\'logo\''"
225                                );
226                        }
227                }
228        }
229
230        return $boucle;
231}
232
233
234/**
235 * Modifier le tableau retourné par la fonction charger d'un formulaire
236 *
237 * Ajout du champ 'role' sur le formulaire d'ajout de document
238 *
239 * @pipeline formulaire_charger
240 *
241 * @param  array $flux Données du pipeline
242 * @return array       Données du pipeline
243 */
244function roles_documents_formulaire_charger($flux) {
245
246        // Formulaire d'ajout de document
247        if ($flux['args']['form'] == 'joindre_document') {
248                $flux['data']['roles'] = '';
249        }
250
251        return $flux;
252}
253
254
255/**
256 * Complèter le tableau de réponse ou faire des traitements supplémentaires pour un formulaire
257 *
258 * Qualifier le lien crée avec le rôle choisi
259 *
260 * @pipeline formulaire_traiter
261 *
262 * @param  array $flux Données du pipeline
263 * @return array       Données du pipeline
264 */
265function roles_documents_formulaire_traiter($flux) {
266
267        // Formulaire d'ajout de document
268        // En présence d'un role sélectionne, on requalifie le lien créé
269        // sauf si c'est le rôle par défaut
270        if ($flux['args']['form'] == 'joindre_document'
271                and $roles = _request('roles')
272                and $objet = $flux['args']['args'][2]
273                and $id_objet = $flux['args']['args'][1]
274                and !empty($flux['data']['ids'])
275        ) {
276                foreach ($flux['data']['ids'] as $id_document) {
277                        if (!is_array($roles)) {
278                                $roles = array($roles);
279                        }
280                        foreach ($roles as $role) {
281                                if ($role != 'document') {
282                                        $update = sql_updateq(
283                                                'spip_documents_liens',
284                                                array('role' => $role),
285                                                array(
286                                                        'id_document=' . intval($id_document),
287                                                        'objet='       . sql_quote($objet),
288                                                        'id_objet='    . intval($id_objet),
289                                                        'role='        . sql_quote('document'),
290                                                )
291                                        );
292                                }
293                        }
294                }
295        }
296
297        return $flux;
298}
299
300
301/**
302 * Modifier le résultat du calcul d’un squelette donné.
303 *
304 * Ajout du sélecteur de rôle sur un inclure du formulaire d'ajout de document.
305 *
306 * @pipeline recuperer_fond
307 *
308 * @param  array $flux Données du pipeline
309 * @return array       Données du pipeline
310 */
311function roles_documents_recuperer_fond($flux) {
312
313        // Ajout de document
314        if ($flux['args']['fond'] == 'formulaires/inc-upload_document'
315                and isset($flux['args']['contexte']['objet'])
316                and isset($flux['args']['contexte']['id_objet'])
317        ) {
318
319                // Est-ce qu'il s'agit d'un ajout de logo ?
320                $editer_logo = !empty($flux['args']['contexte']['editer_logo']);
321                $principaux = $editer_logo ? true : false;
322
323                // Retrouver les rôles restant à associer
324                $objet = $flux['args']['contexte']['objet'];
325                $id_objet = $flux['args']['contexte']['id_objet'];
326                $roles = roles_documents_presents_sur_objet($objet, $id_objet, 0, $principaux);
327                $roles_attribuables = isset($flux['args']['contexte']['roles_attribuables']) ?
328                        $flux['args']['contexte']['roles_attribuables'] :
329                        ($editer_logo ?
330                                $roles['attribuables'] :
331                                $roles['possibles']
332                        );
333                $multiple = $editer_logo ? null : (count($roles_attribuables) > 1 ? 'oui' : null);
334                $contexte = array(
335                        'roles'              => $flux['args']['contexte']['roles'],
336                        'roles_attribuables' => $roles_attribuables,
337                        'multiple'           => $multiple,
338                );
339
340                $selecteur_roles = recuperer_fond('formulaires/inc-selecteur_role', $contexte);
341                $flux['data']['texte'] = $selecteur_roles . $flux['data']['texte'];
342        }
343
344        return $flux;
345}
346
347
348/**
349 * Modifier le résultat du calcul d’un squelette de formulaire.
350 *
351 * - Formulaire d'édition de logo : on a besoin de bénéficier des éventuelles modifications effectuées auu formulaire joindre_document.
352 *   Pour se faire on appelle le même pipeline à nouveau en se faisant passer pour ce dernier.
353 *
354 * @param array $flux
355 * @return array
356 **/
357function roles_documents_formulaire_fond($flux) {
358
359        if ($flux['args']['form'] == 'editer_logo'
360                //and !empty($flux['args']['contexte']['_bigup_rechercher_fichiers'])
361        ) {
362                $flux_joindre_document = $flux;
363                $flux_joindre_document['args']['form'] = 'joindre_document';
364                $data = pipeline('formulaire_fond', $flux_joindre_document);
365                $flux['data'] = $data;
366        }
367
368        return $flux;
369}
Note: See TracBrowser for help on using the repository browser.