8c0080cf3bf8a067af6ba8c2259fe7c7dd7c5927
[lhc/web/www.git] / www / plugins / formidable / echanger / formulaire / forms.php
1 <?php
2
3 // Sécurité
4 if (!defined('_ECRIRE_INC_VERSION')) {
5 return;
6 }
7
8 // Importation d'un formulaire forms&table
9
10 function echanger_formulaire_forms_importer_dist($fichier) {
11 include_spip('inc/xml');
12 $arbre = spip_xml_load($fichier, false);
13
14 if ($arbre and is_array($arbre) and isset($arbre['forms'])) {
15 foreach ($arbre['forms'] as $forms) {
16 foreach ($forms['form'] as $form) {
17 $formulaire = array();
18 $form_source = array(
19 'id_form' => intval(trim(spip_xml_aplatit($form['id_form']))),
20 'titre' => trim(spip_xml_aplatit($form['titre'])),
21 'descriptif' => trim(spip_xml_aplatit($form['descriptif'])),
22 'texte' => trim(spip_xml_aplatit($form['texte'])),
23 'email' => unserialize(trim(spip_xml_aplatit($form['email']))),
24 'moderation' => trim(spip_xml_aplatit($form['moderation'])),
25 'modifiable' => trim(spip_xml_aplatit($form['modifiable'])),
26 'multiple' => trim(spip_xml_aplatit($form['multiple'])),
27 'champconfirm' => trim(spip_xml_aplatit($form['champconfirm'])),
28 );
29
30 // configurer le formulaire (titre etc)
31 forms_configure_formulaire($form_source, $formulaire);
32
33 // ajouter les champs de saisies
34 foreach ($form['fields'] as $fields) {
35 foreach ($fields['field'] as $field) {
36 $champ = array(
37 'champ'=>trim(spip_xml_aplatit($field['champ'])),
38 'titre'=>trim(spip_xml_aplatit($field['titre'])),
39 'type'=>trim(spip_xml_aplatit($field['type'])),
40 'obligatoire'=>trim(spip_xml_aplatit($field['obligatoire'])),
41 'taille'=>trim(spip_xml_aplatit($field['taille'])),
42 'extra_info'=>trim(spip_xml_aplatit($field['extra_info'])),
43 'aide'=>trim(spip_xml_aplatit($field['aide'])),
44 'saisie'=>trim(spip_xml_aplatit($field['saisie'])),
45 );
46
47 // Les choix pour les types select et multiple
48 if (isset($field['les_choix']) and is_array($field['les_choix'])) {
49 $champ['choix'] = array();
50 foreach ($field['les_choix'] as $les_choix) {
51 foreach ($les_choix['un_choix'] as $un_choix) {
52 $champ['choix'][] = array(
53 'choix'=>trim(spip_xml_aplatit($un_choix['choix'])),
54 'titre'=>trim(spip_xml_aplatit($un_choix['titre'])),
55 );
56 }
57 }
58 }
59
60 if ($saisie = forms_champ_vers_saisie($champ)) {
61 $formulaire['saisies'][] = $saisie;
62 }
63 }
64 }
65
66 // les traitements
67 forms_configure_traitement_formulaire($form_source, $formulaire);
68 $id_formulaire = forms_importe_en_base($formulaire);
69 }
70 }
71 }
72
73 if ($id_formulaire) {
74 return $id_formulaire;
75 } else {
76 return _T('formidable:erreur_importer_forms');
77 }
78 }
79
80 /**
81 * Importer le tableau $formulaire en base
82 * @param array $formulaire
83 * @return bool|int
84 */
85 function forms_importe_en_base($formulaire) {
86 include_spip('action/editer_formulaire');
87 // On insère un nouveau formulaire
88 // cas utilise par l'installation/import f&t
89 if (isset($formulaire['id_formulaire'])
90 and !sql_countsel('spip_formulaires', 'id_formulaire='.intval($formulaire['id_formulaire']))) {
91 $champs = array(
92 'id_formulaire' => $formulaire['id_formulaire'],
93 'statut' => 'prop',
94 'date_creation' => date('Y-m-d H:i:s'),
95 );
96 // Envoyer aux plugins
97 $champs = pipeline(
98 'pre_insertion',
99 array(
100 'args' => array(
101 'table' => 'spip_formulaires',
102 ),
103 'data' => $champs
104 )
105 );
106 $id_formulaire = sql_insertq('spip_formulaires', $champs);
107
108 pipeline(
109 'post_insertion',
110 array(
111 'args' => array(
112 'table' => 'spip_formulaires',
113 'id_objet' => $id_formulaire
114 ),
115 'data' => $champs
116 )
117 );
118 } else {
119 $id_formulaire = formulaire_inserer();
120 }
121
122 $formulaire['saisies'] = forms_regroupe_saisies_fieldset($formulaire['saisies']);
123
124 if (is_array($formulaire['saisies'])) {
125 $formulaire['saisies'] = serialize($formulaire['saisies']);
126 }
127 if (is_array($formulaire['traitements'])) {
128 $formulaire['traitements'] = serialize($formulaire['traitements']);
129 }
130
131 // si l'identifiant existe deja (multiples imports du meme form)
132 // le dater
133 if (sql_countsel('spip_formulaires', 'identifiant='.sql_quote($formulaire['identifiant']))) {
134 $formulaire['identifiant'] .= '_'.date('Ymd_His');
135 }
136
137 // Si ok on modifie les champs de base
138 if ($id_formulaire > 0
139 and !($erreur = formulaire_modifier($id_formulaire, $formulaire))) {
140 return $id_formulaire;
141 }
142
143 return false;
144 }
145
146 /**
147 * Configuration de l'objet formulaire formidable a partir du form f&t
148 * @param array $form
149 * @param array $formulaire
150 */
151 function forms_configure_formulaire($form, &$formulaire) {
152
153 // Le titre
154 $formulaire['titre'] = ($form['titre'] ? $form['titre'] : _T('info_sans_titre'));
155
156 // Generer un identifiant
157 // si id_form fourni, on s'en sert
158 if (isset($form['id_form'])) {
159 $formulaire['identifiant'] = 'form_import_'.$form['id_form'];
160 } else {
161 $formulaire['identifiant'] = 'form_import_'.preg_replace(',\W,', '_', strtolower($formulaire['titre']));
162 }
163
164 // Le descriptif
165 $formulaire['descriptif'] = (isset($form['descriptif']) ? $form['descriptif'] : '');
166
167 // Le message de retour si ok
168 $formulaire['message_retour'] = (isset($form['texte']) ? $form['texte'] : '');
169
170 if (!isset($formulaire['traitements'])) {
171 $formulaire['traitements'] = array();
172 }
173
174 if (!isset($formulaire['saisies'])) {
175 $formulaire['saisies'] = array();
176 }
177 }
178
179 /**
180 * Configurer les traitements
181 *
182 * @param array $form
183 * @param array $formulaire
184 */
185 function forms_configure_traitement_formulaire($form, &$formulaire) {
186 // Le traitement email
187 if ($form['champconfirm']) {
188 if (!isset($formulaire['traitements']['email'])) {
189 $formulaire['traitements']['email'] = array();
190 }
191 $formulaire['traitements']['email']['champ_courriel_destinataire_form'] = $form['champconfirm'];
192 }
193
194 // $form['email'] est possiblement serialize
195 if (is_string($form['email']) and $a=unserialize($form['email'])) {
196 $form['email'] = $a;
197 }
198 if (is_array($form['email'])) {
199 if ($email_defaut = $form['email']['defaut']) {
200 if (!isset($formulaire['traitements']['email'])) {
201 $formulaire['traitements']['email'] = array();
202 }
203 $formulaire['traitements']['email']['destinataires_plus'] = $email_defaut;
204 }
205
206 // TODO email route : feature qui n'existe pas dans formidable
207 if ($route = $form['email']['route']) {
208 }
209 }
210
211 // Le traitement enregistrement : toujours
212 $formulaire['traitements']['enregistrement'] = array(
213 'moderation' => ($form['moderation'] == 'priori') ? 'priori' : 'posteriori',
214 'modifiable' => ($form['modifiable'] == 'oui') ? 'on' : '',
215 'multiple' => ($form['multiple'] == 'non') ? '' : 'on'
216 );
217 }
218
219 /**
220 * On a genere un fieldset pour chaque separateur de f&t
221 * il faut le peupler avec les saisies qui le suivent
222 *
223 * @param array $saisies
224 * @return array
225 */
226 function forms_regroupe_saisies_fieldset($saisies) {
227 $s = array();
228 $ins = &$s;
229
230 foreach ($saisies as $k => $saisie) {
231 if ($saisie['saisie']=='fieldset') {
232 if (!isset($saisies[$k]['saisies'])) {
233 $saisies[$k]['saisies'] = array();
234 }
235 $ins = &$saisies[$k]['saisies'];
236 $s[] = &$saisies[$k];
237 } else {
238 $ins[] = &$saisies[$k];
239 }
240 }
241
242 return $s;
243 }
244
245 /**
246 * Transforme un champ f&t en Saisie
247 * @param array $champ
248 * string champ
249 * string titre
250 * string type
251 * string obligatoire
252 * string taille
253 * string aide
254 * string extra_info
255 * string saisie oui/non
256 * array choix
257 * string choix
258 * string titre
259 * @return array|bool
260 */
261 function forms_champ_vers_saisie($champ) {
262 // Le truc par défaut
263 $saisie = array(
264 'saisie' => 'input',
265 'options' => array('size'=>40)
266 );
267
268 // On essaye de traduire tous les types de champs
269 $type = $champ['type'];
270 switch ($type) {
271 case 'texte':
272 $saisie['saisie'] = 'textarea';
273 unset($saisie['options']['size']);
274 $saisie['options']['rows'] = 5;
275 $saisie['options']['cols'] = 40;
276 break;
277 case 'password':
278 $saisie['options']['type'] = 'password';
279 break;
280 case 'date':
281 $saisie['saisie'] = 'date';
282 $saisie['verifier'] = array(
283 'type' => 'date'
284 );
285 break;
286 case 'num':
287 case 'monnaie':
288 if (!isset($champ['taille']) or !intval($taille = $champ['taille'])) {
289 $saisie['verifier'] = array(
290 'type' => 'entier'
291 );
292 } else {
293 $saisie['verifier'] = array(
294 'type' => 'decimal'
295 );
296 $saisie['verifier']['options'] = array('nb_decimales' => $taille);
297 }
298 break;
299 case 'email':
300 $saisie['verifier'] = array(
301 'type' => 'email'
302 );
303 break;
304 case 'telephone':
305 $saisie['verifier'] = array(
306 'type' => 'telephone'
307 );
308 break;
309 case 'select':
310 unset($saisie['options']['size']);
311 $liste = $champ['extra_info'];
312 if ($liste == 'radio') {
313 $saisie['saisie'] = 'radio';
314 } else {
315 $saisie['saisie'] = 'selection';
316 }
317 break;
318 case 'multiple':
319 $saisie['saisie'] = 'checkbox';
320 unset($saisie['options']['size']);
321 break;
322 case 'mot':
323 $saisie['saisie'] = 'mot';
324 $saisie['options']['id_groupe'] = $champ['extra_info'];
325 unset($saisie['options']['size']);
326 break;
327 case 'textestatique':
328 $saisie['saisie'] = 'explication';
329 unset($saisie['options']['size']);
330 $saisie['options']['texte'] = $champ['titre'];
331 unset($champ['titre']);
332 unset($champ['aide']);
333 break;
334 case 'separateur':
335 $saisie['saisie'] = 'fieldset';
336 $saisie['saisies'] = array();
337 unset($saisie['options']['size']);
338 break;
339 case 'fichier':
340 // TODO saisie file NIY
341 $saisie = null;
342 break;
343 }
344
345 // On continue seulement si on a toujours une saisie
346 if (!$saisie) {
347 return false;
348 }
349
350 // Les choix pour les types select et multiple
351 if (isset($champ['choix']) and is_array($champ['choix'])) {
352 $saisie['options']['datas'] = array();
353 foreach ($champ['choix'] as $un_choix) {
354 $choix = $un_choix['choix'];
355 $titre = $un_choix['titre'];
356 $saisie['options']['datas'][$choix] = $titre;
357 }
358 }
359
360 // Le nom
361 $saisie['options']['nom'] = $champ['champ'];
362
363 // Le label
364 if (isset($champ['titre']) and $champ['titre']) {
365 $saisie['options']['label'] = $champ['titre'];
366 }
367
368 // Obligatoire
369 if (isset($champ['obligatoire']) and $champ['obligatoire'] == 'oui') {
370 $saisie['options']['obligatoire'] = 'on';
371 }
372
373 // Explication éventuelle
374 if (isset($champ['aide']) and $explication = $champ['aide']) {
375 $saisie['options']['explication'] = $explication;
376 }
377
378 if (isset($champ['saisie']) and $champ['saisie']=='non') {
379 $saisie['options']['disable'] = 'on';
380 // masquer en JS, fallback
381 $saisie['options']['afficher_si'] = 'false';
382 }
383
384 return $saisie;
385 }