[CSS] +fix page header and title color
[lhc/web/www.git] / www / plugins / formidable / formidable_pipelines.php
1 <?php
2
3 /**
4 * Utilisation de pipelines
5 *
6 * @package SPIP\Formidable\Pipelines
7 **/
8
9 // Sécurité
10 if (!defined('_ECRIRE_INC_VERSION')) {
11 return;
12 }
13 include_spip('inc/formidable_fichiers');
14 define(
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 */
29 function 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 */
39 function 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 */
81 function 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 */
118 function 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 **/
136 function 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 */
169 function 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 **/
236 function 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 **/
264 function 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 **/
276 function 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 }