4 if (!defined('_ECRIRE_INC_VERSION')) {
8 // Importation d'un formulaire forms&table
10 function echanger_formulaire_forms_importer_dist($fichier) {
11 include_spip('inc/xml');
12 $arbre = spip_xml_load($fichier, false);
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();
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'])),
30 // configurer le formulaire (titre etc)
31 forms_configure_formulaire($form_source, $formulaire);
33 // ajouter les champs de saisies
34 foreach ($form['fields'] as $fields) {
35 foreach ($fields['field'] as $field) {
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'])),
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'])),
60 if ($saisie = forms_champ_vers_saisie($champ)) {
61 $formulaire['saisies'][] = $saisie;
67 forms_configure_traitement_formulaire($form_source, $formulaire);
68 $id_formulaire = forms_importe_en_base($formulaire);
74 return $id_formulaire;
76 return _T('formidable:erreur_importer_forms');
81 * Importer le tableau $formulaire en base
82 * @param array $formulaire
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']))) {
92 'id_formulaire' => $formulaire['id_formulaire'],
94 'date_creation' => date('Y-m-d H:i:s'),
96 // Envoyer aux plugins
101 'table' => 'spip_formulaires',
106 $id_formulaire = sql_insertq('spip_formulaires', $champs);
112 'table' => 'spip_formulaires',
113 'id_objet' => $id_formulaire
119 $id_formulaire = formulaire_inserer();
122 $formulaire['saisies'] = forms_regroupe_saisies_fieldset($formulaire['saisies']);
124 if (is_array($formulaire['saisies'])) {
125 $formulaire['saisies'] = serialize($formulaire['saisies']);
127 if (is_array($formulaire['traitements'])) {
128 $formulaire['traitements'] = serialize($formulaire['traitements']);
131 // si l'identifiant existe deja (multiples imports du meme form)
133 if (sql_countsel('spip_formulaires', 'identifiant='.sql_quote($formulaire['identifiant']))) {
134 $formulaire['identifiant'] .= '_'.date('Ymd_His');
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;
147 * Configuration de l'objet formulaire formidable a partir du form f&t
149 * @param array $formulaire
151 function forms_configure_formulaire($form, &$formulaire) {
154 $formulaire['titre'] = ($form['titre'] ?
$form['titre'] : _T('info_sans_titre'));
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'];
161 $formulaire['identifiant'] = 'form_import_'.preg_replace(',\W,', '_', strtolower($formulaire['titre']));
165 $formulaire['descriptif'] = (isset($form['descriptif']) ?
$form['descriptif'] : '');
167 // Le message de retour si ok
168 $formulaire['message_retour'] = (isset($form['texte']) ?
$form['texte'] : '');
170 if (!isset($formulaire['traitements'])) {
171 $formulaire['traitements'] = array();
174 if (!isset($formulaire['saisies'])) {
175 $formulaire['saisies'] = array();
180 * Configurer les traitements
183 * @param array $formulaire
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();
191 $formulaire['traitements']['email']['champ_courriel_destinataire_form'] = $form['champconfirm'];
194 // $form['email'] est possiblement serialize
195 if (is_string($form['email']) and $a=unserialize($form['email'])) {
198 if (is_array($form['email'])) {
199 if ($email_defaut = $form['email']['defaut']) {
200 if (!isset($formulaire['traitements']['email'])) {
201 $formulaire['traitements']['email'] = array();
203 $formulaire['traitements']['email']['destinataires_plus'] = $email_defaut;
206 // TODO email route : feature qui n'existe pas dans formidable
207 if ($route = $form['email']['route']) {
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'
220 * On a genere un fieldset pour chaque separateur de f&t
221 * il faut le peupler avec les saisies qui le suivent
223 * @param array $saisies
226 function forms_regroupe_saisies_fieldset($saisies) {
230 foreach ($saisies as $k => $saisie) {
231 if ($saisie['saisie']=='fieldset') {
232 if (!isset($saisies[$k]['saisies'])) {
233 $saisies[$k]['saisies'] = array();
235 $ins = &$saisies[$k]['saisies'];
236 $s[] = &$saisies[$k];
238 $ins[] = &$saisies[$k];
246 * Transforme un champ f&t en Saisie
247 * @param array $champ
255 * string saisie oui/non
261 function forms_champ_vers_saisie($champ) {
262 // Le truc par défaut
265 'options' => array('size'=>40)
268 // On essaye de traduire tous les types de champs
269 $type = $champ['type'];
272 $saisie['saisie'] = 'textarea';
273 unset($saisie['options']['size']);
274 $saisie['options']['rows'] = 5;
275 $saisie['options']['cols'] = 40;
278 $saisie['options']['type'] = 'password';
281 $saisie['saisie'] = 'date';
282 $saisie['verifier'] = array(
288 if (!isset($champ['taille']) or !intval($taille = $champ['taille'])) {
289 $saisie['verifier'] = array(
293 $saisie['verifier'] = array(
296 $saisie['verifier']['options'] = array('nb_decimales' => $taille);
300 $saisie['verifier'] = array(
305 $saisie['verifier'] = array(
306 'type' => 'telephone'
310 unset($saisie['options']['size']);
311 $liste = $champ['extra_info'];
312 if ($liste == 'radio') {
313 $saisie['saisie'] = 'radio';
315 $saisie['saisie'] = 'selection';
319 $saisie['saisie'] = 'checkbox';
320 unset($saisie['options']['size']);
323 $saisie['saisie'] = 'mot';
324 $saisie['options']['id_groupe'] = $champ['extra_info'];
325 unset($saisie['options']['size']);
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']);
335 $saisie['saisie'] = 'fieldset';
336 $saisie['saisies'] = array();
337 unset($saisie['options']['size']);
340 // TODO saisie file NIY
345 // On continue seulement si on a toujours une saisie
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;
361 $saisie['options']['nom'] = $champ['champ'];
364 if (isset($champ['titre']) and $champ['titre']) {
365 $saisie['options']['label'] = $champ['titre'];
369 if (isset($champ['obligatoire']) and $champ['obligatoire'] == 'oui') {
370 $saisie['options']['obligatoire'] = 'on';
373 // Explication éventuelle
374 if (isset($champ['aide']) and $explication = $champ['aide']) {
375 $saisie['options']['explication'] = $explication;
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';