[PLUGINS] ~maj globale
[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
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('id_formulaire', 'spip_formulaires', 'identifiant='.sql_quote('form'.$r[3]));
48 } elseif ($r[2] == 'formulaire|formidable') {
49 $args = ltrim($r[4], '|');
50 $args = explode('=', $args);
51 $args = $args[1];
52 $args = explode('|', $args);
53 $args = trim(reset($args));
54 if (is_numeric($args)) {
55 $id_formulaire = intval($args);
56 } else {
57 $id_formulaire = sql_getfetsel('id_formulaire', 'spip_formulaires', 'identifiant='.sql_quote($args));
58 }
59 }
60 if ($id_formulaire = intval($id_formulaire)) {
61 $formulaires[$id_formulaire] = $id_formulaire;
62 }
63 }
64 }
65 return $formulaires;
66 }
67
68 /**
69 * Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
70 * @param $flux
71 * @return mixed
72 */
73 function formidable_post_edition($flux) {
74 if (isset($flux['args']['table'])
75 and $table = $flux['args']['table']
76 and $id_objet = intval($flux['args']['id_objet'])
77 and $primary = id_table_objet($table)
78 and $row = sql_fetsel('*', $table, "$primary=".intval($id_objet))
79 ) {
80 $objet = objet_type($table);
81 $contenu = implode(' ', $row);
82 $formulaires = formidable_trouve_liens($contenu);
83 include_spip('action/editer_liens');
84 $deja = objet_trouver_liens(array('formulaire' => '*'), array($objet => $id_objet));
85 $del = array();
86 if (count($deja)) {
87 foreach ($deja as $l) {
88 if (isset($formulaires[$l['id_formulaire']])) {
89 unset($formulaires[$l['id_formulaire']]);
90 } else {
91 $del[] = $l['id_formulaire'];
92 }
93 }
94 }
95 if (count($formulaires)) {
96 objet_associer(array('formulaire' => $formulaires), array($objet => $id_objet));
97 }
98 if (count($del)) {
99 objet_dissocier(array('formulaire' => $del), array($objet=>$id_objet));
100 }
101 }
102 return $flux;
103 }
104
105 /**
106 * Afficher les formulaires utilises par un objet
107 * @param $flux
108 * @return mixed
109 */
110 function formidable_affiche_droite($flux) {
111 if ($e = trouver_objet_exec($flux['args']['exec'])
112 and isset($e['type'])
113 and $objet = $e['type']
114 and isset($flux['args'][$e['id_table_objet']])
115 and $id = $flux['args'][$e['id_table_objet']]
116 and sql_countsel('spip_formulaires_liens', 'objet='.sql_quote($objet).' AND id_objet='.intval($id))) {
117 $flux['data'] .= recuperer_fond('prive/squelettes/inclure/formulaires_lies', array('objet' => $objet, 'id_objet' => $id));
118 }
119 return $flux;
120 }
121
122 /**
123 * Afficher l'édition des liens sur les objets configurés
124 **/
125 function formidable_affiche_milieu($flux) {
126 include_spip('inc/config');
127 $texte = "";
128 $e = trouver_objet_exec($flux['args']['exec']);
129
130 if (!$e['edition'] and in_array($e['table_objet_sql'], lire_config('formidable/analyse/objets', array()))) {
131 $texte .= recuperer_fond('prive/objets/editer/liens', array(
132 'table_source' => 'formulaires',
133 'objet' => $e['type'],
134 'id_objet' => $flux['args'][$e['id_table_objet']]
135 ));
136 }
137
138 if ($texte) {
139 if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
140 $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
141 }
142 else {
143 $flux['data'] .= $texte;
144 }
145 }
146
147 return $flux;
148 }
149
150 /**
151 * Optimiser la base de donnée en enlevant les liens de formulaires supprimés
152 *
153 * @pipeline optimiser_base_disparus
154 * @param array $flux
155 * Données du pipeline
156 * @return array
157 * Données du pipeline
158 */
159 function formidable_optimiser_base_disparus($flux) {
160 // Les formulaires qui sont à la poubelle
161 $res = sql_select(
162 'id_formulaire AS id',
163 'spip_formulaires',
164 'statut='.sql_quote('poubelle')
165 );
166
167 // On génère la suppression
168 $flux['data'] += optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
169
170
171 # les reponses qui sont associees a un formulaire inexistant
172 $res = sql_select(
173 'R.id_formulaire AS id',
174 'spip_formulaires_reponses AS R LEFT JOIN spip_formulaires AS F ON R.id_formulaire=F.id_formulaire',
175 'R.id_formulaire > 0 AND F.id_formulaire IS NULL'
176 );
177
178 $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
179
180
181 // Les réponses qui sont à la poubelle
182 $res = sql_select(
183 'id_formulaires_reponse AS id',
184 'spip_formulaires_reponses',
185 sql_in('statut', array('refuse', 'poubelle'))
186 );
187
188 // On génère la suppression
189 $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
190
191
192 // les champs des reponses associes a une reponse inexistante
193 $res = sql_select(
194 'C.id_formulaires_reponse AS id',
195 'spip_formulaires_reponses_champs AS C LEFT JOIN spip_formulaires_reponses AS R ON C.id_formulaires_reponse=R.id_formulaires_reponse',
196 'C.id_formulaires_reponse > 0 AND R.id_formulaires_reponse IS NULL'
197 );
198
199 $flux['data'] += optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);
200
201 //
202 // CNIL -- Informatique et libertes
203 //
204 // masquer le numero IP des vieilles réponses
205 //
206 ## date de reference = 4 mois
207 ## definir a 0 pour desactiver
208 ## même constante que pour les forums
209 if (!defined('_CNIL_PERIODE')) {
210 define('_CNIL_PERIODE', 3600*24*31*4);
211 }
212
213 if (_CNIL_PERIODE) {
214 $critere_cnil = 'date<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
215 . ' AND statut != "spam"'
216 . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
217 $c = sql_countsel('spip_formulaires_reponses', $critere_cnil);
218 if ($c>0) {
219 spip_log("CNIL: masquer IP de $c réponses anciennes à formidable");
220 sql_update('spip_formulaires_reponses', array('ip' => 'MD5(ip)'), $critere_cnil);
221 }
222 }
223
224 return $flux;
225 }