source: spip-zone/_plugins_/formitable/traiter/table.php @ 49235

Last change on this file since 49235 was 49235, checked in by jluc@…, 10 years ago

Mise au point du portage sous forme de plugin.

File size: 6.2 KB
Line 
1<?php
2// Auteur : JLuc
3//
4//
5// - Paramétrage du traitement =
6//              * spécification de la table destinataire pour le formulaire
7//              * correspondance des champs entre formulaire et table
8//              sous la forme d'une suite de couples champform1|champtable
9// - Enregistrement des valeurs saisies dans la table utilisateur
10//
11// Notes techniques :
12// La gestion des "modification de réponses existantes" est une dupplication 
13// de cette partie du traitement 'enregistrement'.
14// Ce serait bien de mutualiser le code et la config en sortant cette partie des traitements.
15
16// Sécurité
17if (!defined("_ECRIRE_INC_VERSION")) return;
18
19// convertir le format des dates issu de formidable à un format SQL de type DATE
20function traitement_date_fr_vers_sql ($date) {
21        sscanf ($date, "%2d/%2d/%4d%s",$jour,$mois,$an,$s);
22        return "$an-$mois-$jour";
23};
24
25// Exemples :
26// - $valeur : valeur renvoyée par la saisie
27// - $table : table SQL utilisateur destinatrice des données
28// - $champ : champ de la table SQL
29// - $nom : id de l'input dans le formulaire généré par spip
30//
31// function traitement_champ_bateau_couleur ($valeur, $table, $champ, $nom)
32// function traitement_champ_date_debut ($valeur, $table, $champ, $nom)
33// function traitement_champ_evenement_date_debut ($valeur, $table, $champ, $nom)
34// function traitement_champ ($valeur, $table, $nom)
35
36function traitement_champ_naissance ($valeur, $table, $champ, $nom) {
37        return traitement_date_fr_vers_sql($valeur);
38};
39
40/* exemple d'usage :
41function traitement_champ ($valeur, $table, $champ, $nom) {
42        // Toutes les saisies DATES sont stockées dans un format un champt de type DATE
43        if (strpos($nom,'date')===0) {
44                $valeur = traitement_date_fr_vers_sql($valeur);
45                echo "<br>Reçu date fr et convertit vers SQL = $valeur";
46        };
47        return $valeur;
48}; */
49
50function traiter_table_dist($args, $retours){
51        include_spip('inc/formidable');
52        include_spip('base/abstract_sql');
53        $options = $args['options'];
54
55        $table_destinataire = $options['table_destinataire'];
56        $correspondance_champs_formulaire_table = $options['correspondance_champs_formulaire_table'];
57        $correspondance_champs_formulaire_table = saisies_chaine2tableau($correspondance_champs_formulaire_table);
58
59        $formulaire = $args['formulaire'];
60        $id_formulaire = intval($formulaire['id_formulaire']);
61        $saisies = unserialize($formulaire['saisies']);
62        $saisies = saisies_lister_par_nom($saisies);
63
64        // La personne a-t-elle un compte ?
65        global $auteur_session;
66        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
67
68        // On cherche le cookie et sinon on le crée
69        $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
70        if (isset($_COOKIE[$nom_cookie]))
71                $cookie = $_COOKIE[$nom_cookie];
72        else {
73                include_spip("inc/acces");
74                $cookie = creer_uniqid();
75        }
76       
77        // On regarde si c'est une modif d'une réponse existante
78        $modif_reponse = 
79                $id_formulaires_reponse 
80                        = intval(_request('deja_enregistre_'.$id_formulaire));
81
82        // Si la moderation est a posteriori ou que la personne est un boss, on publie direct
83        if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie')))
84                $statut='publie';
85        else
86                $statut = 'prop';
87
88        // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse
89        if (!$id_formulaires_reponse){
90                $id_formulaires_reponse = sql_insertq(
91                        'spip_formulaires_reponses',
92                        array(
93                                'id_formulaire' => $id_formulaire,
94                                'id_auteur' => $id_auteur,
95                                'cookie' => $cookie,
96                                'ip' => $GLOBALS['ip'],
97                                'date' => 'NOW()',
98                                'statut' => $statut
99                        )
100                );
101
102                // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie
103                if (!$options['multiple'] or $options['modifiable']){
104                        include_spip("inc/cookie");
105                        // Expiration dans 30 jours
106                        spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600);
107                }
108        }
109
110        // Si l'id n'a pas été créé correctement alors erreur
111        if (!($id_formulaires_reponse > 0)){
112                $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base');
113        }
114        // Sinon on continue à mettre à jour
115        else {
116                $champs = array();
117                $insertions = array();
118                foreach($saisies as $nom => $saisie){
119                        // On ne prend que les champs qui ont effectivement été envoyés par le formulaire
120                        if (($valeur = _request($nom)) !== null){
121                                $champs[] = $nom;
122                                if (isset ($correspondance_champs_formulaire_table[$nom]))
123                                        $colname = $correspondance_champs_formulaire_table[$nom];
124                                else {
125                                        $retours['message_erreur'] .= "\n<br/>Erreur : le champ du formulaire ".$nom."n'a pas de correspondance déclarée dans la table utilisateur";
126                                        break;
127                                };
128
129                                echo "nom=$nom saisie=$saisie col=$colname valeur=$valeur<br>";
130
131                                // traitements des valeurs avant enregistrement : fonction de la table destinataire et du champ destination
132                                if (function_exists($f = 'traitement_champ_'.$table_destinataire.'_'.$colname) 
133                                        OR function_exists($f = 'traitement_champ_'.$colname)
134                                        OR function_exists($f = 'traitement_champ'))
135                                        $valeur = $f($valeur, $table_destinataire, $colname, $nom);
136
137                        $inserts[$colname] = (is_array($valeur) ? serialize($valeur) : $valeur);
138                        }
139                }
140                if ($modif_reponse) // On modifie l'enregistrement trouvé
141                        $inserts['id_formulaires_reponse'] = $id_formulaires_reponse;
142
143                // S'il y a bien des choses à modifier
144                if ($champs) {
145//                      if ($modif_reponse)
146//                              sql_updateq ($table_destinataire, $inserts);
147//                      else
148                        // On insère les nouvelles valeurs
149                        $id= sql_insertq ($table_destinataire, $inserts);
150
151                        echo "sql_insertq ($table_destinataire, <pre>".print_r($inserts,1)."</pre>)";
152                        if (!$id)       
153                                $retours['message_erreur'] .= "\n<br/>Erreur : l'insertion dans la table ($table_destinataire) ne se fait pas bien.".sql_error()."<pre class='reponse_formulaire_erreur'>".print_r($inserts,1)."</pre>";
154                };
155        }
156
157        return $retours;
158}
159
160function traiter_table_update_dist($id_formulaire, $traitement, $saisies_anciennes, $saisies_nouvelles){
161        // Si des champs ont été supprimés, il faut supprimer les réponses à ces champs
162        // il faut supprimer les colonnes de la table
163        // mais cela se régle en dehors de formidable
164        // et mettre à jour la table de correspondance
165        // mais le plugin ne fait pas de vérification au moment du changement.
166}
167
168?>
169
Note: See TracBrowser for help on using the repository browser.