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

Last change on this file since 107854 was 107854, checked in by rastapopoulos@…, 3 years ago

Prend en compte les fichiers distants qui sont des URL

  • Property svn:executable set to *
File size: 6.2 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 $id_document = intval($flux['args']['id_document'])
38                and autoriser('modifier', 'document', $id_document)
39                and $objet
40                and $id_objet
41        ) {
42                // bloc à recharger
43                $ajaxreload = !empty($flux['args']['ajaxreload']) ? $flux['args']['ajaxreload'] : '#documents';
44                // mini-formulaire
45                $form = recuperer_fond(
46                        'prive/squelettes/inclure/editer_roles_document',
47                        array(
48                                'id_document' => $id_document,
49                                'objet'       => $objet,
50                                'id_objet'    => $id_objet,
51                                'options'     => array(
52                                        'ajaxReload' => $ajaxreload,
53                                ),
54                        )
55                );
56                $texte = $form;
57        }
58
59        if ($texte) {
60                $flux['data'] .= $texte;
61        }
62
63        return $flux;
64}
65
66
67/**
68 * Synchroniser les champs "vu" et "rang_lien" lors de la création d'un nouveau lien de document portant un rôle.
69 *
70 * @pipeline post_edition_liens
71 *
72 * @param  array $flux Données du pipeline
73 * @return array       Données du pipeline
74 */
75function roles_documents_post_edition_lien($flux) {
76        if (
77                $flux['args']['action'] == 'insert'             // il s'agit d'une création de lien
78                and $flux['args']['objet_source'] == 'document' // on a affaire à un document
79                and isset($flux['args']['role'])
80                and $role = $flux['args']['role']
81                and strlen($role)                               // et il y a un role donné
82                and isset($flux['args']['colonne_role'])
83                and $colonne_role = $flux['args']['colonne_role']
84                and $id_document = intval($flux['args']['id_objet_source'])
85                and $objet = $flux['args']['objet']
86                and $id_objet = intval($flux['args']['id_objet'])
87        ) {
88                // le champ 'rang_lien' n'est présent qu'à partir de SPIP 3.2 (ou avec le plugin ordoc)
89                $champs_synchronises = array('vu', 'rang_lien');
90
91                $trouver_table = charger_fonction('trouver_table', 'base');
92                $desc = $trouver_table('spip_documents_liens');
93                $champs_presents = array_flip(array_intersect_key(array_flip($champs_synchronises), $desc['field']));
94
95                $qualifier = sql_fetsel(
96                        $champs_presents,
97                        'spip_documents_liens',
98                        array(
99                                'id_document=' . $id_document,
100                                'objet=' . sql_quote($objet),
101                                'id_objet=' . $id_objet,
102                                $colonne_role . '=' . sql_quote('document')
103                        )
104                );
105                if ($qualifier) {
106                        include_spip('action/editer_liens');
107                        objet_qualifier_liens(
108                                array('document' => $id_document),
109                                array($objet => $id_objet),
110                                array($colonne_role => $role) + $qualifier
111                        );
112                }
113        }
114
115        return $flux;
116}
117
118
119/**
120 * Après la modif d'un objet, synchroniser le vu de tous les document liés ayant un rôle
121 * avec celui du lien de base (ayant le rôle par défaut)
122 *
123 * @pipeline post_edition
124 *
125 * @param  array $flux Données du pipeline
126 * @return array       Données du pipeline
127 */
128function roles_documents_post_edition($flux) {
129        if (
130                isset($flux['args']['action'])
131                and $flux['args']['action'] == 'modifier'       // on modifie un objet
132                and $flux['args']['table'] !== 'spip_documents'  // mais pas un document
133                and $objet = $flux['args']['type']
134                and $id_objet = intval($flux['args']['id_objet'])
135        ) {
136                include_spip('action/editer_liens');
137
138                // on regarde s'il y a des documents liés à l'objet modifié
139                if (count($liens = objet_trouver_liens(array('document'=>'*'), array($objet=>$id_objet)))) {
140                        foreach ($liens as $l) {
141                                // on récupère le champ "vu" du lien avec le rôle par défaut
142                                $vu = sql_getfetsel(
143                                        'vu',
144                                        'spip_documents_liens',
145                                        'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .'
146                                                AND id_objet='.$id_objet .' AND role='.sql_quote('document')
147                                );
148                                // on met à jour tous les autres liens avec rôle
149                                sql_updateq(
150                                        'spip_documents_liens',
151                                        array('vu'=>$vu),
152                                        'id_document=' .$l['id_document'] .' AND objet='.sql_quote($objet) .'
153                                                AND id_objet='.$id_objet .' AND role!='.sql_quote('document')
154                                );
155                        }
156                }
157        }
158
159        return $flux;
160}
161
162
163/**
164 * Chercher le logo d'un ojet
165 *
166 * S'il n'y a pas de logo, on prend la 1ère image avec le rôle "logo"
167 *
168 * @pipeline quete_logo_objet
169 *
170 * @param  array $flux Données du pipeline
171 * @return array       Données du pipeline
172 */
173function roles_documents_quete_logo_objet($flux) {
174        // Si personne n'a trouvé de logo avant
175        if (empty($flux['data'])) {
176                // On cherche la première image avec un rôle "logo"
177                include_spip('base/abstract_sql');
178
179                // Quel rôle va-t-on chercher ?
180                if ($flux['args']['mode'] === 'on') {
181                        $role = 'logo';
182                } elseif ($flux['args']['mode'] === 'off') {
183                        $role = 'logo_survol';
184                } else {
185                        $role = $flux['args']['mode'];
186                }
187
188                if ($image = sql_fetsel(
189                        'fichier, extension',
190                        'spip_documents as d inner join spip_documents_liens as l on d.id_document = l.id_document',
191                        array(
192                                'l.objet = '.sql_quote($flux['args']['objet']),
193                                'l.id_objet = '.intval($flux['args']['id_objet']),
194                                sql_in('extension', array('png', 'jpg', 'gif')),
195                                'l.role='.sql_quote($role),
196                        ),
197                        '', //group
198                        '0+titre, titre'
199                )) {
200                        // Si c'est un URL on retourne le chemin directement
201                        if (filter_var($image['fichier'], FILTER_VALIDATE_URL)) {
202                                $chemin_complet = $image['fichier'];
203                        }
204                        // Sinon on va le chercher dans IMG
205                        else {
206                                $chemin_complet = _DIR_IMG . $image['fichier'];
207                        }
208
209                        $flux['data'] = array(
210                                'chemin' => $chemin_complet,
211                                'timestamp' => @filemtime($chemin_complet),
212                        );
213                }
214        }
215        return $flux;
216}
Note: See TracBrowser for help on using the repository browser.