diff --git a/.gitattributes b/.gitattributes index 23020f5263f383c17a8eff9d918124fe889df62f..75551890c8ecfed80deefb7e4ff0ec8c865f768e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -82,7 +82,6 @@ prive/squelettes/contenu/formulaires_reponse.html -text prive/squelettes/contenu/formulaires_reponses.html -text prive/squelettes/extra/formulaire.html -text prive/squelettes/extra/formulaire_edit.html -text -prive/squelettes/extra/formulaires_analyse.html -text prive/squelettes/extra/formulaires_reponses.html -text prive/squelettes/hierarchie/formulaire.html -text prive/squelettes/hierarchie/formulaire_edit.html -text diff --git a/formidable_autorisations.php b/formidable_autorisations.php index 3df4f4a933245e1af48245caab3ad41e21f3d869..6443c031027cbb4430c2d587fc3567ad05404ddd 100644 --- a/formidable_autorisations.php +++ b/formidable_autorisations.php @@ -2,7 +2,7 @@ /** * Déclaration des autorisations - * + * * @package SPIP\Formidable\Autorisations **/ @@ -28,9 +28,7 @@ function formidable_autoriser(){} * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt){ - if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and - (!$qui['restreint']) or $GLOBALS['formulaires']['autoriser_admin_restreint']) - return true; + if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true; else return false; } @@ -47,8 +45,8 @@ function autoriser_formulaire_editer_dist($faire, $type, $id, $qui, $opt){ * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaires_menu_dist($faire, $type, $id, $qui, $opt){ - if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true; - else return false; + if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true; + else return false; } @@ -70,38 +68,38 @@ function autoriser_formulaires_menu_dist($faire, $type, $id, $qui, $opt){ * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt){ - // On regarde si il y a déjà le formulaire dans les options - if (isset($options['formulaire'])) - $formulaire = $options['formulaire']; - // Sinon on va le chercher - else{ - $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id); - } - - $traitements = unserialize($formulaire['traitements']); - - // S'il n'y a pas d'enregistrement, c'est forcément bon - if (!($options = $traitements['enregistrement'])) - return true; - // Sinon faut voir les options - else{ - // Si multiple = oui c'est bon - if ($options['multiple']) - return true; - else{ - // Si c'est modifiable, c'est bon - if ($options['modifiable']) - return true; - else{ - include_spip('inc/formidable'); - // Si la personne n'a jamais répondu, c'est bon - if (!formidable_verifier_reponse_formulaire($id)) - return true; - else - return false; - } - } - } + // On regarde si il y a déjà le formulaire dans les options + if (isset($options['formulaire'])) + $formulaire = $options['formulaire']; + // Sinon on va le chercher + else{ + $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id); + } + + $traitements = unserialize($formulaire['traitements']); + + // S'il n'y a pas d'enregistrement, c'est forcément bon + if (!($options = $traitements['enregistrement'])) + return true; + // Sinon faut voir les options + else{ + // Si multiple = oui c'est bon + if ($options['multiple']) + return true; + else{ + // Si c'est modifiable, c'est bon + if ($options['modifiable']) + return true; + else{ + include_spip('inc/formidable'); + // Si la personne n'a jamais répondu, c'est bon + if (!formidable_verifier_reponse_formulaire($id, $options['identification'])) + return true; + else + return false; + } + } + } } @@ -118,8 +116,8 @@ function autoriser_formulaire_repondre_dist($faire, $type, $id, $qui, $opt){ * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaires_reponse_instituer_dist($faire, $type, $id, $qui, $opt){ - if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true; - else return false; + if (isset($qui['statut']) and $qui['statut'] <= '0minirezo' and !$qui['restreint']) return true; + else return false; } /** @@ -135,8 +133,8 @@ function autoriser_formulaires_reponse_instituer_dist($faire, $type, $id, $qui, * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaires_reponse_voir_dist($faire, $type, $id, $qui, $opt){ - if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true; - else return false; + if (isset($qui['statut']) and $qui['statut'] <= '1comite') return true; + else return false; } /** @@ -152,11 +150,11 @@ function autoriser_formulaires_reponse_voir_dist($faire, $type, $id, $qui, $opt) * @return bool true s'il a le droit, false sinon **/ function autoriser_formulaires_reponse_supprimer_dist($faire, $type, $id, $qui, $opt){ - // On récupère l'id du formulaire - if ($id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', $id))) - return autoriser('editer', 'formulaire', $id_formulaire); - else - return false; + // On récupère l'id du formulaire + if ($id_formulaire = intval(sql_getfetsel('id_formulaire', 'spip_formulaires_reponses', $id))) + return autoriser('editer', 'formulaire', $id_formulaire); + else + return false; } ?> diff --git a/formidable_options.php b/formidable_options.php index b7ffd1a0d40c711857efc8a852180e7c55b771c3..d46c5262a2f6e2e6f93b894d9e4c9cf72a72cc2f 100644 --- a/formidable_options.php +++ b/formidable_options.php @@ -11,108 +11,97 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // On déclare le formulaire pour éditer un formulaire $GLOBALS['formulaires']['editer_formulaire'] = array( - array( - 'saisie' => 'input', - 'options' => array( - 'nom' => 'titre', - 'label' => '<:formidable:editer_titre:>', - 'obligatoire' => 'oui', - 'class' => 'multilang' - ) - ), - array( - 'saisie' => 'input', - 'options' => array( - 'nom' => 'identifiant', - 'label' => '<:formidable:editer_identifiant:>', - 'explication' => '<:formidable:editer_identifiant_explication:>', - 'obligatoire' => 'oui' - ), - 'verifier' => array( - 'type' => 'regex', - 'options' => array( - 'modele' => '/^[\w]+$/' - ) - ) - ), - array( - 'saisie' => 'textarea', - 'options' => array( - 'nom' => 'message_retour', - 'label' => '<:formidable:editer_message_ok:>', - 'explication' => '<:formidable:editer_message_ok_explication:>', - 'rows' => 5, - 'li_class' => 'editer_texte', - 'class' => 'multilang' - ) - ), - array( - 'saisie' => 'textarea', - 'options' => array( - 'nom' => 'descriptif', - 'label' => '<:formidable:editer_descriptif:>', - 'explication' => '<:formidable:editer_descriptif_explication:>', - 'rows' => 5, - 'class' => 'multilang' - ) - ), - array( - 'saisie' => 'selection', - 'options' => array( - 'nom' => 'apres', - 'label' => '<:formidable:editer_apres_label:>', - 'explication' => '<:formidable:editer_apres_explication:>', - 'datas' => array( - 'formulaire' => _T('formidable:editer_apres_choix_formulaire'), - 'valeurs' => _T('formidable:editer_apres_choix_valeurs'), - 'stats' => _T('formidable:editer_apres_choix_stats'), - 'rien' => _T('formidable:editer_apres_choix_rien'), - 'redirige' => _T('formidable:editer_apres_choix_redirige'), - ), - 'defaut' => 'formulaire', - 'cacher_option_intro' => 'on' - ) - ), - array( - 'saisie' => 'input', - 'options' => array( - 'nom' => 'url_redirect', - 'label' => '<:formidable:editer_redirige_url:>', - 'explication' => '<:formidable:editer_redirige_url_explication:>', - 'obligatoire' => 'non' - ) - ) + array( + 'saisie' => 'input', + 'options' => array( + 'nom' => 'titre', + 'label' => '<:formidable:editer_titre:>', + 'obligatoire' => 'oui', + 'class' => 'multilang' + ) + ), + array( + 'saisie' => 'input', + 'options' => array( + 'nom' => 'identifiant', + 'label' => '<:formidable:editer_identifiant:>', + 'explication' => '<:formidable:editer_identifiant_explication:>', + 'obligatoire' => 'oui' + ), + 'verifier' => array( + 'type' => 'regex', + 'options' => array( + 'modele' => '/^[\w]+$/' + ) + ) + ), + array( + 'saisie' => 'textarea', + 'options' => array( + 'nom' => 'message_retour', + 'label' => '<:formidable:editer_message_ok:>', + 'explication' => '<:formidable:editer_message_ok_explication:>', + 'rows' => 5, + 'li_class' => 'editer_texte', + 'class' => 'multilang' + ) + ), + array( + 'saisie' => 'textarea', + 'options' => array( + 'nom' => 'descriptif', + 'label' => '<:formidable:editer_descriptif:>', + 'explication' => '<:formidable:editer_descriptif_explication:>', + 'rows' => 5, + 'class' => 'multilang' + ) + ), + array( + 'saisie' => 'selection', + 'options' => array( + 'nom' => 'apres', + 'label' => '<:formidable:editer_apres_label:>', + 'explication' => '<:formidable:editer_apres_explication:>', + 'datas' => array( + 'formulaire' => _T('formidable:editer_apres_choix_formulaire'), + 'valeurs' => _T('formidable:editer_apres_choix_valeurs'), + 'stats' => _T('formidable:editer_apres_choix_stats'), + 'rien' => _T('formidable:editer_apres_choix_rien'), + 'redirige' => _T('formidable:editer_apres_choix_redirige'), + ), + 'defaut' => 'formulaire', + 'cacher_option_intro' => 'on' + ) + ), + array( + 'saisie' => 'input', + 'options' => array( + 'nom' => 'url_redirect', + 'label' => '<:formidable:editer_redirige_url:>', + 'explication' => '<:formidable:editer_redirige_url_explication:>', + 'obligatoire' => 'non' + ) + ) ); -/* déclaration des différentes variables utilisées pour effectuer l'anonymisation */ -$GLOBALS['formulaires']['variables_anonymisation'] = array( - 'remote_user' => '$_SERVER["REMOTE_USER"]', - 'php_auth_user' => '$_SERVER["PHP_AUTH_USER"]', -); - -$GLOBALS['formulaires']['passwd'] = array( - 'interne' => 'palabresecreta', -); - -$GLOBALS['formulaires']['autoriser_admin_restreint'] = true; if (!function_exists('array_fill_keys')) { - /** - * Remplit un tableau avec des valeurs, en spécifiant les clés - * - * Fonction dans PHP 5.2+ - * @see http://php.net/manual/fr/function.array-fill-keys.php - * - * @param array $keys - * Tableau de valeurs qui sera utilisé comme clés. - * @param mixed $value - * Valeur à utiliser pour remplir le tableau. - * @return array - * Le tableau rempli. - **/ - function array_fill_keys($keys, $value){ - array_combine($keys,array_fill(0,count($keys),$value)); - } + /** + * Remplit un tableau avec des valeurs, en spécifiant les clés + * + * Fonction dans PHP 5.2+ + * @see http://php.net/manual/fr/function.array-fill-keys.php + * + * @param array $keys + * Tableau de valeurs qui sera utilisé comme clés. + * @param mixed $value + * Valeur à utiliser pour remplir le tableau. + * @return array + * Le tableau rempli. + **/ + function array_fill_keys($keys, $value){ + array_combine($keys,array_fill(0,count($keys),$value)); + } } ?> diff --git a/formulaires/formidable.html b/formulaires/formidable.html index e3c8dd0a33d60fe6a1f3dfb938952dd4cbcd0df0..b5f9f99fa080da6bb7c0a8b5b4b2ab021233f4d0 100644 --- a/formulaires/formidable.html +++ b/formulaires/formidable.html @@ -1,46 +1,41 @@ <BOUCLE_remplacer_le_formulaire(CONDITION){si #ENV{_remplacer_formulaire}}> - [(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ] - [(#ENV**{_remplacer_formulaire})] + [(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ] + [(#ENV**{_remplacer_formulaire})] </BOUCLE_remplacer_le_formulaire> -<BOUCLE_formulaire(FORMULAIRES){id_formulaire=#ENV{id}}> - [(#SET{enregistrement,[(#TRAITEMENTS**|unserialize|table_valeur{'enregistrement'})]})] - [(#SET{anonymiser,[(#GET{enregistrement}|table_valeur{'anonymiser'})]})] - [(#GET{anonymiser}|=={on}|oui)<h3><:formidable:formulaire_anonyme_explication:>]</h3> -</BOUCLE_formulaire> <div class="formulaire_spip formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]"> - [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] - [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] + [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] + [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] - [(#ENV{editable}|oui) - <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div> - [(#REM) declarer les hidden qui declencheront le service du formulaire - parametre : url d'action ] - #ACTION_FORMULAIRE{#ENV{action}} - - <ul> - #GENERER_SAISIES{#ENV{_saisies}} - <li style="display:none;"> - <label for="mechantrobot-#ENV{id}"><:antispam_champ_vide:></label> - <input type="text" id="mechantrobot-#ENV{id}" name="mechantrobot" value="#ENV{mechantrobot}" /> - </li> - </ul> - - [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] - <!--extra--> - - <p class='boutons'> - <span class='image_loading'></span> - <input type='submit' class='submit' value='<:bouton_valider:>' /> - </p> - </div></form> - ] - [(#EDITABLE|non) - [(#ENV{formidable_afficher_apres}|=={valeurs}|oui) - #VOIR_SAISIES{#ENV*{_saisies},#ENV} - ] - [(#ENV{formidable_afficher_apres}|=={rien}|oui) - ] - ] - <br /> + [(#ENV{editable}|oui) + <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div> + [(#REM) declarer les hidden qui declencheront le service du formulaire + parametre : url d'action ] + #ACTION_FORMULAIRE{#ENV{action}} + + <ul> + #GENERER_SAISIES{#ENV{_saisies}} + <li style="display:none;"> + <label for="mechantrobot-#ENV{id}"><:antispam_champ_vide:></label> + <input type="text" id="mechantrobot-#ENV{id}" name="mechantrobot" value="#ENV{mechantrobot}" /> + </li> + </ul> + + [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] + <!--extra--> + + <p class='boutons'> + <span class='image_loading'></span> + <input type='submit' class='submit' value='<:bouton_valider:>' /> + </p> + </div></form> + ] + [(#EDITABLE|non) + [(#ENV{formidable_afficher_apres}|=={valeurs}|oui) + #VOIR_SAISIES{#ENV*{_saisies},#ENV} + ] + [(#ENV{formidable_afficher_apres}|=={rien}|oui) + ] + ] + <br /> </div> <//B_remplacer_le_formulaire> diff --git a/formulaires/formidable.php b/formulaires/formidable.php index 96529d96de2b7dd71f78882bc0c54e1f0abbb509..1ff68b16d85a2e61831f7e05c8582e0e4e1a5d25 100644 --- a/formulaires/formidable.php +++ b/formulaires/formidable.php @@ -16,7 +16,7 @@ include_spip('inc/autoriser'); /** * Chargement du formulaire CVT de Formidable. - * + * * Genere le formulaire dont l'identifiant (numerique ou texte est indique) * * @param int|string $id_formulaire @@ -26,120 +26,120 @@ include_spip('inc/autoriser'); * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli * @param int|bool $id_formulaires_reponse * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique - * + * * @return array * Contexte envoyé au squelette HTML du formulaire. **/ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){ - $contexte = array(); - - // On peut donner soit un id soit un identifiant - if (intval($id_formulaire) > 0) - $where = 'id_formulaire = '.intval($id_formulaire); - elseif (is_string($id_formulaire)) - $where = 'identifiant = '.sql_quote($id_formulaire); - else - return; - - // On cherche si le formulaire existe - if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) { - // on ajoute un point d'entrée avec les infos de ce formulaire - // pour d'eventuels plugins qui en ont l'utilité - $contexte += array('_formidable' => $formulaire); - // Est-ce que la personne a le droit de répondre ? - if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){ - $saisies = unserialize($formulaire['saisies']); - $traitements = unserialize($formulaire['traitements']); - // On déclare les champs - $contexte += array_fill_keys(saisies_lister_champs($saisies), ''); - $contexte['mechantrobot'] = ''; - // On ajoute le formulaire complet - $contexte['_saisies'] = $saisies; - - $contexte['id'] = $formulaire['id_formulaire']; - $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>'; - - // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit - if ($valeurs){ - // Si c'est une chaine on essaye de la parser - if (is_string($valeurs)){ - $liste = explode(',', $valeurs); - $liste = array_map('trim', $liste); - $valeurs = array(); - foreach ($liste as $i=>$cle_ou_valeur){ - if ($i % 2 == 0) - $valeurs[$liste[$i]] = $liste[$i+1]; - } - } - - // On regarde si maintenant on a un tableau - if ($valeurs and is_array($valeurs)){ - $contexte = array_merge($contexte, $valeurs); - } - } - - // Si on passe un identifiant de reponse, on edite cette reponse si elle existe - if ($id_formulaires_reponse = intval($id_formulaires_reponse)) { - $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); - if ($ok) { - // On ajoute un hidden pour dire que c'est une modif - $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>'; - } else { - $contexte['editable'] = false; - $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante'); - } - } else { - - // Si multiple = non mais que c'est modifiable, alors on va chercher - // la dernière réponse si elle existe - if ($options = $traitements['enregistrement'] - and !$options['multiple'] - and $options['modifiable'] - and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options) - ) { - $id_formulaires_reponse = array_pop($reponses); - $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); - - // On ajoute un hidden pour dire que c'est une modif - $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>'; - } - - } - } - else{ - $contexte['editable'] = false; - // le formulaire a déjà été répondu. - // peut être faut il afficher les statistiques des réponses - if ($formulaire['apres'] == 'stats') { - // Nous sommes face à un sondage auquel on a déjà répondu ! - // On remplace complètement l'affichage du formulaire - // par un affichage du résultat de sondage ! - $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array( - 'id_formulaire' => $formulaire['id_formulaire'], - )); - } else { - $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu'); - } - } - } - else{ - $contexte['editable'] = false; - $contexte['message_erreur'] = _T('formidable:erreur_inexistant'); - } - if (!isset($contexte['_hidden'])) { - $contexte['_hidden'] = ''; - } - $contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas - - $contexte['formidable_afficher_apres']=$formulaire['apres']; - - return $contexte; + $contexte = array(); + + // On peut donner soit un id soit un identifiant + if (intval($id_formulaire) > 0) + $where = 'id_formulaire = '.intval($id_formulaire); + elseif (is_string($id_formulaire)) + $where = 'identifiant = '.sql_quote($id_formulaire); + else + return; + + // On cherche si le formulaire existe + if ($formulaire = sql_fetsel('*', 'spip_formulaires', $where)) { + // on ajoute un point d'entrée avec les infos de ce formulaire + // pour d'eventuels plugins qui en ont l'utilité + $contexte += array('_formidable' => $formulaire); + // Est-ce que la personne a le droit de répondre ? + if (autoriser('repondre', 'formulaire', $formulaire['id_formulaire'], null, array('formulaire'=>$formulaire))){ + $saisies = unserialize($formulaire['saisies']); + $traitements = unserialize($formulaire['traitements']); + // On déclare les champs + $contexte += array_fill_keys(saisies_lister_champs($saisies), ''); + $contexte['mechantrobot'] = ''; + // On ajoute le formulaire complet + $contexte['_saisies'] = $saisies; + + $contexte['id'] = $formulaire['id_formulaire']; + $contexte['_hidden'] = '<input type="hidden" name="id_formulaire" value="'.$contexte['id'].'"/>'; + + // S'il y a des valeurs par défaut dans l'appel, alors on pré-remplit + if ($valeurs){ + // Si c'est une chaine on essaye de la parser + if (is_string($valeurs)){ + $liste = explode(',', $valeurs); + $liste = array_map('trim', $liste); + $valeurs = array(); + foreach ($liste as $i=>$cle_ou_valeur){ + if ($i % 2 == 0) + $valeurs[$liste[$i]] = $liste[$i+1]; + } + } + + // On regarde si maintenant on a un tableau + if ($valeurs and is_array($valeurs)){ + $contexte = array_merge($contexte, $valeurs); + } + } + + // Si on passe un identifiant de reponse, on edite cette reponse si elle existe + if ($id_formulaires_reponse = intval($id_formulaires_reponse)) { + $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); + if ($ok) { + // On ajoute un hidden pour dire que c'est une modif + $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>'; + } else { + $contexte['editable'] = false; + $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_edition_reponse_inexistante'); + } + } else { + + // Si multiple = non mais que c'est modifiable, alors on va chercher + // la dernière réponse si elle existe + if ($options = $traitements['enregistrement'] + and !$options['multiple'] + and $options['modifiable'] + and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification']) + ){ + $id_formulaires_reponse = array_pop($reponses); + $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); + + // On ajoute un hidden pour dire que c'est une modif + $contexte['_hidden'] .= "\n".'<input type="hidden" name="deja_enregistre_'.$formulaire['id_formulaire'].'" value="'.$id_formulaires_reponse.'"/>'; + } + + } + } + else{ + $contexte['editable'] = false; + // le formulaire a déjà été répondu. + // peut être faut il afficher les statistiques des réponses + if ($formulaire['apres'] == 'stats') { + // Nous sommes face à un sondage auquel on a déjà répondu ! + // On remplace complètement l'affichage du formulaire + // par un affichage du résultat de sondage ! + $contexte['_remplacer_formulaire'] = recuperer_fond('modeles/formulaire_analyse', array( + 'id_formulaire' => $formulaire['id_formulaire'], + )); + } else { + $contexte['message_erreur'] = _T('formidable:traiter_enregistrement_erreur_deja_repondu'); + } + } + } + else{ + $contexte['editable'] = false; + $contexte['message_erreur'] = _T('formidable:erreur_inexistant'); + } + if (!isset($contexte['_hidden'])) { + $contexte['_hidden'] = ''; + } + $contexte['_hidden'] .= "\n".'<input type="hidden" name="formidable_afficher_apres'/*.$formulaire['id_formulaire']*/.'" value="'.$formulaire['apres'].'"/>';// marche pas + + $contexte['formidable_afficher_apres']=$formulaire['apres']; + + return $contexte; } /** * Vérification du formulaire CVT de Formidable. - * + * * Pour chaque champ posté, effectue les vérifications demandées par * les saisies et retourne éventuellement les erreurs de saisie. * @@ -150,35 +150,35 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli * @param int|bool $id_formulaires_reponse * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique - * + * * @return array * Tableau des erreurs **/ function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){ - $erreurs = array(); - - // Sale bête ! - if (_request('mechantrobot') != ''){ - $erreurs['hahahaha'] = 'hahahaha'; - return $erreurs; - } - - $id_formulaire = intval(_request('id_formulaire')); - $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire); - $saisies = unserialize($formulaire['saisies']); - - $erreurs = saisies_verifier($saisies); - - if ($erreurs and !isset($erreurs['message_erreur'])) - $erreurs['message_erreur'] = _T('formidable:erreur_generique'); - - return $erreurs; + $erreurs = array(); + + // Sale bête ! + if (_request('mechantrobot') != ''){ + $erreurs['hahahaha'] = 'hahahaha'; + return $erreurs; + } + + $id_formulaire = intval(_request('id_formulaire')); + $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire); + $saisies = unserialize($formulaire['saisies']); + + $erreurs = saisies_verifier($saisies); + + if ($erreurs and !isset($erreurs['message_erreur'])) + $erreurs['message_erreur'] = _T('formidable:erreur_generique'); + + return $erreurs; } /** * Traitement du formulaire CVT de Formidable. - * + * * Exécute les traitements qui sont indiqués dans la configuration des * traitements de ce formulaire formidable. * @@ -195,66 +195,66 @@ function formulaires_formidable_verifier($id_formulaire, $valeurs=array(), $id_f * Exemple : array('hidden_1' => 3) pour que champ identifie "@hidden_1@" soit prerempli * @param int|bool $id_formulaires_reponse * Identifiant d'une réponse pour forcer la reedition de cette reponse spécifique - * + * * @return array * Tableau des erreurs **/ function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_formulaires_reponse=false){ - $retours = array(); - - $id_formulaire = intval(_request('id_formulaire')); - $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire); - $traitements = unserialize($formulaire['traitements']); - - // selon le choix, le formulaire se remet en route à la fin ou non - $retours['editable'] = ($formulaire['apres']=='formulaire'); - $retours['formidable_afficher_apres'] = $formulaire['apres']; - - // Si on a une redirection valide - if (($formulaire['apres']== "redirige") AND ($formulaire['url_redirect']!="")) { - refuser_traiter_formulaire_ajax(); - // traiter les raccourcis artX, brX - include_spip("inc/lien"); - $url_redirect = typer_raccourci($formulaire['url_redirect']); - if (count($url_redirect)>2) { - $url_redirect = $url_redirect[0].$url_redirect[2]; - } else { - $url_redirect = $formulaire['url_redirect']; // URL classique - } - - $retours['redirect'] = $url_redirect; - } - - // Si on a des traitements - if (is_array($traitements) and !empty($traitements)) { - foreach($traitements as $type_traitement=>$options){ - if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) { - $retours = $appliquer_traitement( - array( - 'formulaire' => $formulaire, - 'options' => $options - ), - $retours - ); - } - } - - // Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement - if ($formulaire['message_retour']) { - $retours['message_ok'] = _T_ou_typo($formulaire['message_retour']); - } - } - else{ - $retours['message_ok'] = _T('formidable:retour_aucun_traitement'); - } - - return $retours; + $retours = array(); + + $id_formulaire = intval(_request('id_formulaire')); + $formulaire = sql_fetsel('*', 'spip_formulaires', 'id_formulaire = '.$id_formulaire); + $traitements = unserialize($formulaire['traitements']); + + // selon le choix, le formulaire se remet en route à la fin ou non + $retours['editable'] = ($formulaire['apres']=='formulaire'); + $retours['formidable_afficher_apres'] = $formulaire['apres']; + + // Si on a une redirection valide + if (($formulaire['apres']== "redirige") AND ($formulaire['url_redirect']!="")) { + refuser_traiter_formulaire_ajax(); + // traiter les raccourcis artX, brX + include_spip("inc/lien"); + $url_redirect = typer_raccourci($formulaire['url_redirect']); + if (count($url_redirect)>2) { + $url_redirect = $url_redirect[0].$url_redirect[2]; + } else { + $url_redirect = $formulaire['url_redirect']; // URL classique + } + + $retours['redirect'] = $url_redirect; + } + + // Si on a des traitements + if (is_array($traitements) and !empty($traitements)) { + foreach($traitements as $type_traitement=>$options){ + if ($appliquer_traitement = charger_fonction($type_traitement, 'traiter/', true)) { + $retours = $appliquer_traitement( + array( + 'formulaire' => $formulaire, + 'options' => $options + ), + $retours + ); + } + } + + // Si on a personnalisé le message de retour, c'est lui qui est affiché uniquement + if ($formulaire['message_retour']) { + $retours['message_ok'] = _T_ou_typo($formulaire['message_retour']); + } + } + else{ + $retours['message_ok'] = _T('formidable:retour_aucun_traitement'); + } + + return $retours; } /** * Ajoute dans le contexte les elements - * donnés par une reponse de formulaire indiquée + * donnés par une reponse de formulaire indiquée * * @param array $contexte * Contexte pour le squelette HTML du formulaire @@ -264,24 +264,24 @@ function formulaires_formidable_traiter($id_formulaire, $valeurs=array(), $id_fo * La reponse existe bien ? * @return array $contexte * Contexte complète des nouvelles informations - * + * **/ function formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, &$ok) { - // On va chercher tous les champs - $champs = sql_allfetsel( - 'nom, valeur', - 'spip_formulaires_reponses_champs', - 'id_formulaires_reponse = '.$id_formulaires_reponse - ); - $ok = count($champs) ? true : false; - - // On remplit le contexte avec - foreach ($champs as $champ){ - $test_array = unserialize($champ['valeur']); - $contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur']; - } - - return $contexte; + // On va chercher tous les champs + $champs = sql_allfetsel( + 'nom, valeur', + 'spip_formulaires_reponses_champs', + 'id_formulaires_reponse = '.$id_formulaires_reponse + ); + $ok = count($champs) ? true : false; + + // On remplit le contexte avec + foreach ($champs as $champ){ + $test_array = unserialize($champ['valeur']); + $contexte[$champ['nom']] = is_array($test_array) ? $test_array : $champ['valeur']; + } + + return $contexte; } ?> diff --git a/inc/formidable.php b/inc/formidable.php index 03fc160f43051474fcf7c99519d716732fc2ff1b..1319dc3c13e4720a6b5663c66092da2495499a50 100644 --- a/inc/formidable.php +++ b/inc/formidable.php @@ -9,29 +9,29 @@ if (!defined("_ECRIRE_INC_VERSION")) return; * @return array Un tableau listant des saisies et leurs options */ function traitements_lister_disponibles(){ - static $traitements = null; - - if (is_null($traitements)){ - $traitements = array(); - $liste = find_all_in_path('traiter/', '.+[.]yaml$'); - - if (count($liste)){ - foreach ($liste as $fichier=>$chemin){ - $type_traitement = preg_replace(',[.]yaml$,i', '', $fichier); - $dossier = str_replace($fichier, '', $chemin); - // On ne garde que les traitements qui ont bien la fonction - if (charger_fonction($type_traitement, 'traiter', true) - and ( - is_array($traitement = traitements_charger_infos($type_traitement)) - ) - ){ - $traitements[$type_traitement] = $traitement; - } - } - } - } - - return $traitements; + static $traitements = null; + + if (is_null($traitements)){ + $traitements = array(); + $liste = find_all_in_path('traiter/', '.+[.]yaml$'); + + if (count($liste)){ + foreach ($liste as $fichier=>$chemin){ + $type_traitement = preg_replace(',[.]yaml$,i', '', $fichier); + $dossier = str_replace($fichier, '', $chemin); + // On ne garde que les traitements qui ont bien la fonction + if (charger_fonction($type_traitement, 'traiter', true) + and ( + is_array($traitement = traitements_charger_infos($type_traitement)) + ) + ){ + $traitements[$type_traitement] = $traitement; + } + } + } + } + + return $traitements; } /** @@ -41,17 +41,17 @@ function traitements_lister_disponibles(){ * @return array Un tableau contenant le YAML décodé */ function traitements_charger_infos($type_traitement){ - include_spip('inc/yaml'); - $fichier = find_in_path("traiter/$type_traitement.yaml"); - $traitement = yaml_decode_file($fichier); - - if (is_array($traitement)) { - $traitement += array('titre' => '', 'description' => '', 'icone' => ''); - $traitement['titre'] = $traitement['titre'] ? _T_ou_typo($traitement['titre']) : $type_traitement; - $traitement['description'] = $traitement['description'] ? _T_ou_typo($traitement['description']) : ''; - $traitement['icone'] = $traitement['icone'] ? find_in_path($traitement['icone']) : ''; - } - return $traitement; + include_spip('inc/yaml'); + $fichier = find_in_path("traiter/$type_traitement.yaml"); + $traitement = yaml_decode_file($fichier); + + if (is_array($traitement)) { + $traitement += array('titre' => '', 'description' => '', 'icone' => ''); + $traitement['titre'] = $traitement['titre'] ? _T_ou_typo($traitement['titre']) : $type_traitement; + $traitement['description'] = $traitement['description'] ? _T_ou_typo($traitement['description']) : ''; + $traitement['icone'] = $traitement['icone'] ? find_in_path($traitement['icone']) : ''; + } + return $traitement; } /* @@ -60,23 +60,23 @@ function traitements_charger_infos($type_traitement){ * @return array Retourne un tableau listant les types d'échanges */ function echanges_formulaire_lister_disponibles(){ - // On va chercher toutes les fonctions existantes - $liste = find_all_in_path('echanger/formulaire/', '.+[.]php$'); - $types_echange = array('exporter'=>array(), 'importer'=>array()); - if (count($liste)){ - foreach ($liste as $fichier=>$chemin){ - $type_echange = preg_replace(',[.]php$,i', '', $fichier); - $dossier = str_replace($fichier, '', $chemin); - // On ne garde que les échanges qui ont bien la fonction - if ($f = charger_fonction('exporter', "echanger/formulaire/$type_echange", true)){ - $types_echange['exporter'][$type_echange] = $f; - } - if ($f = charger_fonction('importer', "echanger/formulaire/$type_echange", true)){ - $types_echange['importer'][$type_echange] = $f; - } - } - } - return $types_echange; + // On va chercher toutes les fonctions existantes + $liste = find_all_in_path('echanger/formulaire/', '.+[.]php$'); + $types_echange = array('exporter'=>array(), 'importer'=>array()); + if (count($liste)){ + foreach ($liste as $fichier=>$chemin){ + $type_echange = preg_replace(',[.]php$,i', '', $fichier); + $dossier = str_replace($fichier, '', $chemin); + // On ne garde que les échanges qui ont bien la fonction + if ($f = charger_fonction('exporter', "echanger/formulaire/$type_echange", true)){ + $types_echange['exporter'][$type_echange] = $f; + } + if ($f = charger_fonction('importer', "echanger/formulaire/$type_echange", true)){ + $types_echange['importer'][$type_echange] = $f; + } + } + } + return $types_echange; } /* @@ -87,70 +87,59 @@ function echanges_formulaire_lister_disponibles(){ * @return string Retourne le nom du cookie */ function formidable_generer_nom_cookie($id_formulaire){ - return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire; + return $GLOBALS['cookie_prefix'].'cookie_formidable_'.$id_formulaire; } /* * Vérifie si le visiteur a déjà répondu à un formulaire * * @param int $id_formulaire L'identifiant du formulaire - * @param string $options : options du formulaire definies dans l'espace prive + * @param string $choix_identification Comment verifier une reponse. Priorite sur 'cookie' ou sur 'id_auteur' * @return unknown_type Retourne un tableau contenant les id des réponses si elles existent, sinon false */ -function formidable_verifier_reponse_formulaire($id_formulaire, $options){ - global $auteur_session; - $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; - $nom_cookie = formidable_generer_nom_cookie($id_formulaire); - $cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false; +function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identification='cookie'){ + global $auteur_session; + $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; + $nom_cookie = formidable_generer_nom_cookie($id_formulaire); + $cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false; + + // ni cookie ni id, on ne peut rien faire + if (!$cookie and !$id_auteur) { + return false; + } - $anonymiser = isset($options['anonymiser']) ? $options['anonymiser'] : false; - $anonymiser_variable = isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : ''; + // priorite sur le cookie + if ($choix_identification == 'cookie' or !$choix_identification) { + if ($cookie) + $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')'); + else + $where = 'id_auteur='.intval($id_auteur); + } + + // sinon sur l'id_auteur + else { + if ($id_auteur) + $where = 'id_auteur='.intval($id_auteur); + else + $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')'); + } - // traitement de l'anonymisation - if ($anonymiser != false) { - // mod de l'id_auteur - $variables_anonymisation = - $GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']]; - $id = eval("return $variables_anonymisation;"); - $id_auteur = formidable_scramble($id); - } - // ni cookie ni id, on ne peut rien faire - if (!$cookie and !$id_auteur) { - return false; - } - - // priorite sur le cookie - if ($choix_identification == 'cookie' or !$choix_identification) { - if ($cookie) - $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')'); - else - $where = 'id_auteur='.$id_auteur; - } - - // sinon sur l'id_auteur - else { - if ($id_auteur) - $where = 'id_auteur='.$id_auteur; - else - $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')'); - } - - $reponses = sql_allfetsel( - 'id_formulaires_reponse', - 'spip_formulaires_reponses', - array( - array('=', 'id_formulaire', intval($id_formulaire)), - array('=', 'statut', sql_quote('publie')), - $where - ), - '', - 'date' - ); - - if (is_array($reponses)) - return array_map('reset', $reponses); - else - return false; + $reponses = sql_allfetsel( + 'id_formulaires_reponse', + 'spip_formulaires_reponses', + array( + array('=', 'id_formulaire', intval($id_formulaire)), + array('=', 'statut', sql_quote('publie')), + $where + ), + '', + 'date' + ); + + if (is_array($reponses)) + return array_map('reset', $reponses); + else + return false; } /* @@ -160,162 +149,68 @@ function formidable_verifier_reponse_formulaire($id_formulaire, $options){ * @param array $env L'environnement, contenant normalement la réponse à la saisie * @return string Retour le HTML des vues */ -function formidable_analyser_saisie($saisie, $valeurs=array(), $reponses_total=0, $format_brut=false) { - // Si le paramètre n'est pas bon ou que c'est un conteneur, on génère du vide - if (!is_array($saisie) or (isset($saisie['saisies']) and $saisie['saisies'])) - return ''; - - $contexte = array('reponses_total'=>$reponses_total); - - // On sélectionne le type de saisie - $contexte['type_saisie'] = $saisie['saisie']; - - // Peut-être des transformations à faire sur les options textuelles - $options = $saisie['options']; - foreach ($options as $option => $valeur){ - $options[$option] = _T_ou_typo($valeur, 'multi'); - } - - // On ajoute les options propres à la saisie - $contexte = array_merge($contexte, $options); - - // On récupère toutes les valeurs du champ - if (isset($valeurs[$contexte['nom']]) and $valeurs[$contexte['nom']] and is_array($valeurs[$contexte['nom']])){ - $contexte['valeurs'] = $valeurs[$contexte['nom']]; - } - else{ - $contexte['valeurs'] = array(); - } - - // On génère la saisie - if ($format_brut) { - return analyser_saisie($contexte); - } else { - return recuperer_fond( - 'saisies-analyses/_base', - $contexte - ); - } -} - -/* - * Renvoie une ligne de réponse sous la forme d'un tableau - * - * @param array $saisie Un tableau décrivant une saisie - * @return array Tableau contenant une ligne - */ -function analyser_saisie($saisie) { - if (!isset($saisie['type_saisie']) or $saisie['type_saisie'] == '') +function formidable_analyser_saisie($saisie, $valeurs=array(), $reponses_total=0){ + // Si le paramètre n'est pas bon ou que c'est un conteneur, on génère du vide + if (!is_array($saisie) or (isset($saisie['saisies']) and $saisie['saisies'])) return ''; - $ligne = array(); + $contexte = array('reponses_total'=>$reponses_total); - switch($saisie['type_saisie']) { - case 'selecteur_rubrique' : - case 'selecteur_rubrique_article' : - case 'selecteur_article' : - $ligne['plein'] = count(array_filter($saisie['valeurs'])); - $ligne['vide'] = count(array_diff_key($saisie['valeurs'] - , array_filter($saisie['valeurs']))); - break; - case 'radio' : - case 'selection' : - case 'selection_multiple' : - case 'checkbox' : - $stats = array(); - foreach($saisie['valeurs'] as $valeur) { - if (is_array($valeur)) { - foreach($valeur as $choix) { - if (isset($stats["choix-$choix"])) - $stats["choix-$choix"]++; - else $stats["choix-$choix"] = 1; - } - } else { - if (isset($stats["choix-$valeur"])) - $stats["choix-$valeur"]++; - else $stats["choix-$valeur"] = 1; - } - } - $datas = is_string($saisie['datas']) - ? saisies_chaine2tableau($saisie['datas']) - : $saisie['datas']; - foreach($datas as $key => $val) { - $nb = (isset($stats["choix-$key"])) - ? $stats["choix-$key"] - : 0; - $ligne[$val] = $nb; - } - break; - case 'destinataires' : - $stats = array(); - foreach($saisie['valeurs'] as $valeur) { - foreach($valeur as $choix) { - if (isset($stats["choix-$choix"])) - $stats["choix-$choix"]++; - else $stats["choix-$choix"] = 1; - } - } - foreach($stats as $key => $val) { - $key = str_replace('choix-', '', $key); - if ($key == '') $key = '<valeur vide>'; - $auteur = sql_getfetsel('nom','spip_auteurs',"id_auteur=$key"); - $ligne[$auteur] = $val; - } - break; + // On sélectionne le type de saisie + $contexte['type_saisie'] = $saisie['saisie']; + + // Peut-être des transformations à faire sur les options textuelles + $options = $saisie['options']; + foreach ($options as $option => $valeur){ + $options[$option] = _T_ou_typo($valeur, 'multi'); } - $vide = 0; - foreach($saisie['valeurs'] as $valeur) { - if ($valeur == '') $vide++; - switch($saisie['type_saisie']) { - case 'case' : - case 'oui_non' : - if(isset($ligne['oui']) == false) $ligne['oui'] = 0; - if(isset($ligne['non']) == false) $ligne['non'] = 0; - if ($valeur) $ligne['oui']++; else $ligne['non']++; - break; - case 'input' : - case 'hidden' : - case 'explication' : - break; - } + // On ajoute les options propres à la saisie + $contexte = array_merge($contexte, $options); + + // On récupère toutes les valeurs du champ + if (isset($valeurs[$contexte['nom']]) and $valeurs[$contexte['nom']] and is_array($valeurs[$contexte['nom']])){ + $contexte['valeurs'] = $valeurs[$contexte['nom']]; + } + else{ + $contexte['valeurs'] = array(); } - $ligne['sans_reponse'] = $vide; - $ligne['header'] = $saisie['label'] != '' - ? $saisie['label'] - : $saisie['type_saisie']; - return $ligne; + // On génère la saisie + return recuperer_fond( + 'saisies-analyses/_base', + $contexte + ); } /** - * Tente de déserialiser un texte + * Tente de déserialiser un texte * * Si le paramètre est un tableau, retourne le tableau, * Si c'est une chaîne, tente de la désérialiser, sinon * retourne la chaîne. * * @filtre tenter_unserialize - * + * * @param string|array $texte * Le texte (possiblement sérializé) ou un tableau * @return array|string * Tableau, texte désérializé ou texte **/ function filtre_tenter_unserialize_dist($texte) { - if (is_array($texte)) { - return $texte; - } - if ($tmp = @unserialize($texte)) { - return $tmp; - } - return $texte; + if (is_array($texte)) { + return $texte; + } + if ($tmp = @unserialize($texte)) { + return $tmp; + } + return $texte; } /** - * Retourne un texte du nombre de réponses + * Retourne un texte du nombre de réponses * * @param int $nb * Nombre de réponses @@ -323,55 +218,9 @@ function filtre_tenter_unserialize_dist($texte) { * Texte indiquant le nombre de réponses **/ function titre_nb_reponses($nb) { - if (!$nb) return _T('formidable:reponse_aucune'); - if ($nb == 1) return _T('formidable:reponse_une'); - return _T('formidable:reponses_nb', array('nb' => $nb)); -} - -/** - * Transforme le hash MD5 en une valeur numérique unique - * - * trouvé ici : http://stackoverflow.com/questions/1422725/represent-md5-hash-as-an-integer - * @param string $hex_str La valeur alphanumérique à transformer - * @return string Valeur numérique -*/ -function md5_hex_to_dec($hex_str) { - $arr = str_split($hex_str, 4); - foreach ($arr as $grp) { - $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT); - } - - /* on s'assure que $result ne commence pas par un zero */ - $result = implode('', $dec); - for ($cpt = 0 ; $cpt < strlen($result) ; $cpt++) { - if ($result[$cpt] != '0') break; - } - $result = substr($result, $cpt); - return $result; -} - -/** - * Transforme un login en une valeur numérique de 19 caractères - * - * NOTE: il devient impossible de retrouver la valeur d'origine car le HASH - * est coupé à 19cars et est donc incomplet. L'unicité n'est pas garantie mais - * les chances pour que deux logins tombent sur le même HASH sont de 1 sur - * 10 milliards de milliards - * A la fin, on recherche et supprime les éventuels zéros de début - * @param string $login Login à transformer - * @param string $passwd Chaîne 'secrète' ajoutée au login et id_formulaire pour éviter - * les recoupements d'identité entre plusieurs formulaires - * @return string Un nombre de 19 chiffres -*/ -function formidable_scramble($login, $passwd = '') { - $id_form = (isset($flux['args']['id_form']) ? $flux['args']['id_form'] : ''); - if ($passwd == '') - $passwd = $GLOBALS['formulaires']['passwd']['interne']; - $login_md5 = md5("$login$passwd$id_form"); - $login_num = md5_hex_to_dec($login_md5); - $login_num = substr($login_num, 0, 19); - - return $login_num; + if (!$nb) return _T('formidable:reponse_aucune'); + if ($nb == 1) return _T('formidable:reponse_une'); + return _T('formidable:reponses_nb', array('nb' => $nb)); } ?> diff --git a/prive/squelettes/extra/formulaires_analyse.html b/prive/squelettes/extra/formulaires_analyse.html deleted file mode 100755 index 9810f7574dca1ea3243dd4158bced28830301f1a..0000000000000000000000000000000000000000 --- a/prive/squelettes/extra/formulaires_analyse.html +++ /dev/null @@ -1,8 +0,0 @@ -<BOUCLE_formulaire(FORMULAIRES){id_formulaire}> -<BOUCLE_autoriser(CONDITION){si #AUTORISER{voir, formulaires_analyse}}> -[(#BOITE_OUVRIR{<:formidable:titre_cadre_raccourcis:>,'info'})] -[(#URL_ACTION_AUTEUR{exporter_analyse_reponses,#ID_FORMULAIRE} - |icone_horizontale{<:formidable:analyse_exporter:>,formulaire,formulaire-analyse-exporter-24,center})] -#BOITE_FERMER -</BOUCLE_autoriser> -</BOUCLE_formulaire> diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php index 8edaaa518937f2f1385fdaebadadea4263ae87c0..4a5115af7ace5aab0f768a8a12e4a909c1dda910 100644 --- a/traiter/enregistrement.php +++ b/traiter/enregistrement.php @@ -4,135 +4,126 @@ if (!defined("_ECRIRE_INC_VERSION")) return; function traiter_enregistrement_dist($args, $retours){ - include_spip('inc/formidable'); - include_spip('base/abstract_sql'); - $options = $args['options']; - $formulaire = $args['formulaire']; - $id_formulaire = intval($formulaire['id_formulaire']); - $saisies = unserialize($formulaire['saisies']); - $saisies = saisies_lister_par_nom($saisies); - - // La personne a-t-elle un compte ? - global $auteur_session; - $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; - - // traitement de l'anonymisation - if ($options['anonymiser'] == 'on') { - // mod de l'id_auteur - $variables_anonymisation = - $GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']]; - $id = eval("return $variables_anonymisation;"); - $id_auteur = formidable_scramble($id); - } - - // On cherche le cookie et sinon on le crée - $nom_cookie = formidable_generer_nom_cookie($id_formulaire); - if (isset($_COOKIE[$nom_cookie])) - $cookie = $_COOKIE[$nom_cookie]; - else { - include_spip("inc/acces"); - $cookie = creer_uniqid(); - } - - // On regarde si c'est une modif d'une réponse existante - $id_formulaires_reponse = intval(_request('deja_enregistre_'.$id_formulaire)); - - // Si la moderation est a posteriori ou que la personne est un boss, on publie direct - if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie'))) - $statut='publie'; - else - $statut = 'prop'; - - // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse - if (!$id_formulaires_reponse){ - $id_formulaires_reponse = sql_insertq( - 'spip_formulaires_reponses', - array( - 'id_formulaire' => $id_formulaire, - 'id_auteur' => $id_auteur, - 'cookie' => $cookie, - 'ip' => $GLOBALS['ip'], - 'date' => 'NOW()', - 'statut' => $statut - ) - ); - // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie - if (!$options['multiple'] or $options['modifiable']){ - include_spip("inc/cookie"); - // Expiration dans 30 jours - spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600); - } - } - - // Si l'id n'a pas été créé correctement alors erreur - if (!($id_formulaires_reponse > 0)){ - $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base'); - } - // Sinon on continue à mettre à jour - else{ - $champs = array(); - $insertions = array(); - foreach($saisies as $nom => $saisie){ - // On ne prend que les champs qui ont effectivement été envoyés par le formulaire - if (($valeur = _request($nom)) !== null){ - $champs[] = $nom; - $insertions[] = array( - 'id_formulaires_reponse' => $id_formulaires_reponse, - 'nom' => $nom, - 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur - ); - } - } - - // S'il y a bien des choses à modifier - if ($champs){ - // On supprime d'abord les champs - sql_delete( - 'spip_formulaires_reponses_champs', - array( - 'id_formulaires_reponse = '.$id_formulaires_reponse, - sql_in('nom', $champs) - ) - ); - - // Puis on insère les nouvelles valeurs - sql_insertq_multi( - 'spip_formulaires_reponses_champs', - $insertions - ); - } - } - - return $retours; + include_spip('inc/formidable'); + include_spip('base/abstract_sql'); + $options = $args['options']; + $formulaire = $args['formulaire']; + $id_formulaire = intval($formulaire['id_formulaire']); + $saisies = unserialize($formulaire['saisies']); + $saisies = saisies_lister_par_nom($saisies); + + // La personne a-t-elle un compte ? + global $auteur_session; + $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; + + // On cherche le cookie et sinon on le crée + $nom_cookie = formidable_generer_nom_cookie($id_formulaire); + if (isset($_COOKIE[$nom_cookie])) + $cookie = $_COOKIE[$nom_cookie]; + else { + include_spip("inc/acces"); + $cookie = creer_uniqid(); + } + + // On regarde si c'est une modif d'une réponse existante + $id_formulaires_reponse = intval(_request('deja_enregistre_'.$id_formulaire)); + + // Si la moderation est a posteriori ou que la personne est un boss, on publie direct + if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie'))) + $statut='publie'; + else + $statut = 'prop'; + + // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse + if (!$id_formulaires_reponse){ + $id_formulaires_reponse = sql_insertq( + 'spip_formulaires_reponses', + array( + 'id_formulaire' => $id_formulaire, + 'id_auteur' => $id_auteur, + 'cookie' => $cookie, + 'ip' => $GLOBALS['ip'], + 'date' => 'NOW()', + 'statut' => $statut + ) + ); + // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie + if (!$options['multiple'] or $options['modifiable']){ + include_spip("inc/cookie"); + // Expiration dans 30 jours + spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600); + } + } + + // Si l'id n'a pas été créé correctement alors erreur + if (!($id_formulaires_reponse > 0)){ + $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base'); + } + // Sinon on continue à mettre à jour + else{ + $champs = array(); + $insertions = array(); + foreach($saisies as $nom => $saisie){ + // On ne prend que les champs qui ont effectivement été envoyés par le formulaire + if (($valeur = _request($nom)) !== null){ + $champs[] = $nom; + $insertions[] = array( + 'id_formulaires_reponse' => $id_formulaires_reponse, + 'nom' => $nom, + 'valeur' => is_array($valeur) ? serialize($valeur) : $valeur + ); + } + } + + // S'il y a bien des choses à modifier + if ($champs){ + // On supprime d'abord les champs + sql_delete( + 'spip_formulaires_reponses_champs', + array( + 'id_formulaires_reponse = '.$id_formulaires_reponse, + sql_in('nom', $champs) + ) + ); + + // Puis on insère les nouvelles valeurs + sql_insertq_multi( + 'spip_formulaires_reponses_champs', + $insertions + ); + } + } + + return $retours; } function traiter_enregistrement_update_dist($id_formulaire, $traitement, $saisies_anciennes, $saisies_nouvelles){ - include_spip('inc/saisies'); - include_spip('base/abstract_sql'); - $comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles); - - // Si des champs ont été supprimés, il faut supprimer les réponses à ces champs - if ($comparaison['supprimees']){ - // On récupère les réponses du formulaire - $reponses = sql_allfetsel( - 'id_formulaires_reponse', - 'spip_formulaires_reponses', - 'id_formulaire = '.$id_formulaire - ); - $reponses = array_map('reset', $reponses); - - // Tous les noms de champs à supprimer - $noms = array_keys($comparaison['supprimees']); - - // On supprime - sql_delete( - 'spip_formulaires_reponses_champs', - array( - sql_in('id_formulaires_reponse', $reponses), - sql_in('nom', $noms) - ) - ); - } + include_spip('inc/saisies'); + include_spip('base/abstract_sql'); + $comparaison = saisies_comparer($saisies_anciennes, $saisies_nouvelles); + + // Si des champs ont été supprimés, il faut supprimer les réponses à ces champs + if ($comparaison['supprimees']){ + // On récupère les réponses du formulaire + $reponses = sql_allfetsel( + 'id_formulaires_reponse', + 'spip_formulaires_reponses', + 'id_formulaire = '.$id_formulaire + ); + $reponses = array_map('reset', $reponses); + + // Tous les noms de champs à supprimer + $noms = array_keys($comparaison['supprimees']); + + // On supprime + sql_delete( + 'spip_formulaires_reponses_champs', + array( + sql_in('id_formulaires_reponse', $reponses), + sql_in('nom', $noms) + ) + ); + } } ?> diff --git a/traiter/enregistrement.yaml b/traiter/enregistrement.yaml index 41c9ced81d11b7ff95abf4ff9452d69633417214..3fae3210633292047b494c64795a2cc709d11650 100644 --- a/traiter/enregistrement.yaml +++ b/traiter/enregistrement.yaml @@ -26,24 +26,6 @@ options: cookie: '<:formidable:identification_par_cookie:>' id_auteur: '<:formidable:identification_par_id_auteur:>' defaut: 'cookie' - - - saisie: 'oui_non' - options: - nom: 'anonymiser' - label: '<:formidable:traiter_enregistrement_option_anonymiser_label:>' - explication: '<:formidable:traiter_enregistrement_option_anonymiser_explication:>' - defaut: '' - - - saisie: 'selection' - options: - option_intro: '<:formidable:traiter_enregistrement_option_choix_select_label:>' - nom: 'anonymiser_variable' - label: '<:formidable:traiter_enregistrement_option_anonymiser_variable_label:>' - explication: '<:formidable:traiter_enregistrement_option_anonymiser_variable_explication:>' - datas: - remote_user: "Variable serveur : REMOTE_USER" - php_auth_user: "Variable serveur : PHP_AUTH_USER" - defaut: '' - saisie: 'radio' options: