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

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

v1.2.12 : le JS du formulaire d'ajout des documents bogue quand il est présent plusieurs fois sur la page, et le cas se présente avec les logos en documents. On change les identifiants pour les rendre vraiment uniques (sans surcharge).

  • Property svn:executable set to *
File size: 11.1 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 * Formulaire d'ajout de document : ajout du sélecteur de rôle, et rendre les identifiants uniques pour éviter un pb de JS quand le form est présent plusieurs fois sur la page.
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                // 1) Ajout du sélecteur de rôle
320
321                // Est-ce qu'il s'agit d'un ajout de logo ?
322                $editer_logo = !empty($flux['args']['contexte']['editer_logo']);
323                $principaux = $editer_logo ? true : false;
324
325                // Retrouver les rôles restant à associer
326                $objet = $flux['args']['contexte']['objet'];
327                $id_objet = $flux['args']['contexte']['id_objet'];
328                $roles = roles_documents_presents_sur_objet($objet, $id_objet, 0, $principaux);
329                $roles_attribuables = isset($flux['args']['contexte']['roles_attribuables']) ?
330                        $flux['args']['contexte']['roles_attribuables'] :
331                        ($editer_logo ?
332                                $roles['attribuables'] :
333                                $roles['possibles']
334                        );
335                $multiple = $editer_logo ? null : (count($roles_attribuables) > 1 ? 'oui' : null);
336                $contexte = array(
337                        'roles'              => $flux['args']['contexte']['roles'],
338                        'roles_attribuables' => $roles_attribuables,
339                        'multiple'           => $multiple,
340                );
341
342                // On place le sélecteur au début (compliqué de le placer juste avant les boutons, déplacés en JS, et des blocs cachés)
343                $selecteur_roles = recuperer_fond('formulaires/inc-selecteur_role', $contexte);
344                $flux['data']['texte'] = $selecteur_roles . $flux['data']['texte'];
345
346                // 2) Rendre les identifiants vraiment uniques pour le JS
347
348                if (preg_match('/id=["\']defaultsubmit([^"\']+)/i', $flux['data']['texte'], $res)) {
349                        $domid = $res[1]; // L'identifiant pas si unique présent par défaut
350                        $uniqid = $domid . '_' . uniqid(); // Identifiant vraiement unique
351                        $flux['data']['texte'] = str_replace($domid, $uniqid, $flux['data']['texte']);
352                }
353
354        }
355
356        return $flux;
357}
358
359
360/**
361 * Modifier le résultat du calcul d’un squelette de formulaire.
362 *
363 * - Formulaire d'édition de logo : on a besoin de bénéficier des éventuelles modifications effectuées auu formulaire joindre_document.
364 *   Pour se faire on appelle le même pipeline à nouveau en se faisant passer pour ce dernier.
365 *
366 * @param array $flux
367 * @return array
368 **/
369function roles_documents_formulaire_fond($flux) {
370
371        if ($flux['args']['form'] == 'editer_logo'
372                //and !empty($flux['args']['contexte']['_bigup_rechercher_fichiers'])
373        ) {
374                $flux_joindre_document = $flux;
375                $flux_joindre_document['args']['form'] = 'joindre_document';
376                $data = pipeline('formulaire_fond', $flux_joindre_document);
377                $flux['data'] = $data;
378        }
379
380        return $flux;
381}
Note: See TracBrowser for help on using the repository browser.