Changeset 57955 in spip-zone for _plugins_/formitable


Ignore:
Timestamp:
Feb 2, 2012, 2:51:01 PM (8 years ago)
Author:
jluc@…
Message:

le traitement 'table' reprend les développements récents + la boucle est retournée comme une chaussette.
ça marche bien.

Location:
_plugins_/formitable
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formitable/plugin.xml

    r57788 r57955  
    44        <auteur>[JLuc->http://ouhpla.net]</auteur>
    55        <licence>GPL v3</licence>
    6         <version>0.2.4</version>
     6        <version>0.3.0</version>
    77        <version_base>0.2</version_base>
    88        <etat>dev</etat>
  • _plugins_/formitable/traiter/table.php

    r57787 r57955  
    33//
    44//
    5 // - Paramétrage du traitement =
    6 //              * spécification de la table destinataire pour le formulaire
     5// - Parametrage du traitement =
     6//              * specification de la table destinataire pour le formulaire
    77//              * correspondance des champs entre formulaire et table
    88//              sous la forme d'une suite de couples champform1|champtable
    99// - Enregistrement des valeurs saisies dans la table utilisateur
    10 //
     10
    1111// Notes techniques :
    12 // La gestion des autorisations de "modification de réponses existantes" et de 'réponse multiple'
    13 // est une dupplication du traitement 'enregistrement', ce qui nécessite de remplir aussi la table
    14 // spip_reponses_formulaire, ce qui n'est pas très satisfaisant, mais sinon il faudrait modifier trop de trucs
    15 // (par contre le traitement 'simple' ne gère pas ces autorisations)
     12// La gestion des "modification de reponses existantes" est une dupplication
     13// de cette partie du traitement 'enregistrement'.
     14// Ce serait bien de mutualiser le code et la config en sortant cette partie des traitements.
    1615
    1716// Securite
    1817if (!defined("_ECRIRE_INC_VERSION")) return;
    1918
     19
    2020function traiter_table_dist($args, $retours){
    2121        include_spip('inc/formidable');
    22     include_spip ('inc/formitable');
     22    include_spip ("inc/formitable");
    2323        include_spip('base/abstract_sql');
    2424        $options = $args['options'];
    2525        $formulaire = $args['formulaire'];
    26         $id_formulaire = intval($formulaire['id_formulaire']);
     26        $id_formulaire = intval($formulaire['id_formulaire']); // quasi inutile
    2727        $saisies = unserialize($formulaire['saisies']);
    2828        $saisies = saisies_lister_par_nom($saisies);
     29
    2930
    3031    $table_destinataire = $options['table_destinataire'];
     
    3233        $correspondance_champs_formulaire_table = saisies_chaine2tableau($correspondance_champs_formulaire_table);
    3334
     35    spip_log ("========" ,'formitable');
     36    spip_log ("Traitement table pour formulaire $formulaire sur table ".$table_destinataire ,'formitable');
    3437        // La personne a-t-elle un compte ?
    3538        global $auteur_session;
    3639        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
    3740
    38         // On cherche le cookie et sinon on le crée
    39         $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
    40         if (isset($_COOKIE[$nom_cookie]))
    41                 $cookie = $_COOKIE[$nom_cookie];
    42         else {
    43                 include_spip("inc/acces");
    44                 $cookie = creer_uniqid();
    45         }
    4641
    47         // On regarde si c'est une modif d'une réponse existante
    48         $id_formulaires_reponse = intval(_request('deja_enregistre_'.$id_formulaire));
     42    // les champs "utilisateus" à insérer
     43    $champs = array();
    4944
    50         // Si la modération est a posteriori ou que la personne est un boss, on publie direct
    51         if ($options['moderation'] == 'posteriori' or autoriser('instituer', 'formulaires_reponse', $id_formulaires_reponse, null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie')))
    52                 $statut='publie';
    53         else
    54                 $statut = 'prop';
     45    // tous les champs à insérer, y compris les champs techniques
     46    $insertions = array();
    5547
    56         // Si ce n'est pas une modif d'une réponse existante, on crée d'abord la réponse
    57         if (!$id_formulaires_reponse){
    58                 $id_formulaires_reponse = sql_insertq(
    59                         'spip_formulaires_reponses',
    60                         array(
    61                                 'id_formulaire' => $id_formulaire,
    62                                 'id_auteur' => $id_auteur,
    63                                 'cookie' => $cookie,
    64                                 'ip' => $GLOBALS['ip'],
    65                                 'date' => 'NOW()',
    66                                 'statut' => $statut
    67                         )
    68                 );
     48    foreach ($correspondance_champs_formulaire_table as $nom => $colname) {
     49        spip_log ("correspondance de $nom avec $colname valeur ="._request($nom), "formitable");
     50        if (($valeur = _request($nom)) !== null){
     51            $champs[]=$nom;
     52            if (function_exists($f = 'traitement_champ_'.$table_destinataire.'_'.$colname)
     53                OR function_exists($f = 'traitement_champ_'.$colname)
     54                OR function_exists($f = 'traitement_champ'))
     55                $valeur = $f($valeur, $table_destinataire, $colname, $nom);
    6956
    70                 // Si on a pas le droit de répondre plusieurs fois ou que les réponses seront modifiables, il faut poser un cookie
    71                 if (!$options['multiple'] or $options['modifiable']){
    72                         include_spip("inc/cookie");
    73                         // Expiration dans 30 jours
    74                         spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie] = $cookie, time() + 30 * 24 * 3600);
    75                 }
    76         }
     57            $insertions[$colname] = (is_array($valeur) ? serialize($valeur) : $valeur);
     58        }
     59    }
    7760
    78         // Si l'id n'a pas été créé correctement alors erreur
    79         if (!($id_formulaires_reponse > 0)){
    80                 $retours['message_erreur'] .= "\n<br/>"._T('formidable:traiter_enregistrement_erreur_base');
    81         }
    82         // Sinon on continue à mettre a jour
    83         else {
    84                 $champs = array();
    85                 $insertions = array();
    86                 foreach($saisies as $nom => $saisie){
    87                         // On ne prend que les champs qui ont effectivement été envoyés par le formulaire
    88                         if (($valeur = _request($nom)) !== null){
    89                                 $champs[] = $nom;
    90                                 if (isset ($correspondance_champs_formulaire_table[$nom]))
    91                                         $colname = $correspondance_champs_formulaire_table[$nom];
    92                                 else {
    93                                         $retours['message_erreur'] .= "\n<br/>Erreur : le champ du formulaire ".$nom."n'a pas de correspondance d�clar�e dans la table utilisateur";
    94                                         break;
    95                                 };
     61    // Si la moderation est a posteriori ou que la personne a les autorisations nécessaire, on publie direct
     62    if ($options['champ_statut']) {
     63        if ($options['moderation'] == 'posteriori' or autoriser('instituer', $table_destinataire, 'unused', null, array('id_formulaire'=>$id_formulaire, 'nouveau_statut'=>'publie')))
     64                $statut='publie';
     65        else
     66                $statut = 'prop';
     67        $insertions[$options['champ_statut']]=$statut;
     68    }
    9669
    97 //                              echo "nom=$nom saisie=$saisie col=$colname valeur=$valeur<br>";
     70    $id_reponse_auteur_deja = 0;
     71    if ($options['champ_id_auteur'] and $options['champ_primary']) {
     72        // La personne a-t-elle un compte ?
     73        global $auteur_session;
     74        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
    9875
    99                                 // traitements des valeurs avant enregistrement : fonction de la table destinataire et du champ destination
    100                                 if (function_exists($f = 'traitement_champ_'.$table_destinataire.'_'.$colname)
    101                                         OR function_exists($f = 'traitement_champ_'.$colname)
    102                                         OR function_exists($f = 'traitement_champ'))
    103                                         $valeur = $f($valeur, $table_destinataire, $colname, $nom);
     76        $insertions[$options['champ_id_auteur']] = $id_auteur;
    10477
    105                         $insertions[$colname] = (is_array($valeur) ? serialize($valeur) : $valeur);
    106                         }
    107                 }
    108                 // On modifie l'enregistrement trouvé ou créé
    109                 $insertions['id_formulaires_reponse'] = $id_formulaires_reponse;
     78        $id_reponse_auteur_deja = sql_getfetsel ($options['champ_primary'], $table_destinataire, $options['champ_id_auteur'].'='.$id_auteur);
    11079
    111                 // S'il y a bien des choses à modifier
    112                 if ($champs) {
    113 //                      if ($modif_reponse)
    114 //                              sql_updateq ($table_destinataire, $inserts);
    115 //                      else
    116                         // On insere les nouvelles valeurs
    117                         $id= sql_insertq ($table_destinataire, $insertions);
     80    }
    11881
    119  //                     echo "sql_insertq ($table_destinataire, <pre>".print_r($inserts,1)."</pre>)";
    120                         if (!$id)       
    121                                 $retours['message_erreur'] .= "\n<br/>Erreur : l'insertion dans la table ($table_destinataire) ne se fait pas bien.".sql_error()."<pre class='reponse_formulaire_erreur'>".print_r($insertions,1)."</pre>";
    122                 };
    123         }
     82    if ($id_reponse_auteur_deja and !$options['multiple']) {
     83        $retours['message_erreur'] .= "\n<br/>"._T('Vous avez déjà répondu. Votre nouvelle réponse ne peut être prise en compte.');
     84        return $retours;
     85    }
    12486
     87
     88    // S'il y a bien des choses à modifier
     89    if (count($champs) or true) {
     90        // On insere les nouvelles valeurs
     91        $id = sql_insertq ($table_destinataire, $insertions);
     92        if (!$id)
     93            $retours['message_erreur'] .= "\n<br/>Erreur : l'insertion dans la table ($table_destinataire) ne se fait pas bien.".sql_error()."<pre class='reponse_formulaire_erreur'>".print_r($insertions,1)."</pre>";
     94    };
    12595        return $retours;
    12696}
    12797
    12898function traiter_table_update_dist($id_formulaire, $traitement, $saisies_anciennes, $saisies_nouvelles){
    129         // Si des champs ont ete supprimes, il faut supprimer les reponses a ces champs
    130         // il faut supprimer les colonnes de la table
    131         // mais cela se regle en dehors de formidable
    132         // et mettre a jour la table de correspondance
    133         // mais le plugin ne fait pas de verification au moment du changement.
     99        // à voir
    134100}
    135101
    136102?>
    137 
  • _plugins_/formitable/traiter/table.yaml

    r49171 r57955  
    11
    2 titre: 'Table utilisateur'
    3 description: 'La sauvegarde est faite dans une table utilisateur'
     2titre: 'Enregistrement dans une table utilisateur'
     3description: 'La sauvegarde est faite dans une table utilisateur, sans se référer à la table de réponse gérée par formidable'
    44options:
    55  -
     
    77    options:
    88      nom: 'table_destinataire'
    9       label: 'table destinataire'
     9      label: 'Table destinataire'
    1010      explication: 'Indiquez le nom de la table destinataire des enregistrements'
    1111  -
     
    1313    options:
    1414      nom: 'correspondance_champs_formulaire_table'
    15       label: 'correspondances du formulaire vers la table'
    16       explication : 'Indiquez pour chaque champ du formulaire, le nom du champ de la table utilisateur'
     15      label: 'Correspondances du formulaire vers la table'
     16      explication: 'Indiquez pour chaque champ du formulaire, le nom du champ de la table utilisateur'
    1717      defaut: 'input_1|titre...'
     18      rows: 6
    1819  -
    19     saisie: 'oui_non'
     20    saisie: 'input'
    2021    options:
    21       nom: 'multiple'
    22       label: '<:formidable:traiter_enregistrement_option_multiple_label:>'
    23       explication: '<:formidable:traiter_enregistrement_option_multiple_explication:>'
    24       defaut: 'on'
     22      nom: 'champ_primary'
     23      label: 'Nom de la clé primaire de votre table'
     24      explication: 'Indiquez le nom du champ contenant les id_auteurs dand la table destinataire des enregistrements'
    2525  -
    26     saisie: 'oui_non'
     26    saisie: 'input'
    2727    options:
    28       nom: 'modifiable'
    29       label: '<:formidable:traiter_enregistrement_option_modifiable_label:>'
    30       explication: '<:formidable:traiter_enregistrement_option_modifiable_explication:>'
    31       defaut: ''
     28      nom: 'champ_id_auteur'
     29      label: 'Champ id_auteur de votre table'
     30      explication: 'Indiquez le nom du champ contenant les id_auteurs dand la table destinataire des enregistrements'
     31      defaut: 'id_auteur'
    3232  -
    33     saisie: 'radio'
     33    saisie: 'input'
    3434    options:
    35       nom: 'identification'
    36       label: '<:formidable:traiter_enregistrement_option_identification_label:>'
    37       explication: '<:formidable:traiter_enregistrement_option_identification_explication:>'
    38       datas:
    39         cookie: '<:formidable:identification_par_cookie:>'
    40         id_auteur: '<:formidable:identification_par_id_auteur:>'
    41       defaut: 'cookie'
     35      nom: 'champ_statut'
     36      label: 'Champ statut'
     37      explication: 'Indiquez le nom du champ qui contient le statut de chaque enregistrement sil existe. Videz sinon.'
     38      defaut: 'statut'
    4239  -
    4340    saisie: 'radio'
     
    4946        priori: '<:bouton_radio_modere_priori:>'
    5047      defaut: 'posteriori'
     48  -
     49    saisie: 'oui_non'
     50    options:
     51      nom: 'multiple'
     52      label: '<:formidable:traiter_enregistrement_option_multiple_label:>'
     53      explication: '<:formidable:traiter_enregistrement_option_multiple_explication:>'
     54      defaut: 'on'
Note: See TracChangeset for help on using the changeset viewer.