[PLUGINS] ~maj des plugins
[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")) return;
11
12
13
14 define('_RACCOURCI_MODELE_FORMIDABLE',
15 '(<(formulaire\|formidable|formidable|form)' # <modele
16 .'([0-9]*)\s*' # id
17 .'([|](?:<[^<>]*>|[^>])*)?' # |arguments (y compris des tags <...>)
18 .'>)' # fin du modele >
19 .'\s*(<\/a>)?' # eventuel </a>
20 );
21
22 /**
23 * Trouver les liens <form
24 * @param $texte
25 * @return array
26 */
27 function formidable_trouve_liens($texte){
28 $formulaires = array();
29 if (preg_match_all(','._RACCOURCI_MODELE_FORMIDABLE.',ims', $texte, $regs, PREG_SET_ORDER)){
30 foreach ($regs as $r) {
31 $id_formulaire = 0;
32 if ($r[2]=="formidable")
33 $id_formulaire = $r[3];
34 elseif ($r[2]=="form")
35 $id_formulaire = sql_getfetsel("id_formulaire","spip_formulaires","identifiant=".sql_quote("form".$r[3]));
36 elseif ($r[2]=="formulaire|formidable"){
37 $args = ltrim($r[4],"|");
38 $args = explode("=",$args);
39 $args = $args[1];
40 $args = explode("|",$args);
41 $args = trim(reset($args));
42 if (is_numeric($args))
43 $id_formulaire = intval($args);
44 else
45 $id_formulaire = sql_getfetsel("id_formulaire","spip_formulaires","identifiant=".sql_quote($args));
46 }
47 if ($id_formulaire = intval($id_formulaire))
48 $formulaires[$id_formulaire] = $id_formulaire;
49 }
50 }
51 return $formulaires;
52 }
53
54 /**
55 * Associer/dissocier les formulaires a un objet qui les utilise (ou ne les utilise plus)
56 * @param $flux
57 * @return mixed
58 */
59 function formidable_post_edition($flux){
60 if ($table = $flux['args']['table']
61 AND $id_objet = intval($flux['args']['id_objet'])
62 AND $primary = id_table_objet($table)
63 AND $row = sql_fetsel("*",$table,"$primary=".intval($id_objet))){
64
65 $objet = objet_type($table);
66 $contenu = implode(' ',$row);
67 $formulaires = formidable_trouve_liens($contenu);
68 include_spip("action/editer_liens");
69 $deja = objet_trouver_liens(array("formulaire"=>"*"),array($objet=>$id_objet));
70 $del = array();
71 if (count($deja)){
72 foreach($deja as $l){
73 if (isset($formulaires[$l['id_formulaire']]))
74 unset($formulaires[$l['id_formulaire']]);
75 else
76 $del[] = $l['id_formulaire'];
77 }
78 }
79 if (count($formulaires)){
80 objet_associer(array("formulaire"=>$formulaires),array($objet=>$id_objet));
81 }
82 if (count($del)){
83 objet_dissocier(array("formulaire"=>$del),array($objet=>$id_objet));
84 }
85 }
86 return $flux;
87 }
88
89 /**
90 * Afficher les formulaires utilises par un objet
91 * @param $flux
92 * @return mixed
93 */
94 function formidable_affiche_droite($flux){
95 if ($e = trouver_objet_exec($flux['args']['exec'])
96 AND isset($e['type'])
97 AND $objet = $e['type']
98 AND isset($flux['args'][$e['id_table_objet']])
99 AND $id = $flux['args'][$e['id_table_objet']]
100 AND sql_countsel("spip_formulaires_liens","objet=".sql_quote($objet)." AND id_objet=".intval($id))){
101
102 $flux['data'] .= recuperer_fond('prive/squelettes/inclure/formulaires_lies',array('objet'=>$objet,'id_objet'=>$id));
103 }
104 return $flux;
105 }
106
107 /**
108 * Optimiser la base de donnée en enlevant les liens de formulaires supprimés
109 *
110 * @pipeline optimiser_base_disparus
111 * @param array $flux
112 * Données du pipeline
113 * @return array
114 * Données du pipeline
115 */
116 function formidable_optimiser_base_disparus($flux){
117 // Les formulaires qui sont à la poubelle
118 $res = sql_select(
119 'id_formulaire AS id',
120 'spip_formulaires',
121 'statut='.sql_quote('poubelle')
122 );
123
124 // On génère la suppression
125 $flux['data'] += optimiser_sansref('spip_formulaires', 'id_formulaire', $res);
126
127
128 # les reponses qui sont associees a un formulaire inexistant
129 $res = sql_select("R.id_formulaire AS id",
130 "spip_formulaires_reponses AS R
131 LEFT JOIN spip_formulaires AS F
132 ON R.id_formulaire=F.id_formulaire",
133 "R.id_formulaire > 0
134 AND F.id_formulaire IS NULL");
135
136 $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaire', $res);
137
138
139 // Les réponses qui sont à la poubelle
140 $res = sql_select(
141 'id_formulaires_reponse AS id',
142 'spip_formulaires_reponses',
143 sql_in('statut',array('refuse','poubelle'))
144 );
145
146 // On génère la suppression
147 $flux['data'] += optimiser_sansref('spip_formulaires_reponses', 'id_formulaires_reponse', $res);
148
149
150 // les champs des reponses associes a une reponse inexistante
151 $res = sql_select("C.id_formulaires_reponse AS id",
152 "spip_formulaires_reponses_champs AS C
153 LEFT JOIN spip_formulaires_reponses AS R
154 ON C.id_formulaires_reponse=R.id_formulaires_reponse",
155 "C.id_formulaires_reponse > 0
156 AND R.id_formulaires_reponse IS NULL");
157
158 $flux['data'] += optimiser_sansref('spip_formulaires_reponses_champs', 'id_formulaires_reponse', $res);
159
160 //
161 // CNIL -- Informatique et libertes
162 //
163 // masquer le numero IP des vieilles réponses
164 //
165 ## date de reference = 4 mois
166 ## definir a 0 pour desactiver
167 ## même constante que pour les forums
168 if (!defined('_CNIL_PERIODE')) {
169 define('_CNIL_PERIODE', 3600*24*31*4);
170 }
171
172 if (_CNIL_PERIODE) {
173 $critere_cnil = 'date<"'.date('Y-m-d', time()-_CNIL_PERIODE).'"'
174 . ' AND statut != "spam"'
175 . ' AND (ip LIKE "%.%" OR ip LIKE "%:%")'; # ipv4 ou ipv6
176 $c = sql_countsel('spip_formulaires_reponses', $critere_cnil);
177 if ($c>0) {
178 spip_log("CNIL: masquer IP de $c réponses anciennes à formidable");
179 sql_update('spip_formulaires_reponses', array('ip' => 'MD5(ip)'), $critere_cnil);
180 }
181 }
182
183 return $flux;
184 }
185
186 ?>