source: spip-zone/_plugins_/formidable/trunk/formidable_pipelines.php

Last change on this file was 103140, checked in by maieul@…, 16 months ago

pouvoir effacer régulièrement les réponses d'un formulaire. Évite de conserver plus qu'il ne faut des données potentiellement privées

File size: 8.0 KB
Line 
1<?php
2
3/**
4 * Utilisation de pipelines
5 *
6 * @package SPIP\Formidable\Pipelines
7**/
8
9// Sécurité
10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
13include_spip('inc/formidable_fichiers');
14define(
15        '_RACCOURCI_MODELE_FORMIDABLE',
16        '(<(formulaire\|formidable|formidable|form)' # <modele
17        .'([0-9]*)\s*' # id
18        .'([|](?:<[^<>]*>|[^>])*)?' # |arguments (y compris des tags <...>)
19        .'>)' # fin du modele >
20        .'\s*(<\/a>)?' # eventuel </a>
21);
22
23/**
24 * Ajouter la protection NoSpam de base a formidable (jeton)
25 *
26 * @param $formulaires
27 * @return array
28 */
29function formidable_nospam_lister_formulaires($formulaires) {
30        $formulaires[] = 'formidable';
31        return $formulaires;
32}
33
34/**
35 * Trouver les liens <form
36 * @param $texte
37 * @return array
38 */
39function formidable_trouve_liens($texte) {
40        $formulaires = array();
41        if (preg_match_all(','._RACCOURCI_MODELE_FORMIDABLE.',ims', $texte, $regs, PREG_SET_ORDER)) {
42                foreach ($regs as $r) {
43                        $id_formulaire = 0;
44                        if ($r[2] == 'formidable') {
45                                $id_formulaire = $r[3];
46                        } elseif ($r[2] == 'form') {
47                                $id_formulaire = sql_getfetsel(
48                                        'id_formulaire',
49                                        'spip_formulaires',
50                                        'identifiant='.sql_quote('form'.$r[3])
51                                );
52                        } elseif ($r[2] == 'formulaire|formidable') {
53                                $args = ltrim($r[4], '|');
54                                $args = explode('=', $args);
55                                $args = $args[1];
56                                $args = explode('|', $args);
57                                $args = trim(reset($args));
58                                if (is_numeric($args)) {
59                                        $id_formulaire = intval($args);
60                                } else {
61                                        $id_formulaire = sql_getfetsel(
62                                                'id_formulaire',
63                                                'spip_formulaires',
64                                                'identifiant='.sql_quote($args)
65                                        );
66                                }
67                        }
68                        if ($id_formulaire = intval($id_formulaire)) {
69                                $formulaires[$id_formulaire] = $id_formulaire;
70                        }
71                }
72        }
73        return $formulaires;
74}
75
76/**
77 * Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
78 * @param $flux
79 * @return mixed
80 */
81function formidable_post_edition($flux) {
82        if (isset($flux['args']['table'])
83                and $table = $flux['args']['table']
84                and $id_objet = intval($flux['args']['id_objet'])
85                and $primary = id_table_objet($table)
86                and $row = sql_fetsel('*', $table, "$primary=".intval($id_objet))
87        ) {
88                $objet = objet_type($table);
89                $contenu = implode(' ', $row);
90                $formulaires = formidable_trouve_liens($contenu);
91                include_spip('action/editer_liens');
92                $deja = objet_trouver_liens(array('formulaire' => '*'), array($objet => $id_objet));
93                $del = array();
94                if (count($deja)) {
95                        foreach ($deja as $l) {
96                                if (isset($formulaires[$l['id_formulaire']])) {
97                                        unset($formulaires[$l['id_formulaire']]);
98                                } else {
99                                        $del[] = $l['id_formulaire'];
100                                }
101                        }
102                }
103                if (count($formulaires)) {
104                        objet_associer(array('formulaire' => $formulaires), array($objet => $id_objet));
105                }
106                if (count($del)) {
107                        objet_dissocier(array('formulaire' => $del), array($objet=>$id_objet));
108                }
109        }
110        return $flux;
111}
112
113/**
114 * Afficher les formulaires utilises par un objet
115 * @param $flux
116 * @return mixed
117 */
118function formidable_affiche_droite($flux) {
119        if ($e = trouver_objet_exec($flux['args']['exec'])
120                and isset($e['type'])
121                and $objet = $e['type']
122                and isset($flux['args'][$e['id_table_objet']])
123                and $id = $flux['args'][$e['id_table_objet']]
124                and sql_countsel('spip_formulaires_liens', 'objet='.sql_quote($objet).' AND id_objet='.intval($id))) {
125                $flux['data'] .= recuperer_fond(
126                        'prive/squelettes/inclure/formulaires_lies',
127                        array('objet' => $objet, 'id_objet' => $id)
128                );
129        }
130        return $flux;
131}
132
133/**
134 * Afficher l'édition des liens sur les objets configurés
135 **/
136function formidable_affiche_milieu($flux) {
137        include_spip('inc/config');
138        $texte = '';
139        $e = trouver_objet_exec($flux['args']['exec']);
140
141        if (!$e['edition'] and in_array($e['table_objet_sql'], lire_config('formidable/analyse/objets', array()))) {
142                $texte .= recuperer_fond('prive/objets/editer/liens', array(
143                        'table_source' => 'formulaires',
144                        'objet' => $e['type'],
145                        'id_objet' => $flux['args'][$e['id_table_objet']]
146                ));
147        }
148
149        if ($texte) {
150                if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
151                        $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
152                } else {
153                        $flux['data'] .= $texte;
154                }
155        }
156
157        return $flux;
158}
159
160/**
161 * Optimiser la base de donnée en enlevant les liens de formulaires supprimés
162 *
163 * @pipeline optimiser_base_disparus
164 * @param array $flux
165 *     Données du pipeline
166 * @return array
167 *     Données du pipeline
168 */
169function formidable_optimiser_base_disparus($flux) {
170        // Les formulaires qui sont à la poubelle
171        $res = sql_select(
172                'id_formulaire AS id',
173                'spip_formulaires',
174                'statut='.sql_quote('poubelle')
175        );
176        $res2 = sql_select(
177                'id_formulaire AS id',
178                'spip_formulaires',
179                'statut='.sql_quote('poubelle')
180        );//Copie pour supprimer les fichiers
181
182        // On génère la suppression
183        $flux['data'] += optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
184
185        while ($reponse = sql_fetch($res2)) {
186                $flux['data'] += formidable_effacer_fichiers_formulaire($reponse['id']);
187        }
188
189        // les reponses qui sont associees a un formulaire inexistant
190        $res = sql_select(
191                'R.id_formulaire AS id',
192                'spip_formulaires_reponses AS R LEFT JOIN spip_formulaires AS F ON R.id_formulaire=F.id_formulaire',
193                'R.id_formulaire > 0 AND F.id_formulaire IS NULL'
194        );
195
196        $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
197
198        // Les réponses qui sont à la poubelle
199        $res = sql_select(
200                'id_formulaires_reponse AS id, id_formulaire AS form',
201                'spip_formulaires_reponses',
202                'statut='.sql_quote('poubelle')
203        );
204        $res2 = sql_select(
205                'id_formulaires_reponse AS id, id_formulaire AS form',
206                'spip_formulaires_reponses',
207                sql_in('statut', array('refuse', 'poubelle'))
208        );      //Copie pour la suppression des fichiers des réponses, c'est idiot de pas pouvoir faire une seule requete
209        // On génère la suppression
210        $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
211        while ($reponse = sql_fetch($res2)) {
212                $flux['data'] += formidable_effacer_fichiers_reponse($reponse['form'], $reponse['id']);
213        }
214
215
216        // les champs des reponses associes a une reponse inexistante
217        $res = sql_select(
218                'C.id_formulaires_reponse AS id',
219                'spip_formulaires_reponses_champs AS C
220                        LEFT JOIN spip_formulaires_reponses AS R ON C.id_formulaires_reponse=R.id_formulaires_reponse',
221                'C.id_formulaires_reponse > 0 AND R.id_formulaires_reponse IS NULL'
222        );
223
224        $flux['data'] += optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);
225
226        return $flux;
227}
228
229/**
230 * S'assurer que le traitement email ait lieu après le traitement enregistrement
231 *
232 * @pipeline formidable_traitements
233 * @param array $flux
234 * @return array $flux
235 **/
236function formidable_formidable_traitements($flux) {
237        if (isset($flux['data']['email']) and isset($flux['data']['enregistrement'])) {
238                $keys = array_keys($flux['data']);
239                $position_email = array_search('email', $keys);
240                $position_enregistrement = array_search('enregistrement', $keys);
241
242                if ($position_enregistrement > $position_email) { // si enregistrement après email
243                        $nouveau_tab = array();
244                        foreach ($keys as $key) { //on reconstruit le tableau, en inversant simplement email et enregistrement
245                                if ($key == 'email') {
246                                        $nouveau_tab['enregistrement'] = $flux['data']['enregistrement'];
247                                } elseif ($key == 'enregistrement') {
248                                        $nouveau_tab['email'] = $flux['data']['email'];
249                                } else {
250                                        $nouveau_tab[$key] = $flux['data'][$key];
251                                }
252                        }
253                        $flux['data'] = $nouveau_tab;
254                }
255        }
256
257        return $flux;
258}
259
260/** Hasher les ip régulièrement
261 *  @param array $flux
262 *  @return array $flux
263**/
264function formidable_taches_generales_cron($flux) {
265        $flux['formidable_hasher_ip'] = 24*3600;
266        $flux['formidable_effacer_fichiers_email'] = 24*3600;
267        $flux['formidable_effacer_enregistrements'] = 24*3600;
268        return $flux;
269}
270
271/** Déclarer les formulaires et les réponses
272 * au plugin corbeille
273 * @param array $flux;
274 * @return array $flux;
275**/
276function formidable_corbeille_table_infos($flux) {
277        $flux['formulaires']= array(
278                'statut'=>'poubelle',
279                'table'=>'formulaires',
280                'tableliee'=>array('spip_formulaires_liens')
281        );
282        $flux['formulaires_reponses']= array(
283                'statut'=>'poubelle',
284                'table'=>'formulaires_reponses'
285        );
286        return $flux;
287}
Note: See TracBrowser for help on using the repository browser.