Changeset 101184 in spip-zone


Ignore:
Timestamp:
Dec 18, 2016, 10:06:52 PM (3 years ago)
Author:
maieul@…
Message:

vider $_FILES[champ][int] si jamais il y a une erreur

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/branches/v3_dev/formulaires/formidable.php

    r101183 r101184  
    22
    33/**
    4  * Gestion de l'affichage et traitement d'un formulaire Formidable
    5  *
    6  * @package SPIP\Formidable\Formulaires
    7  **/
     4* Gestion de l'affichage et traitement d'un formulaire Formidable
     5*
     6* @package SPIP\Formidable\Formulaires
     7**/
    88
    99// Sécurité
    1010if (!defined('_ECRIRE_INC_VERSION')) {
    11         return;
     11return;
    1212}
    1313
     
    1616include_spip('base/abstract_sql');
    1717include_spip('inc/autoriser');
     18include_spip('plugins/installer');
    1819
    1920function formidable_id_formulaire($id) {
    20         // on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi
    21         // meme si entre temps on perds la base
    22         static $id_formulaires = array();
    23         if (isset($id_formulaires[$id])) {
    24                 return $id_formulaires[$id];
    25         }
    26 
    27         if (is_numeric($id)) {
    28                 $where = 'id_formulaire = ' . intval($id);
    29         } elseif (is_string($id)) {
    30                 $where = 'identifiant = ' . sql_quote($id);
    31         } else {
    32                 return 0;
    33         }
    34 
    35         $id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
    36 
    37         if ($id_formulaire
    38                 and !test_espace_prive()
    39                 and !objet_test_si_publie('formulaire', $id_formulaire)) {
    40                 return $id_formulaires[$id] = 0;
    41         }
    42 
    43         return $id_formulaires[$id] = $id_formulaire;
    44 }
    45 
    46 /**
    47  * Chargement du formulaire CVT de Formidable.
    48  *
    49  * Genere le formulaire dont l'identifiant (numerique ou texte est indique)
    50  *
    51  * @param int|string $id
    52  *     Identifiant numerique ou textuel du formulaire formidable
    53  * @param array $valeurs
    54  *     Valeurs par défauts passées au contexte du formulaire
    55  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
    56  * @param int|bool $id_formulaires_reponse
    57  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
    58  *
    59  * @return array
    60  *     Contexte envoyé au squelette HTML du formulaire.
    61  **/
     21// on utilise une static pour etre sur que si l'appel dans verifier() passe, celui dans traiter() passera aussi
     22// meme si entre temps on perds la base
     23static $id_formulaires = array();
     24if (isset($id_formulaires[$id])) {
     25        return $id_formulaires[$id];
     26}
     27
     28if (is_numeric($id)) {
     29        $where = 'id_formulaire = ' . intval($id);
     30} elseif (is_string($id)) {
     31        $where = 'identifiant = ' . sql_quote($id);
     32} else {
     33        return 0;
     34}
     35
     36$id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires', $where));
     37
     38if ($id_formulaire
     39        and !test_espace_prive()
     40        and !objet_test_si_publie('formulaire', $id_formulaire)) {
     41        return $id_formulaires[$id] = 0;
     42}
     43
     44return $id_formulaires[$id] = $id_formulaire;
     45}
     46
     47/**
     48* Chargement du formulaire CVT de Formidable.
     49*
     50* Genere le formulaire dont l'identifiant (numerique ou texte est indique)
     51*
     52* @param int|string $id
     53*     Identifiant numerique ou textuel du formulaire formidable
     54* @param array $valeurs
     55*     Valeurs par défauts passées au contexte du formulaire
     56*     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
     57* @param int|bool $id_formulaires_reponse
     58*     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
     59*
     60* @return array
     61*     Contexte envoyé au squelette HTML du formulaire.
     62**/
    6263function formulaires_formidable_charger($id, $valeurs = array(), $id_formulaires_reponse = false) {
    63         $contexte = array();
    64 
    65         // On peut donner soit un id soit un identifiant
    66         if (!$id_formulaire = formidable_id_formulaire($id)) {
    67                 return;
    68         }
    69 
    70         // On cherche si le formulaire existe
    71         if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
    72                 // On ajoute un point d'entrée avec les infos de ce formulaire
    73                 // pour d'eventuels plugins qui en ont l'utilité
    74                 $contexte['_formidable'] = $formulaire;
    75                
    76                 // Classes CSS
    77                 $contexte['_css'] = $formulaire['css'];
    78 
    79                 // Est-ce que la personne a le droit de répondre ?
    80                 if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) {
    81                         $saisies = unserialize($formulaire['saisies']);
    82                         $traitements = unserialize($formulaire['traitements']);
    83 
    84                         // Si on est en train de réafficher les valeurs postées,
    85                         // ne pas afficher les saisies hidden
    86                         if ($formulaire['apres'] == 'valeurs'
    87                                 and _request('formidable_afficher_apres') == 'valeurs'
    88                         ) {
    89                                 foreach ($saisies as $k => $saisie) {
    90                                         if (isset($saisie['saisie'])
    91                                                 and $saisie['saisie'] == 'hidden'
    92                                         ) {
    93                                                 unset($saisies[$k]);
     64$contexte = array();
     65
     66// On peut donner soit un id soit un identifiant
     67if (!$id_formulaire = formidable_id_formulaire($id)) {
     68        return;
     69}
     70
     71// On cherche si le formulaire existe
     72if ($formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire))) {
     73        // On ajoute un point d'entrée avec les infos de ce formulaire
     74        // pour d'eventuels plugins qui en ont l'utilité
     75        $contexte['_formidable'] = $formulaire;
     76       
     77        // Classes CSS
     78        $contexte['_css'] = $formulaire['css'];
     79
     80        // Est-ce que la personne a le droit de répondre ?
     81        if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire' => $formulaire))) {
     82                $saisies = unserialize($formulaire['saisies']);
     83                $traitements = unserialize($formulaire['traitements']);
     84
     85                // Si on est en train de réafficher les valeurs postées,
     86                // ne pas afficher les saisies hidden
     87                if ($formulaire['apres'] == 'valeurs'
     88                        and _request('formidable_afficher_apres') == 'valeurs'
     89                ) {
     90                        foreach ($saisies as $k => $saisie) {
     91                                if (isset($saisie['saisie'])
     92                                        and $saisie['saisie'] == 'hidden'
     93                                ) {
     94                                        unset($saisies[$k]);
     95                                }
     96                        }
     97                }
     98
     99                // On déclare les champs avec les valeurs par défaut
     100                $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
     101                $contexte['mechantrobot'] = '';
     102                // On ajoute le formulaire complet
     103                $contexte['_saisies'] = $saisies;
     104
     105                $contexte['id'] = $formulaire['id_formulaire'];
     106                $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="' . $contexte['id'] . '"/>';
     107
     108                // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
     109                if ($valeurs) {
     110                        // Si c'est une chaine on essaye de la parser
     111                        if (is_string($valeurs)) {
     112                                $liste = explode(',', $valeurs);
     113                                $liste = array_map('trim', $liste);
     114                                $valeurs = array();
     115                                foreach ($liste as $i => $cle_ou_valeur) {
     116                                        if ($i%2 == 0) {
     117                                                $valeurs[$liste[$i]] = $liste[$i+1];
    94118                                        }
    95119                                }
    96120                        }
    97121
    98                         // On déclare les champs avec les valeurs par défaut
    99                         $contexte = array_merge(saisies_lister_valeurs_defaut($saisies), $contexte);
    100                         $contexte['mechantrobot'] = '';
    101                         // On ajoute le formulaire complet
    102                         $contexte['_saisies'] = $saisies;
    103 
    104                         $contexte['id'] = $formulaire['id_formulaire'];
    105                         $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="' . $contexte['id'] . '"/>';
    106 
    107                         // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit
    108                         if ($valeurs) {
    109                                 // Si c'est une chaine on essaye de la parser
    110                                 if (is_string($valeurs)) {
    111                                         $liste = explode(',', $valeurs);
    112                                         $liste = array_map('trim', $liste);
    113                                         $valeurs = array();
    114                                         foreach ($liste as $i => $cle_ou_valeur) {
    115                                                 if ($i%2 == 0) {
    116                                                         $valeurs[$liste[$i]] = $liste[$i+1];
    117                                                 }
    118                                         }
    119                                 }
    120 
    121                                 // Si on a un tableau,
    122                                 // alors on écrase avec les valeurs données depuis l'appel
    123                                 if ($valeurs and is_array($valeurs)) {
    124                                         $contexte = array_merge($contexte, $valeurs);
    125                                 }
    126                         }
    127 
    128                         // Si on passe un identifiant de reponse, on edite cette reponse si elle existe
    129                         if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
     122                        // Si on a un tableau,
     123                        // alors on écrase avec les valeurs données depuis l'appel
     124                        if ($valeurs and is_array($valeurs)) {
     125                                $contexte = array_merge($contexte, $valeurs);
     126                        }
     127                }
     128
     129                // Si on passe un identifiant de reponse, on edite cette reponse si elle existe
     130                if ($id_formulaires_reponse = intval($id_formulaires_reponse)) {
     131                        $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
     132                        if ($ok == false) {
     133                                $contexte['editable'] = false;
     134                                $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
     135                        }
     136                } else {
     137                        // calcul des paramètres d'anonymisation
     138                        $options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
     139
     140                        $anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
     141                                ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
     142                                : '';
     143
     144                        // Si multiple = non mais que c'est modifiable, alors on va chercher
     145                        // la dernière réponse si elle existe
     146                        if ($options
     147                                and !$options['multiple']
     148                                and $options['modifiable']
     149                                and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
     150                        ) {
     151                                $id_formulaires_reponse = array_pop($reponses);
    130152                                $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
    131                                 if ($ok == false) {
    132                                         $contexte['editable'] = false;
    133                                         $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante');
    134                                 }
    135                         } else {
    136                                 // calcul des paramètres d'anonymisation
    137                                 $options = isset($traitements['enregistrement']) ? $traitements['enregistrement'] : null;
    138 
    139                                 $anonymisation = (isset($options['anonymiser']) && $options['anonymiser']==true)
    140                                         ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''
    141                                         : '';
    142 
    143                                 // Si multiple = non mais que c'est modifiable, alors on va chercher
    144                                 // la dernière réponse si elle existe
    145                                 if ($options
    146                                         and !$options['multiple']
    147                                         and $options['modifiable']
    148                                         and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation)
    149                                 ) {
    150                                         $id_formulaires_reponse = array_pop($reponses);
    151                                         $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
    152                                 }
    153                         }
    154                 } else {
    155                         $contexte['editable'] = false;
    156                         // le formulaire a déjà été répondu.
    157                         // peut être faut il afficher les statistiques des réponses
    158                         if ($formulaire['apres']=='stats') {
    159                                 // Nous sommes face à un sondage auquel on a déjà répondu !
    160                                 // On remplace complètement l'affichage du formulaire
    161                                 // par un affichage du résultat de sondage !
    162                                 $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
    163                                         'id_formulaire' => $formulaire['id_formulaire'],
    164                                 ));
    165                         } else {
    166                                 $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
    167153                        }
    168154                }
    169155        } else {
    170156                $contexte['editable'] = false;
    171                 $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
    172         }
    173         if (!isset($contexte['_hidden'])) {
    174                 $contexte['_hidden'] = '';
    175         }
    176         $contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas
    177 
    178         $contexte['formidable_afficher_apres'] = $formulaire['apres'];
    179 
    180         return $contexte;
    181 }
    182 
    183 
    184 /**
    185  * Vérification du formulaire CVT de Formidable.
    186  *
    187  * Pour chaque champ posté, effectue les vérifications demandées par
    188  * les saisies et retourne éventuellement les erreurs de saisie.
    189  *
    190  * @param int|string $id
    191  *     Identifiant numerique ou textuel du formulaire formidable
    192  * @param array $valeurs
    193  *     Valeurs par défauts passées au contexte du formulaire
    194  *     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
    195  * @param int|bool $id_formulaires_reponse
    196  *     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
    197  *
    198  * @return array
    199  *     Tableau des erreurs
    200  **/
     157                // le formulaire a déjà été répondu.
     158                // peut être faut il afficher les statistiques des réponses
     159                if ($formulaire['apres']=='stats') {
     160                        // Nous sommes face à un sondage auquel on a déjà répondu !
     161                        // On remplace complètement l'affichage du formulaire
     162                        // par un affichage du résultat de sondage !
     163                        $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array(
     164                                'id_formulaire' => $formulaire['id_formulaire'],
     165                        ));
     166                } else {
     167                        $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu');
     168                }
     169        }
     170} else {
     171        $contexte['editable'] = false;
     172        $contexte['message_erreur'] = _T('formidable:erreur_inexistant');
     173}
     174if (!isset($contexte['_hidden'])) {
     175        $contexte['_hidden'] = '';
     176}
     177$contexte['_hidden'] .= "\n" . '<input type="hidden" name="formidable_afficher_apres' /*.$formulaire['id_formulaire']*/ . '" value="' . $formulaire['apres'] . '"/>'; // marche pas
     178
     179$contexte['formidable_afficher_apres'] = $formulaire['apres'];
     180
     181return $contexte;
     182}
     183
     184
     185/**
     186* Vérification du formulaire CVT de Formidable.
     187*
     188* Pour chaque champ posté, effectue les vérifications demandées par
     189* les saisies et retourne éventuellement les erreurs de saisie.
     190*
     191* @param int|string $id
     192*     Identifiant numerique ou textuel du formulaire formidable
     193* @param array $valeurs
     194*     Valeurs par défauts passées au contexte du formulaire
     195*     Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli
     196* @param int|bool $id_formulaires_reponse
     197*     Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique
     198*
     199* @return array
     200*     Tableau des erreurs
     201**/
    201202function formulaires_formidable_verifier($id, $valeurs = array(), $id_formulaires_reponse = false) {
    202         $erreurs = array();
    203 
    204         // On peut donner soit un id soit un identifiant
    205         if (!$id_formulaire = formidable_id_formulaire($id)) {
    206                 $erreurs['message_erreur'] = _T('formidable:erreur_base');
    207         } else {
    208                 // Sale bête !
    209                 if (_request('mechantrobot')!='') {
    210                         $erreurs['hahahaha'] = 'hahahaha';
    211                         return $erreurs;
    212                 }
    213 
    214                 $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire));
    215                 $saisies = unserialize($formulaire['saisies']);
    216 
    217                 $erreurs = saisies_verifier($saisies);
     203$erreurs = array();
     204
     205// On peut donner soit un id soit un identifiant
     206if (!$id_formulaire = formidable_id_formulaire($id)) {
     207        $erreurs['message_erreur'] = _T('formidable:erreur_base');
     208} else {
     209        // Sale bête !
     210        if (_request('mechantrobot')!='') {
     211                $erreurs['hahahaha'] = 'hahahaha';
     212                return $erreurs;
     213        }
     214
     215        $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = ' . intval($id_formulaire));
     216        $saisies = unserialize($formulaire['saisies']);
     217
     218        $erreurs_par_fichier = array();
     219        $erreurs = saisies_verifier($saisies,true,$erreurs_par_fichier);
     220
     221        // On supprime de $_FILES les fichiers envoyés qui ne passent pas le test de vérification       
     222       
     223        //$infos_plugins = charger_fonction('infos_plugins','plugins');
     224        $plugins_actifs = liste_plugin_actifs();
     225        if (isset($plugins_actifs['CVTUPLOAD'])) {
     226                include_spip('inc/cvtupload');
     227                foreach ($erreurs as $champ => $erreur) {
     228                                cvtupload_nettoyer_files_selon_erreurs($champ, $erreurs_par_fichier[$champ]);
     229                                }
     230                }
    218231
    219232                // Si on a pas déjà une erreur sur le champ unicite, on lance une verification
Note: See TracChangeset for help on using the changeset viewer.