diff --git a/formidable_options.php b/formidable_options.php index 5a055d56271a39d3269b7cdd530f093c591aa3ac..312d95eedd3bed8b7be87a9aa3c71267994f52c8 100644 --- a/formidable_options.php +++ b/formidable_options.php @@ -1,107 +1,107 @@ -<?php - -/** - * Options globales chargées à chaque hit - * - * @package SPIP\Formidable\Options -**/ - -// Sécurité -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' - ) - ) -); - - -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)); - } -} - -?> +<?php + +/** + * Options globales chargées à chaque hit + * + * @package SPIP\Formidable\Options +**/ + +// Sécurité +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' + ) + ) +); + + +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)); + } +} + +?> diff --git a/formulaires/formidable.php b/formulaires/formidable.php index 36b864d249b3bf4ab704f3481d19bed7f89457b5..723846f24d6e51e569bcf35bdf386f87c478b37d 100644 --- a/formulaires/formidable.php +++ b/formulaires/formidable.php @@ -1,287 +1,287 @@ -<?php - -/** - * Gestion de l'affichage et traitement d'un formulaire Formidable - * - * @package SPIP\Formidable\Formulaires -**/ - -// Sécurité -if (!defined("_ECRIRE_INC_VERSION")) return; - -include_spip('inc/formidable'); -include_spip('inc/saisies'); -include_spip('base/abstract_sql'); -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 - * Identifiant numerique ou textuel du formulaire formidable - * @param array $valeurs - * Valeurs par défauts passées au contexte du formulaire - * 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['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. - * - * @param int|string $id_formulaire - * Identifiant numerique ou textuel du formulaire formidable - * @param array $valeurs - * Valeurs par défauts passées au contexte du formulaire - * 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; -} - - -/** - * Traitement du formulaire CVT de Formidable. - * - * Exécute les traitements qui sont indiqués dans la configuration des - * traitements de ce formulaire formidable. - * - * Une fois fait, gère le retour après traitements des saisies en fonction - * de ce qui a été configuré dans le formulaire, par exemple : - * - faire réafficher le formulaire, - * - faire afficher les saisies - * - rediriger sur une autre page... - * - * @param int|string $id_formulaire - * Identifiant numerique ou textuel du formulaire formidable - * @param array $valeurs - * Valeurs par défauts passées au contexte du formulaire - * 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; -} - - -/** - * Ajoute dans le contexte les elements - * donnés par une reponse de formulaire indiquée - * - * @param array $contexte - * Contexte pour le squelette HTML du formulaire - * @param int $id_formulaires_reponse - * Identifiant de réponse - * @param bool $ok - * 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; -} - -?> +<?php + +/** + * Gestion de l'affichage et traitement d'un formulaire Formidable + * + * @package SPIP\Formidable\Formulaires +**/ + +// Sécurité +if (!defined("_ECRIRE_INC_VERSION")) return; + +include_spip('inc/formidable'); +include_spip('inc/saisies'); +include_spip('base/abstract_sql'); +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 + * Identifiant numerique ou textuel du formulaire formidable + * @param array $valeurs + * Valeurs par défauts passées au contexte du formulaire + * 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['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. + * + * @param int|string $id_formulaire + * Identifiant numerique ou textuel du formulaire formidable + * @param array $valeurs + * Valeurs par défauts passées au contexte du formulaire + * 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; +} + + +/** + * Traitement du formulaire CVT de Formidable. + * + * Exécute les traitements qui sont indiqués dans la configuration des + * traitements de ce formulaire formidable. + * + * Une fois fait, gère le retour après traitements des saisies en fonction + * de ce qui a été configuré dans le formulaire, par exemple : + * - faire réafficher le formulaire, + * - faire afficher les saisies + * - rediriger sur une autre page... + * + * @param int|string $id_formulaire + * Identifiant numerique ou textuel du formulaire formidable + * @param array $valeurs + * Valeurs par défauts passées au contexte du formulaire + * 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; +} + + +/** + * Ajoute dans le contexte les elements + * donnés par une reponse de formulaire indiquée + * + * @param array $contexte + * Contexte pour le squelette HTML du formulaire + * @param int $id_formulaires_reponse + * Identifiant de réponse + * @param bool $ok + * 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; +} + +?> diff --git a/public/formidable_criteres.php b/public/formidable_criteres.php index 224cad358e9ea81ae3b0dbeaca47b2b1857112df..ef2147a362cc0edfedb115872c0e39a61e1f60b0 100644 --- a/public/formidable_criteres.php +++ b/public/formidable_criteres.php @@ -1,64 +1,64 @@ -<?php - -if (!defined("_ECRIRE_INC_VERSION")) return; - - // {tri_donnee champ} -/** - * Depuis la boucle FORMULAIRES_REPONSES, trier les résulats en fonction d'un champ - * de la table FORMULAIRES_REPONSES_CHAMPS - * {tri_selon_donnee} - * - * @global array $exceptions_des_tables - * @param string $idb - * @param array $boucles - * @param <type> $crit - * - * Auteurs : - * Antoine Pitrou - * Cedric Morin - * Renato - * @ 2005,2006 - Distribue sous licence GNU/GPL - */ - -function critere_tri_selon_donnee_dist($idb, &$boucles, $crit) { // Garder cette fontion pour compatibilité - critere_tri_selon_reponse_dist($idb, $boucles, $crit) ; -} -function critere_tri_selon_reponse_dist($idb, &$boucles, $crit) { - - $boucle = &$boucles[$idb]; - $t = $boucle->id_table; - - if ($t=='formulaires_reponses'){ - $not = $crit->not; - $_quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); - $k = count($boucle->join)+1; - $boucle->join[$k]= array($t,'id_formulaires_reponse'); - $boucle->from["L$k"]= 'spip_formulaires_reponses_champs'; - $op = array("'='", "'L$k.nom'", "_q(".$_quoi.")"); - $boucle->where[]= array("'?'","!in_array($_quoi,array('date','id_formulaires_reponse'))",$op,"''"); - $boucle->order[]= "(in_array($_quoi,array('date','id_formulaires_reponse'))?'$t.'.$_quoi:(strncmp($_quoi,'date_',5)==0?'STR_TO_DATE(L$k.valeur,\'%d/%m/%Y\')':'L$k.valeur'))".($not?".' DESC'":""); - } -} - -// {recherche_donnee} ou {recherche_donnee susan} -// Intégralement pompé et adapté de Forms&Tables -function critere_recherche_reponse_dist($idb, &$boucles, $crit) { - global $table_des_tables; - $boucle = &$boucles[$idb]; - $t = $boucle->id_table; - if ($t=='formulaires_reponses'){ - if (isset($crit->param[0])) - $_quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); - else - $_quoi = '@$Pile[0]["recherche"]'; - - $k = count($boucle->join)+1; - $boucle->join[$k]= array($t,'id_formulaires_reponse'); - $boucle->from["L$k"]= 'spip_formulaires_reponses_champs'; - $op = array("'LIKE'","'L$k.valeur'","_q(strpos($_quoi,'%')===false?'%'.".$_quoi.".'%':$_quoi)"); - $boucle->where[]= array("'?'",$_quoi,$op,"''"); - } -} - - -?> +<?php + +if (!defined("_ECRIRE_INC_VERSION")) return; + + // {tri_donnee champ} +/** + * Depuis la boucle FORMULAIRES_REPONSES, trier les résulats en fonction d'un champ + * de la table FORMULAIRES_REPONSES_CHAMPS + * {tri_selon_donnee} + * + * @global array $exceptions_des_tables + * @param string $idb + * @param array $boucles + * @param <type> $crit + * + * Auteurs : + * Antoine Pitrou + * Cedric Morin + * Renato + * @ 2005,2006 - Distribue sous licence GNU/GPL + */ + +function critere_tri_selon_donnee_dist($idb, &$boucles, $crit) { // Garder cette fontion pour compatibilité + critere_tri_selon_reponse_dist($idb, $boucles, $crit) ; +} +function critere_tri_selon_reponse_dist($idb, &$boucles, $crit) { + + $boucle = &$boucles[$idb]; + $t = $boucle->id_table; + + if ($t=='formulaires_reponses'){ + $not = $crit->not; + $_quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); + $k = count($boucle->join)+1; + $boucle->join[$k]= array($t,'id_formulaires_reponse'); + $boucle->from["L$k"]= 'spip_formulaires_reponses_champs'; + $op = array("'='", "'L$k.nom'", "_q(".$_quoi.")"); + $boucle->where[]= array("'?'","!in_array($_quoi,array('date','id_formulaires_reponse'))",$op,"''"); + $boucle->order[]= "(in_array($_quoi,array('date','id_formulaires_reponse'))?'$t.'.$_quoi:(strncmp($_quoi,'date_',5)==0?'STR_TO_DATE(L$k.valeur,\'%d/%m/%Y\')':'L$k.valeur'))".($not?".' DESC'":""); + } +} + +// {recherche_donnee} ou {recherche_donnee susan} +// Intégralement pompé et adapté de Forms&Tables +function critere_recherche_reponse_dist($idb, &$boucles, $crit) { + global $table_des_tables; + $boucle = &$boucles[$idb]; + $t = $boucle->id_table; + if ($t=='formulaires_reponses'){ + if (isset($crit->param[0])) + $_quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); + else + $_quoi = '@$Pile[0]["recherche"]'; + + $k = count($boucle->join)+1; + $boucle->join[$k]= array($t,'id_formulaires_reponse'); + $boucle->from["L$k"]= 'spip_formulaires_reponses_champs'; + $op = array("'LIKE'","'L$k.valeur'","_q(strpos($_quoi,'%')===false?'%'.".$_quoi.".'%':$_quoi)"); + $boucle->where[]= array("'?'",$_quoi,$op,"''"); + } +} + + +?>