4 * Utilisation de pipelines
6 * @package SPIP\Formidable\Pipelines
10 if (!defined('_ECRIRE_INC_VERSION')) {
15 '_RACCOURCI_MODELE_FORMIDABLE',
16 '(<(formulaire\|formidable|formidable|form)' # <modele
18 .'([|](?:<[^<>]*>|[^>])*)?' # |arguments (y compris des tags <...>)
19 .'>)' # fin du modele >
20 .'\s*(<\/a>)?' # eventuel </a>
24 * Ajouter la protection NoSpam de base a formidable (jeton)
29 function formidable_nospam_lister_formulaires($formulaires) {
30 $formulaires[] = 'formidable';
35 * Trouver les liens <form
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) {
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);
52 $args = explode('|', $args);
53 $args = trim(reset($args));
54 if (is_numeric($args)) {
55 $id_formulaire = intval($args);
57 $id_formulaire = sql_getfetsel('id_formulaire', 'spip_formulaires', 'identifiant='.sql_quote($args));
60 if ($id_formulaire = intval($id_formulaire)) {
61 $formulaires[$id_formulaire] = $id_formulaire;
69 * Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
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))
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));
87 foreach ($deja as $l) {
88 if (isset($formulaires[$l['id_formulaire']])) {
89 unset($formulaires[$l['id_formulaire']]);
91 $del[] = $l['id_formulaire'];
95 if (count($formulaires)) {
96 objet_associer(array('formulaire' => $formulaires), array($objet => $id_objet));
99 objet_dissocier(array('formulaire' => $del), array($objet=>$id_objet));
106 * Afficher les formulaires utilises par un objet
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));
123 * Afficher l'édition des liens sur les objets configurés
125 function formidable_affiche_milieu($flux) {
126 include_spip('inc/config');
128 $e = trouver_objet_exec($flux['args']['exec']);
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']]
139 if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
140 $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
143 $flux['data'] .= $texte;
151 * Optimiser la base de donnée en enlevant les liens de formulaires supprimés
153 * @pipeline optimiser_base_disparus
155 * Données du pipeline
157 * Données du pipeline
159 function formidable_optimiser_base_disparus($flux) {
160 // Les formulaires qui sont à la poubelle
162 'id_formulaire AS id',
164 'statut='.sql_quote('poubelle')
167 // On génère la suppression
168 $flux['data'] +
= optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
171 # les reponses qui sont associees a un formulaire inexistant
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'
178 $flux['data'] +
= optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
181 // Les réponses qui sont à la poubelle
183 'id_formulaires_reponse AS id',
184 'spip_formulaires_reponses',
185 sql_in('statut', array('refuse', 'poubelle'))
188 // On génère la suppression
189 $flux['data'] +
= optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
192 // les champs des reponses associes a une reponse inexistante
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'
199 $flux['data'] +
= optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);
202 // CNIL -- Informatique et libertes
204 // masquer le numero IP des vieilles réponses
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);
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);
219 spip_log("CNIL: masquer IP de $c réponses anciennes à formidable");
220 sql_update('spip_formulaires_reponses', array('ip' => 'MD5(ip)'), $critere_cnil);