[Résolu] Traitement d'un formulaire avant insertion dans BD

Développement d'extensions tierces
Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

[Résolu] Traitement d'un formulaire avant insertion dans BD

Messagepar rthreis » 27 Jan 2012 10:55

Bonjour à tous,

Voilà, je souhaiterai réaliser quelques vérification / manipulation aux données saisie dans mon formulaire personnalisé avant d'insérer ces données dans la BD.

J'ai cru comprendre que pour ce faire, il me fallait utiliser des HOOKS.

J'ai donc, dans le fichier config.php de mon module, inséré les lignes suivantes :

Code : Tout sélectionner

// Hooks
$GLOBALS['TL_HOOKS'] = array
(
   'processFormData' => array
   (
      array('Reservation.php', 'myProcessFormData')
   )
 );


J'ai ensuite, dans la racine du répertoire de mon module, créé un fichier nommé "Reservation.php"
Dans ce fichier, j'ai le code suivant :

Code : Tout sélectionner

<?php

public function myProcessFormData($arrPost, $arrForm, $arrFiles)
{
   
}
?>

Maintenant, trois questions se pose à moi :
1. Les données de mon formulaire, se trouve dans le tableau $arrPost ou dans $arrForm ? Pour y accéder, dois-je simplement faire un appel $arrPost['id_de_input'] ?

2. Une fois ma manipulation terminée, que dois-je faire ? Retourner une valeur ?

3. Puis directement faire l'insertion dans la base de données à partir de cette méthode / fonction ? Etant donné que j'insère les données du formulaire dans deux tables différentes (partiellement dans rs_reservation et dans rs_visite), je pense que ce serait plus simple.

En vous remerciant pour toutes l'aide que vous pourrez m'apporter afin de comprendre les subtilités des HOOKS, je vous souhaite à tous de passer une bonne journée.

ps : l'ensemble de mon module est téléchargeable ici
Dernière édition par rthreis le 24 Fév 2012 13:30, édité 2 fois.

Avatar de l’utilisateur
cyril
Site Admin
Messages : 171
Inscription : 14 Avr 2008 20:20
Localisation : Valence (Drôme)

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar cyril » 27 Jan 2012 13:38

Bonjour,

1. dans ton fichier config tu fais actuellement un appel vers un fichier php, or c'est le nom d'une classe php qui doit s'y trouver à la place :
$GLOBALS['TL_HOOKS']['processFormData'][] = array('Reservation', 'processFormData');


2. ensuite dans ton fichier Reservation.php tu crées ta classe que tu as définit dans le fichier config :

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

class Reservation extends Frontend
{
    public function processFormData($arrPost, $arrForm, $arrFiles)
    {

    }
}
?>


3. C'est avec $arrPost que tu récupères la valeur des champs, ex : $arrPost['nom_de_mon_champ']

Une fois généré en html, un formulaire créé avec le générateur de formulaire possède le préfixe auto_ devant son ID, il faut donc faire un test pour connaitre le bon formulaire. Comme tu peux avoir plusieurs formulaires dans ton site, si tu ne fais pas de test, ton hook s'appliquera à tous les formulaires.

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

class Reservation extends Frontend
{
    public function processFormData($arrPost, $arrForm, $arrFiles)
    {
        if ($arrPost['FORM_SUBMIT'] == 'auto_ID_du_formulaire')
        {
            $objDb = $this->Database->prepare(....)->execute($arrPost['nom_de_mon_champ']);
        }
    }
}
?>
Cordialement,

Cyril

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 27 Jan 2012 15:31

Merci pour cette réponse.

Alors, je me lance, tête baissée, et on verra bien ce que cela va donner.

Par contre, en lisant la réponse, je me pose la question de savoir si

Code : Tout sélectionner

$arrPost['nom_de_mon_champ']


est la valeur "name" de mon champ, ou la valeur "id".

Si c'est le name, alors je vais surement rencontré un problème dans la récupération des valeurs de mes radio.
Mais cela est une autre histoire, que je relancerai en temps utile.

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 27 Jan 2012 16:16

:?
Alors ça, c'est pas cool.

J'utilise l'extension AbidePreview pour me permettre de prévisualiser le look de mon site.

Maintenant, lorsque j'affiche un aperçu de mon site, et que je remplis le formulaire, il me redirige vers le site actuellement en ligne, qui n'a rien à voir avec le site en développement, mais qui sera écrasé par la suite, une fois le développement terminé. Comment puis-je tester mon formulaire ?

Voici le code de mon fichier nommé "Reservation.php", contenant la classe "Reservation"

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

/**
 *
 *
 *
 *
 **/
class Reservation extends Frontend
{
    public function processFormData($arrPost, $arrForm, $arrFiles)
    {
      if ($arrPost['FORM_SUBMIT'] == 'rs_reservation_42')
        {
         /*   Récupération des valeurs saisies dans le formulaire */
            $groupname = (!empty ($arrPost['groupname'])) ? strip_tags($arrPost['groupname']) : null;
         $groupaddr = (!empty($arrPost['groupaddr'])) ? strip_tags($arrPost['groupaddr']) : null;
         $grouppostal = (!empty ($arrPost['grouppostal'])) ? strip_tags($arrPost['grouppostal']) : null;
         $langue = (!empty ($arrPost['langue'])) ? $arrPost['langue'] : null;
         $participants = (!empty ($arrPost['participants'])) ? $arrPost['participants'] : 0;
         $mobred = (!empty ($arrPost['mobred'])) ? $arrPost['mobred'] : 0;
         $datevisite = (!empty ($arrPost['datevisite'])) ? ($arrPost['datevisite']) : null;
         $heurevisite = (!empty ($arrPost['heurevisite'])) ? ($arrPost['heurevisite']) : null;
         $guided = (!empty ($arrPost['guidee'])) ? $arrPost['guidee'] : 0;
         $carnaval = (!empty ($arrPost['14'])) ? $arrPost['14'] : 0;
         $cuir = (!empty ($arrPost['23'])) ? $arrPost['23'] : 0;
         $apapier = (!empty ($arrPost['15'])) ? $arrPost['15'] : 0;
         $fpapier = (!empty ($arrPost['16'])) ? $arrPost['16'] : 0;
         $tresor = (!empty ($arrPost['17'])) ? $arrPost['17'] : 0;
         $ensemble = ( !empty ($arrPost['99'])) ? $arrPost['99'] : 0;
         $respfirst = (!empty ($arrPost['respfirst'])) ? strip_tags($arrPost['respfirst']) : null;
         $resplast = (!empty ($arrPost['resplast'])) ? strip_tags($arrPost['resplast']) : null;
         $respaddr = (!empty ($arrPost['respaddr'])) ? strip_tags($arrPost['respaddr']) : null;
         $resppostal = (!empty ($arrPost['resppostal'])) ? strip_tags($arrPost['resppostal']) : null;
         $resptown = (!empty ($arrPost['resptown'])) ? strip_tags($arrPost['resptown']) : null;
         $respcountry = (!empty ($arrPost['respcountry'])) ? $arrPost['respcountry'] : null;
         $respphone = (!empty ($arrPost['respphone'])) ? strip_tags($arrPost['respphone']) : null;
         $respmail = (!empty ($arrPost['respmail'])) ? $arrPost['respmail'] : null;
         
         /* Explosion de la date et reconstruction dans le bon format */
         $explodeDate = explode("/", $datevisite);
         $reversedate = $explodeDate[2].$explodeDate[1].$explodeDate[0];
         $datevisite = $explodeDate[2].'-'.$explodeDate[1].'-'.$explodeDate[0];
         
         /* construction du code de la visite */
         $codevisite = $guided.'00'.$cuir.$tresor.$fpapier.$apapier.$carnaval;
         /* conversion des codes de visite */
         $decvisite = bindec($codevisite);
         $hexvisite = dechex($decvisite);
         
         /* récupération du nombre de visite pour la journée */
         $nbrvisite = $this->Database->prepare('SELECT id FROM reservation WHERE datevisite = ?')
                              ->execute(array( $datevisite ));
         /* incrémente le nombre de visite de 1 pour ajouter la nouvelle */
         $xiemevisite = $nbrvisite->numRows + 1;
         
         $codeReservation = $reversedate.'-'.$hexvisite.'-'.$xiemevisite;
         
         $objDB = $this->Database->prepare('INSERT INTO rs_reservation (idvisite, groupname, groupaddr, grouppostal, langue, datevisite, heurevisite, guided, participants, mobred, respfirst, resplast, respaddr, resppostal, resptown, respcountry, respphone, respmail) VALUES(:idvisite, :idgroupname, :groupaddr, :grouppostal, :langue, :datevisite, :heurevisite, :guided, :participants, :mobred, :respfirst, :resplast, :respaddr, :resppostal, :resptown, :respcountry, :respphone, :respmail)')
                           ->execute(array($codeReservation, $groupname, $groupaddr, $grouppostal, $langue, $datevisite, $heurevisite, $guided, $participants, $mobred, $respfirst, $resplast, $respaddr, $resppostal, $resptown, $respcountry, $respphone, $respmail));
         
         // $objDb = $this->Database->prepare(...)->execute($arrPost['nom_de_mon_champ']);
        }
    }
}
?>


La question que je me pose, à un moment ou un autre, je dois tout de même initialiser le $this->Database ou pas ? Est-ce qu'il en hérite ?

Donc, petite question au passage, est-il possible de gérer plusieurs sites (noms de domaine différents) avec une seule installation de Contao, sur un domaine. J'ai lu que oui, mais je souhaiterai avoir une confirmation de plus.
Exemple : j'ai un domaine admdy.be chez OVH avec un hébergement mutualisé PRO. J'ai par la suite acquis 2 noms de domaines complémentaire, à savoir malmundarium.be et malmedy-tourisme.be, pour lesquels je n'ai pas d'espace de stockage directement associé.

Avatar de l’utilisateur
iankoOol
Membre
Messages : 160
Inscription : 04 Août 2008 10:07
Localisation : Bretagne

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar iankoOol » 28 Jan 2012 09:18

Hello,

oui l'on peut avoir plusieurs sites pour une seule installation Contao.

il te faut vérifier sur le manager ovh que tes nouveaux noms de domaine pointe bien vers www (ou sous dossier) de ton serveur (là où se trouve contao).
(me souviens pas si c fait automatiquement ou s'il faut le paramètrer)

puis il te faut 1 page racine pour chaque site dans le back-off Contao/structure du site, tu pourra entrer le nom de domaine de chaque site dans la "case"/champ approprié (paramètres DNS / Nom de domaine).

Penser aussi à compléter si nécessaire le fichier .htaccess .
Graphiste / Dév - Xhtml/css/javascript/php - Faîtes-vous du bien !

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 30 Jan 2012 08:58

Je suis certainement trop une clinche.

Pas moyen de faire le test sur le Frontend, fort probablement car le site n'est pas encore en ligne, et je ne peux pas encore le mettre en ligne car son développement n'est pas fini, mais son développement ne terminera pas tant que je n'aurais pas pu tester le formulaire de demande de réservation, ...

Code : Tout sélectionner

while(1)


Blague à part, je souhaiterai obtenir une petit confirmation, et oui, une de plus.

Dans mon fichier nom_module/config/config.php j'ai simplement ajouté les lignes suivantes :

Code : Tout sélectionner

// Hooks
$GLOBALS['TL_HOOKS']['processFormData'] = array
(
   array('Reservation', 'myProcessFormData')
 );


Ensuite, j'ai créé un fichier nom_module/Reservation.php contenant ceci :

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

class Reservation extends Frontend
{
    public function myProcessFormData($arrPost, $arrForm, $arrFiles)
    {
      echo "<script language='JavaScript'>alert('dans processFormData')</script>";
      if ($arrPost['FORM_SUBMIT'] == 'rs_reservation_42')
        {
         /*   Récupération des valeurs saisies dans le formulaire */
            $groupname = (!empty ($arrPost['groupname'])) ? strip_tags($arrPost['groupname']) : null;
         $groupaddr = (!empty($arrPost['groupaddr'])) ? strip_tags($arrPost['groupaddr']) : null;
         $grouppostal = (!empty ($arrPost['grouppostal'])) ? strip_tags($arrPost['grouppostal']) : null;
         $langue = (!empty ($arrPost['langue'])) ? $arrPost['langue'] : null;
         $participants = (!empty ($arrPost['participants'])) ? $arrPost['participants'] : 0;
         $mobred = (!empty ($arrPost['mobred'])) ? $arrPost['mobred'] : 0;
         $datevisite = (!empty ($arrPost['datevisite'])) ? ($arrPost['datevisite']) : null;
         $heurevisite = (!empty ($arrPost['heurevisite'])) ? ($arrPost['heurevisite']) : null;
         $guided = (!empty ($arrPost['guidee'])) ? $arrPost['guidee'] : 0;
         $carnaval = (!empty ($arrPost['14'])) ? $arrPost['14'] : 0;
         $cuir = (!empty ($arrPost['23'])) ? $arrPost['23'] : 0;
         $apapier = (!empty ($arrPost['15'])) ? $arrPost['15'] : 0;
         $fpapier = (!empty ($arrPost['16'])) ? $arrPost['16'] : 0;
         $tresor = (!empty ($arrPost['17'])) ? $arrPost['17'] : 0;
         $ensemble = ( !empty ($arrPost['99'])) ? $arrPost['99'] : 0;
         $respfirst = (!empty ($arrPost['respfirst'])) ? strip_tags($arrPost['respfirst']) : null;
         $resplast = (!empty ($arrPost['resplast'])) ? strip_tags($arrPost['resplast']) : null;
         $respaddr = (!empty ($arrPost['respaddr'])) ? strip_tags($arrPost['respaddr']) : null;
         $resppostal = (!empty ($arrPost['resppostal'])) ? strip_tags($arrPost['resppostal']) : null;
         $resptown = (!empty ($arrPost['resptown'])) ? strip_tags($arrPost['resptown']) : null;
         $respcountry = (!empty ($arrPost['respcountry'])) ? $arrPost['respcountry'] : null;
         $respphone = (!empty ($arrPost['respphone'])) ? strip_tags($arrPost['respphone']) : null;
         $respmail = (!empty ($arrPost['respmail'])) ? $arrPost['respmail'] : null;
         
         /* Explosion de la date et reconstruction dans le bon format */
         $explodeDate = explode("/", $datevisite);
         $reversedate = $explodeDate[2].$explodeDate[1].$explodeDate[0];
         $datevisite = $explodeDate[2].'-'.$explodeDate[1].'-'.$explodeDate[0];
         
         /* construction du code de la visite */
         $codevisite = $guided.'00'.$cuir.$tresor.$fpapier.$apapier.$carnaval;
         /* conversion des codes de visite */
         $decvisite = bindec($codevisite);
         $hexvisite = dechex($decvisite);
         
         /* récupération du nombre de visite pour la journée */
         $nbrvisite = $this->Database->prepare('SELECT id FROM rs_reservation WHERE datevisite = ?')
                              ->execute(array( $datevisite ));
         /* incrémente le nombre de visite de 1 pour ajouter la nouvelle */
         $xiemevisite = $nbrvisite->numRows + 1;
         
         $codeReservation = $reversedate.'-'.$hexvisite.'-'.$xiemevisite;
         
         $objDB = $this->Database->prepare('INSERT INTO rs_reservation (idvisite, groupname, groupaddr, grouppostal, langue, datevisite, heurevisite, guided, participants, mobred, respfirst, resplast, respaddr, resppostal, resptown, respcountry, respphone, respmail) VALUES(:idvisite, :idgroupname, :groupaddr, :grouppostal, :langue, :datevisite, :heurevisite, :guided, :participants, :mobred, :respfirst, :resplast, :respaddr, :resppostal, :resptown, :respcountry, :respphone, :respmail)')
                           ->execute(array($codeReservation, $groupname, $groupaddr, $grouppostal, $langue, $datevisite, $heurevisite, $guided, $participants, $mobred, $respfirst, $resplast, $respaddr, $resppostal, $resptown, $respcountry, $respphone, $respmail));
         
         // $objDb = $this->Database->prepare(...)->execute($arrPost['nom_de_mon_champ']);
        }
    }
}
?>


Au niveau de mon code HTML généré par la fonction "compile" se trouvant dans mon fichier ModuleReservation.php, le résultat est le suivant :

Code : Tout sélectionner

<form action="index.php/demande-de-reservation/articles/demande-de-reservation.html" id="rs_reservation_42" method="post" enctype="application/x-www-form-urlencoded">
<div class="formbody">
<input type="hidden" name="FORM_SUBMIT" value="rs_reservation_42" />
<input type="hidden" name="REQUEST_TOKEN" value="9d107ea92a22bfcc598242d5ba3ada4a" />
<table>
  <tr class="row_0 row_first even">
    <td class="col_0 col_first"><label for="ctrl_groupname" class="mandatory"><span class="invisible">Champ obligatoire</span> Nom du groupe<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="groupname" id="ctrl_groupname" class="text mandatory" value="" maxlength="50"></td>
  </tr>
  <tr class="row_1 odd">
    <td class="col_0 col_first"><label for="ctrl_groupaddr" class="mandatory"><span class="invisible">Champ obligatoire</span> Adresse du groupe<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="groupaddr" id="ctrl_groupaddr" class="text mandatory" value="" maxlength="50"></td>
  </tr>
  <tr class="row_2 even">
    <td class="col_0 col_first"><label for="ctrl_grouppostal" class="mandatory"><span class="invisible">Champ obligatoire</span> Code postal du groupe<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="grouppostal" id="ctrl_grouppostal" class="text mandatory" value="" maxlength="6"></td>
  </tr>
  <tr class="row_3 odd">
    <td class="col_0 col_first"><label for="ctrl_langue" class="mandatory"><span class="invisible">Champ obligatoire</span> Langue de la visite<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><select name="langue" id="ctrl_langue" class="select mandatory"><option value="2">DE</option><option value="4">EN</option><option value="1">FR</option><option value="3">NL</option></select></td>
  </tr>
  <tr class="row_4 even">
    <td class="col_0 col_first"><label for="ctrl_datevisite" class="mandatory"><span class="invisible">Champ obligatoire</span> Date de la visite<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="datevisite" id="ctrl_datevisite" class="text mandatory" value="" maxlength="10"></td>
  </tr>
  <tr class="row_5 odd">
    <td class="col_0 col_first"><label for="ctrl_heurevisite" class="mandatory"><span class="invisible">Champ obligatoire</span> Heure de la visite<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="heurevisite" id="ctrl_heurevisite" class="text mandatory" value="" maxlength="8"></td>
  </tr>
  <tr class="row_6 even">
    <td class="col_0 col_first"><label for="ctrl_participants" class="mandatory"><span class="invisible">Champ obligatoire</span> Nombre de participants<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="participants" id="ctrl_participants" class="text mandatory" value="" maxlength="2"></td>
  </tr>
  <tr class="row_7 odd">
    <td class="col_0 col_first"><label for="ctrl_mobred">Nombre de personnes &agrave; mobilit&eacute; r&eacute;duite</label></td>
    <td class="col_1 col_last"><input type="text" name="mobred" id="ctrl_mobred" class="text" value="" maxlength="2"></td>
  </tr>
  <tr class="row_8 even">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_guided" class="checkbox_container"><legend>Visite guid&eacute;e ?</legend><input type="hidden" name="guided" value=""><span><input type="checkbox" name="guided" id="opt_guided_0" class="checkbox" value="1"> <label id="lbl_guided_0" for="opt_guided_0">Cocher la case si oui, dans le cas contraire, laisser vide.</label></span></fieldset></td>
  </tr>
  <tr class="row_9 odd">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_14" class="radio_container"><legend>Atelier Carnaval</legend><input type="hidden" name="14" value=""><span><input type="radio" name="14" id="opt_14_0" class="radio" value="OUI"> <label id="lbl_14_0" for="opt_14_0">OUI</label></span><span><input type="radio" name="14" id="opt_14_1" class="radio" value="NON"> <label id="lbl_14_1" for="opt_14_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_10 even">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_15" class="radio_container"><legend>Atelier Papier</legend><input type="hidden" name="15" value=""><span><input type="radio" name="15" id="opt_15_0" class="radio" value="OUI"> <label id="lbl_15_0" for="opt_15_0">OUI</label></span><span><input type="radio" name="15" id="opt_15_1" class="radio" value="NON"> <label id="lbl_15_1" for="opt_15_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_11 odd">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_16" class="radio_container"><legend>Atelier Papier + Fabrication</legend><input type="hidden" name="16" value=""><span><input type="radio" name="16" id="opt_16_0" class="radio" value="OUI"> <label id="lbl_16_0" for="opt_16_0">OUI</label></span><span><input type="radio" name="16" id="opt_16_1" class="radio" value="NON"> <label id="lbl_16_1" for="opt_16_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_12 even">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_17" class="radio_container"><legend>Trésor de la Cathédrale</legend><input type="hidden" name="17" value=""><span><input type="radio" name="17" id="opt_17_0" class="radio" value="OUI"> <label id="lbl_17_0" for="opt_17_0">OUI</label></span><span><input type="radio" name="17" id="opt_17_1" class="radio" value="NON"> <label id="lbl_17_1" for="opt_17_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_13 odd">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_23" class="radio_container"><legend>Atelier du Cuir</legend><input type="hidden" name="23" value=""><span><input type="radio" name="23" id="opt_23_0" class="radio" value="OUI"> <label id="lbl_23_0" for="opt_23_0">OUI</label></span><span><input type="radio" name="23" id="opt_23_1" class="radio" value="NON"> <label id="lbl_23_1" for="opt_23_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_14 even">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><fieldset id="ctrl_99" class="radio_container"><legend>Ensemble du site</legend><input type="hidden" name="99" value=""><span><input type="radio" name="99" id="opt_99_0" class="radio" value="OUI"> <label id="lbl_99_0" for="opt_99_0">OUI</label></span><span><input type="radio" name="99" id="opt_99_1" class="radio" value="NON"> <label id="lbl_99_1" for="opt_99_1">NON</label></span></fieldset></td>
  </tr>
  <tr class="row_15 odd">
    <td class="col_0 col_first"><label for="ctrl_respfirst" class="mandatory"><span class="invisible">Champ obligatoire</span> Pr&eacute;nom du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="respfirst" id="ctrl_respfirst" class="text mandatory" value="" maxlength="35"></td>
  </tr>
  <tr class="row_16 even">
    <td class="col_0 col_first"><label for="ctrl_resplast" class="mandatory"><span class="invisible">Champ obligatoire</span> Nom du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="resplast" id="ctrl_resplast" class="text mandatory" value="" maxlength="35"></td>
  </tr>
  <tr class="row_17 odd">
    <td class="col_0 col_first"><label for="ctrl_respaddr" class="mandatory"><span class="invisible">Champ obligatoire</span> Adresse du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="respaddr" id="ctrl_respaddr" class="text mandatory" value="" maxlength="35"></td>
  </tr>
  <tr class="row_18 even">
    <td class="col_0 col_first"><label for="ctrl_resppostal" class="mandatory"><span class="invisible">Champ obligatoire</span> Code postal du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="resppostal" id="ctrl_resppostal" class="text mandatory" value="" maxlength="6"></td>
  </tr>
  <tr class="row_19 odd">
    <td class="col_0 col_first"><label for="ctrl_resptown" class="mandatory"><span class="invisible">Champ obligatoire</span> Ville du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="resptown" id="ctrl_resptown" class="text mandatory" value="" maxlength="35"></td>
  </tr>
  <tr class="row_20 even">
    <td class="col_0 col_first"><label for="ctrl_respcountry" class="mandatory"><span class="invisible">Champ obligatoire</span> Code pays du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="respcountry" id="ctrl_respcountry" class="text mandatory" value="" maxlength="25"></td>
  </tr>
  <tr class="row_21 odd">
    <td class="col_0 col_first"><label for="ctrl_respphone" class="mandatory"><span class="invisible">Champ obligatoire</span> T&eacute;l&eacute;phone du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="respphone" id="ctrl_respphone" class="text mandatory" value="" maxlength="15"></td>
  </tr>
  <tr class="row_22 even">
    <td class="col_0 col_first"><label for="ctrl_respmail" class="mandatory"><span class="invisible">Champ obligatoire</span> Email du responsable<span class="mandatory">*</span></label></td>
    <td class="col_1 col_last"><input type="text" name="respmail" id="ctrl_respmail" class="text mandatory" value="" maxlength="100"></td>
  </tr>
  <tr class="row_23 odd row_last">
    <td class="col_0 col_first">&nbsp;</td>
    <td class="col_1 col_last"><div class="submit_container"><input type="submit" class="submit" value="Envoyer la demande" /></div></td>
  </tr>
</table>
</div>
</form>


Mes questions sont les suivantes :

1. Toutes ces manipulations et créations de fichiers sont-elles correctes ?
2. Est-ce bien le Hook processFormData que je dois surcharger pour pouvoir effectuer un traitement avant enregistrement dans la base de données ?
3. Disposant d'un formulaire similaire (pas encore la liste des ateliers) dans le Backend, quelle fonction dois-je surcharger pour effectuer un traitement pré-insert ?

En vous remerciant une fois de plus pour votre patience, et en vous souhaitant une bonne journée.

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 31 Jan 2012 15:02

Bon,

Grande nouvelle. Alors, j'en ai un peu ras le pipot de ne pouvoir tester correctement mon module. C'est pour cela que j'ai passer toute mon avant midi à installer une machine virtuelle Debian, installé Contao dessus, et repris quelques informations très globale pour le test de mon développement.

Maintenant, je tombe sur le message suivant lorsque j'affiche page contenant le module réservation :

Code : Tout sélectionner

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(9)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(10)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(11)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(12)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(13)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Recoverable error: Object of class DB_Mysql_Result could not be converted to string in /var/www/system/modules/reservation/ModuleReservation.php on line 322
#0 /var/www/system/modules/reservation/ModuleReservation.php(322): __error(4096, 'Object of class...', '/var/www/system...', 322, Array)
#1 /var/www/system/modules/reservation/ModuleReservation.php(236): ModuleReservation->liste_atelier(14)
#2 /var/www/system/modules/frontend/Module.php(140): ModuleReservation->compile()
#3 /var/www/system/modules/reservation/ModuleReservation.php(57): Module->generate()
#4 /var/www/system/modules/frontend/ContentModule.php(72): ModuleReservation->generate()
#5 /var/www/system/libraries/Controller.php(489): ContentModule->generate()
#6 /var/www/system/modules/frontend/ModuleArticle.php(193): Controller->getContentElement('2')
#7 /var/www/system/modules/frontend/Module.php(140): ModuleArticle->compile()
#8 /var/www/system/modules/frontend/ModuleArticle.php(71): Module->generate()
#9 /var/www/system/libraries/Controller.php(421): ModuleArticle->generate(false)
#10 /var/www/system/libraries/Controller.php(269): Controller->getArticle('reservation')
#11 /var/www/system/modules/frontend/PageRegular.php(100): Controller->getFrontendModule('0', 'main')
#12 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#13 /var/www/index.php(319): Index->run()
#14 {main}

Warning: Cannot modify header information - headers already sent by (output started at /var/www/system/functions.php:164) in /var/www/system/libraries/Template.php on line 286
#0 [internal function]: __error(2, 'Cannot modify h...', '/var/www/system...', 286, Array)
#1 /var/www/system/libraries/Template.php(286): header('Vary: User-Agen...', false)
#2 /var/www/system/modules/frontend/FrontendTemplate.php(208): Template->output()
#3 /var/www/system/modules/frontend/PageRegular.php(168): FrontendTemplate->output()
#4 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#5 /var/www/index.php(319): Index->run()
#6 {main}

Warning: Cannot modify header information - headers already sent by (output started at /var/www/system/functions.php:164) in /var/www/system/libraries/Template.php on line 287
#0 [internal function]: __error(2, 'Cannot modify h...', '/var/www/system...', 287, Array)
#1 /var/www/system/libraries/Template.php(287): header('Content-Type: t...')
#2 /var/www/system/modules/frontend/FrontendTemplate.php(208): Template->output()
#3 /var/www/system/modules/frontend/PageRegular.php(168): FrontendTemplate->output()
#4 /var/www/index.php(200): PageRegular->generate(Object(DB_Mysql_Result))
#5 /var/www/index.php(319): Index->run()
#6 {main}


Donc, pour rappel, voici mon fichier ModuleReservation.php, contenant ma classe ModuleReservation

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');
/**
 * Contao Open Source CMS
 * Copyright (C) 2005-2011 Leo Feyer
 *
 * PHP version 5
 * @copyright  Leo Feyer 2005-2011
 * @author     Leo Feyer <http://www.contao.org>
 * @package    Frontend
 * @license    LGPL
 * @filesource
 */

/**
 * Class ModuleReservation
 *
 * Front end module "Formulaire de Réservation".
 * @copyright  Raphaël Threis
 * @author     Raphaël Threis (http://www.threis.be)
 * @package    Controller
 */
class ModuleReservation extends Module
{
   /**
    * Template
    * @var string
    */
   protected $strTemplate = 'mod_reservation';

   /**
    * Return a wildcard in the back end
    * @return string
    */
   public function generate()
   {
      if (TL_MODE == 'BE')
      {
         $objTemplate = new BackendTemplate('be_wildcard');

         $objTemplate->wildcard = '### FORMULAIRE DE RESERVATION ###';
         $objTemplate->title = $this->headline;
         $objTemplate->id = $this->id;
         $objTemplate->link = $this->name;
         $objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;

         return $objTemplate->parse();
      }

      $this->editable = deserialize($this->editable);

      // Return if there are not editable fields or if there is no logged in user
      // if (!is_array($this->editable) || count($this->editable) < 1 || !FE_USER_LOGGED_IN)
      if (!FE_USER_LOGGED_IN)
      {
         return '';
      }
      return parent::generate();
   }


   /**
    * Generate module
    */
   protected function compile()
   {
      global $objPage;
      $this->import('FrontendUser', 'User');

      $GLOBALS['TL_LANGUAGE'] = $objPage->language;

      $this->loadLanguageFile('rs_reservation');
      $this->loadDataContainer('rs_reservation');

      // Call onload_callback (e.g. to check permissions)
      if (is_array($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback']))
      {
         foreach ($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback'] as $callback)
         {
            if (is_array($callback))
            {
               $this->import($callback[0]);
               $this->$callback[0]->$callback[1]();
            }
         }
      }

      // Set template
      if (strlen($this->memberTpl))
      {
         $this->Template = new FrontendTemplate($this->memberTpl);
         $this->Template->setData($this->arrData);
      }

      $this->Template->fields = '';
      $this->Template->tableless = $this->tableless;

      $arrFields = array();
      $doNotSubmit = false;
      $hasUpload = false;
      $row = 0;
      $this->Template->fieldnames = '';
      $this->Template->fieldType = '';
      $this->Template->varValue = '';

      // Build form
      // foreach ($this->editable as $field)
      foreach ($GLOBALS['TL_DCA']['rs_reservation']['fields'] as $field => $valeur)
      {
         $arrData = &$GLOBALS['TL_DCA']['rs_reservation']['fields'][$field];
         // $arrData = $field;
         // $this->Template->fieldnames .= $field.' : '.$valeur.' , ';
         
         // Map checkboxWizard to regular checkbox widget
         if ($arrData['inputType'] == 'checkboxWizard')
         {
            $arrData['inputType'] = 'checkbox';
         }

         $strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];
         // $this->Template->fieldType .= $strClass .', ';

         // Continue if the class is not defined
         if (!$this->classFileExists($strClass) || !$arrData['eval']['feEditable'])
         {
            continue;
         }

         $strGroup = $arrData['eval']['feGroup'];

         $arrData['eval']['tableless'] = $this->tableless;
         $arrData['eval']['required'] = (/*$this->User->$field == '' &&*/ $arrData['eval']['mandatory']) ? true : false;
         
         $objWidget = new $strClass($this->prepareForWidget($arrData, $field, $this->User->$field));
         
         $objWidget->storeValues = true;
         $objWidget->rowClass = 'row_'.$row . (($row == 0) ? ' row_first' : '') . ((($row % 2) == 0) ? ' even' : ' odd');

         // Increase the row count if its a password field
         if ($objWidget instanceof FormPassword)
         {
            ++$row;
            $objWidget->rowClassConfirm = 'row_'.$row . ((($row % 2) == 0) ? ' even' : ' odd');
         }

         // Validate input
         if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id)
         {
            $objWidget->validate();
            $varValue = $objWidget->value;

            $rgxp = $arrData['eval']['rgxp'];

            // Convert date formats into timestamps (check the eval setting first -> #3063)
            if (($rgxp == 'date' || $rgxp == 'time' || $rgxp == 'datim') && $varValue != '')
            {
               $objDate = new Date($varValue, $GLOBALS['TL_CONFIG'][$rgxp . 'Format']);
               $varValue = $objDate->tstamp;
            }

            // Make sure that unique fields are unique (check the eval setting first -> #3063)
            if ($arrData['eval']['unique'] && $varValue != '')
            {
               $objUnique = $this->Database->prepare("SELECT * FROM tl_member WHERE " . $field . "=? AND id!=?")
                                    ->limit(1)
                                    ->execute($varValue, $this->User->id);

               if ($objUnique->numRows)
               {
                  $objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['unique'], (strlen($arrData['label'][0]) ? $arrData['label'][0] : $field)));
               }
            }

            // Save callback
            if (is_array($arrData['save_callback']))
            {
               foreach ($arrData['save_callback'] as $callback)
               {
                  $this->import($callback[0]);

                  try
                  {
                     $varValue = $this->$callback[0]->$callback[1]($varValue, $this->User, $this);
                  }
                  catch (Exception $e)
                  {
                     $objWidget->class = 'error';
                     $objWidget->addError($e->getMessage());
                  }
               }
            }

            // Do not submit if there are errors
            if ($objWidget->hasErrors())
            {
               $doNotSubmit = true;
            }

            // Store current value
            elseif ($objWidget->submitInput())
            {
               // Set new value
               $this->User->$field = $varValue;
               $_SESSION['FORM_DATA'][$field] = $varValue;
               $varSave = is_array($varValue) ? serialize($varValue) : $varValue;

               // Save field
               $this->Database->prepare("UPDATE rs_reservation SET " . $field . "=? WHERE id=?")
                           ->execute($varSave, $this->User->id);

               // HOOK: set new password callback
               if ($objWidget instanceof FormPassword && isset($GLOBALS['TL_HOOKS']['setNewPassword']) && is_array($GLOBALS['TL_HOOKS']['setNewPassword']))
               {
                  foreach ($GLOBALS['TL_HOOKS']['setNewPassword'] as $callback)
                  {
                     $this->import($callback[0]);
                     $this->$callback[0]->$callback[1]($this->User, $varValue);
                  }
               }
            }
         }

         if ($objWidget instanceof uploadable)
         {
            $hasUpload = true;
         }

         $temp = $objWidget->parse();

         $this->Template->fields .= $temp;
         $arrFields[$strGroup][$field] .= $temp;
         ++$row;
         if( $arrData['label'][0] == $GLOBALS['TL_LANG']['rs_reservation']['guided'][0])
         {
            /* faire un appel à une fonction pour ajout des ateliers à visiter */
            // $this->Template->fields .= 'caca';
            $this->Template->fields .= $this->liste_atelier(&$row);
         }
      }

      $this->Template->hasError = $doNotSubmit;

      // Redirect or reload if there was no error
      if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id && !$doNotSubmit)
      {
         // HOOK: updated personal data
         if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
         {
            foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
            {
               $this->import($callback[0]);
               $this->$callback[0]->$callback[1]($this->User, $_SESSION['FORM_DATA']);
            }
         }
         
         $this->jumpToOrReload($this->jumpTo);
      }

      $this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
      $this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
      $this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
      $this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];

      // Add groups
      foreach ($arrFields as $k=>$v)
      {
         $this->Template->$k = $v;
      }

      $this->Template->formId = 'rs_reservation_' . $this->id;
      $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['rs_reservation']['submit']);
      $this->Template->action = $this->getIndexFreeRequest();
      $this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
      $this->Template->rowLast = 'row_' . $row . ((($row % 2) == 0) ? ' even' : ' odd');

      // HOOK: add memberlist fields
      if (in_array('memberlist', $this->Config->getActiveModules()))
      {
         $this->Template->profile = $arrFields['profile'];
         $this->Template->profileDetails = $GLOBALS['TL_LANG']['rs_reservation']['profileDetails'];
      }

      // HOOK: add newsletter fields
      if (in_array('newsletter', $this->Config->getActiveModules()))
      {
         $this->Template->newsletter = $arrFields['newsletter'];
         $this->Template->newsletterDetails = $GLOBALS['TL_LANG']['tl_member']['newsletterDetails'];
      }

      // HOOK: add helpdesk fields
      if (in_array('helpdesk', $this->Config->getActiveModules()))
      {
         $this->Template->helpdesk = $arrFields['helpdesk'];
         $this->Template->helpdeskDetails = $GLOBALS['TL_LANG']['tl_member']['helpdeskDetails'];
      }
   }
   
   /**
    * Fonction de création de la liste des ateliers
    */
   protected function liste_atelier($ligne)
   {
      $generatedCode = '';
      // Définition des variables
      $strClass = $GLOBALS['TL_FFL']['radio'];
      $arrData['inputType'] = 'radio';
      $yes = $GLOBALS['TL_LANG']['rs_reservation']['yes'];
      $no  = $GLOBALS['TL_LANG']['rs_reservation']['no'];
      $arrData['options'] = array ($yes, $no);
      $arrData['eval'] = array('mandatory'=>true, 'feEditable'=>true);
      $arrData['eval']['required'] = false;
      $arrData['eval']['tableless'] = $this->tableless;
      
      
      // requête pour récupérer tout les ateliers
      $lesateliers = $this->Database->prepare("SELECT idatelier, nomfr FROM rs_atelier order by idatelier")
                           ->execute();
      if ($lesateliers->numRows)
      {
         while ($lesateliers->next())
         {
            $arrData['label'] = $lesateliers->nomfr;
            $objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier, $this->User->$lesateliers->idatelier));
            $objWidget->rowClass = 'row_'.$ligne. ((($ligne%2) == 0) ? ' even' : ' odd');
            $generatedCode .= $objWidget->parse();
            ++$ligne;
         }
      }
      else{
         return 'ERROR : table rs_atelier empty';
      }
      return $generatedCode;
   }
}
?>


La ligne 322, est la ligne suivante

Code : Tout sélectionner

$objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier, $this->User->$lesateliers->idatelier));


Quelqu'un peut me dire pourquoi cela ne fonctionne pas correctement sur ma VM-Debian, alors que sur mon hébergement OVH, tout semble, à première vue en tout cas, s'afficher sans problème ?

En vous remerciant pour l'aide accordée, je vous souhaite une fois de plus, de passer une superbe journée...

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 01 Fév 2012 09:13

Il semble que mes erreurs viennent du fait que lors de l'appel de prepareForWidget je fasse l'appel à $this->User->...

Code : Tout sélectionner

$objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier, $this->User->$lesateliers->idatelier));


Alors que si je place l'appel en commentaire

Code : Tout sélectionner

$objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier/*, $this->User->$lesateliers->idatelier*/));


Pas de message d'erreur, et le formulaire semble être complet.

Par contre, toujours pas possible d'afficher le formulaire pour un non membre du site. Il me faut à chaque fois, sélectionner un membre dans la partie de l'aperçu.

Des idées la dessus?

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 01 Fév 2012 09:39

Alors, après avoir tout vérifier dans tous les sens, je ne comprend pas pourquoi je n'ai pas d'insertion dans ma base de données lors de la validation de mon formulaire.

Quelqu'un peut-il m'aider à comprendre pourquoi ?

D'avance je vous remercie pour l'aide que vous pourrez m'accorder.

Fichier module_path/reservation/config.php

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');

/**
 * Contao Open Source CMS
 * Copyright (C) 2005-2011 Leo Feyer
 *
 * Formerly known as TYPOlight Open Source CMS.
 *
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, please visit the Free
 * Software Foundation website at <http://www.gnu.org/licenses/>.
 *
 * PHP version 5
 * @copyright  rthreis
 * @author     Threis Raphael
 * @package    Reservation
 * @license    GPL
 * @filesource
 */

$GLOBALS[ 'BE_MOD' ][ 'reservation' ] = array
(
  'Guides' => array
  (
   'tables' => array('rs_guide'),
   'icon' => '/system/modules/reservation/guide.gif'
  ),
  'Ateliers' => array
  (
   'tables' => array('rs_atelier'),
   'icon' => '/system/modules/reservation/atelier.gif'
  ),
  'Langues' => array
  (
   'tables' => array('rs_langue'),
   'icon' => '/system/modules/reservation/langues.gif'
  ),
  'Maitrise' => array
  (
   'tables' => array('rs_maitrise')
  ),
  'Reservations' => array
  (
   'tables' => array('rs_reservation'),
   'icon' => '/system/modules/reservation/reservation.gif'
  ),
  'Guidage' => array
  (
   'tables' => array('rs_guidage')
  ),
  'Visite' => array
  (
   'tables' => array('rs_visite')
  )
);

// Front end module
array_insert($GLOBALS['FE_MOD']['miscellaneous'], 0, array
(
 'reservation' => 'ModuleReservation'
));

// Hooks
$GLOBALS['TL_HOOKS']['processFormData'][] = array('reservation', 'myProcessFormData');

?>

Fichier module_path/DCA/rs_reservation.php

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');

/**
 * Contao Open Source CMS
 * Copyright (C) 2005-2011 Leo Feyer
 *
 * Formerly known as TYPOlight Open Source CMS.
 *
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program. If not, please visit the Free
 * Software Foundation website at <http://www.gnu.org/licenses/>.
 *
 * PHP version 5
 * @copyright  rthreis
 * @author     Threis Raphael
 * @package    Reservation
 * @license    GPL
 * @filesource
 */


/**
 * Table rs_reservation
 */
$GLOBALS['TL_DCA']['rs_reservation'] = array
(

   // Config
   'config' => array
   (
      'dataContainer'               => 'Table',
      'enableVersioning'            => true,
      'onsubmit_callback'           => array
      (
         array('Reservation', 'myOnSubmit_Callback')
      )
      // 'onsubmit_callback'           => array('Reservation', 'myOnsubmit_callback')
   ),

   // List
   'list' => array
   (
      'sorting' => array
      (
         'mode'                    => 1,
         'fields'                  => array('idvisite'),
         'flag'                    => 11
      ),
      'label' => array
      (
         'fields'                  => array('idvisite','groupname'),
         'format'                  => '%s - %s'
      ),
      'operations' => array
      (
         'edit' => array
         (
            'label'               => &$GLOBALS['TL_LANG']['rs_reservation']['edit'],
            'href'                => 'act=edit',
            'icon'                => 'edit.gif'
         ),
         'copy' => array
         (
            'label'               => &$GLOBALS['TL_LANG']['rs_reservation']['copy'],
            'href'                => 'act=copy',
            'icon'                => 'copy.gif'
         ),
         'delete' => array
         (
            'label'               => &$GLOBALS['TL_LANG']['rs_reservation']['delete'],
            'href'                => 'act=delete',
            'icon'                => 'delete.gif',
            'attributes'          => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['MSC']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"'
         ),
         'show' => array
         (
            'label'               => &$GLOBALS['TL_LANG']['rs_reservation']['show'],
            'href'                => 'act=show',
            'icon'                => 'show.gif'
         )
      )
   ),
   
   

   // Palettes
   'palettes' => array
   (
      'default'                     => 'idvisite;groupname;groupaddr,grouppostal;langue;datevisite,heurevisite;guided;participants,mobred;respfirst,resplast;respaddr,resppostal,resptown;respcountry;respphone,respmail'
   ),

   // Fields
   'fields' => array
   (
      'idvisite' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['idvisite'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>false, 'maxlength'=>15,'readonly'=>true)
      ),
      'groupname' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['groupname'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>50, 'feEditable'=>true)
      ),
      'groupaddr' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['groupaddr'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>50, 'feEditable'=>true)
      ),
      'grouppostal' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['grouppostal'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>6, 'feEditable'=>true)
      ),
      'langue' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['langue'],
         'exclude'                 => true,
         'inputType'               => 'select',
         'foreignKey'           => 'rs_langue.lg',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>2, 'feEditable'=>true)
      ),
      'datevisite' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['datevisite'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>10 , 'rgxp' =>'date', 'feEditable'=>true, 'datepicker'=>$this->getDatePickerString())
      ),
      'heurevisite' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['heurevisite'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>8, 'rgxp'=>'time', 'feEditable'=>true)
      ),
      'participants' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['participants'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>2, 'feEditable'=>true)
      ),
      'mobred' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['mobred'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>false, 'maxlength'=>2, 'feEditable'=>true)
      ),
      'guided' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['guided'],
         'exclude'                 => true,
         'inputType'               => 'checkbox',
         'eval'                    => array('mandatory'=>false, 'feEditable'=>true)
      ),
      'respfirst' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['respfirst'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>35, 'feEditable'=>true)
      ),
      'resplast' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['resplast'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>35, 'feEditable'=>true)
      ),
      'respaddr' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['respaddr'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>35, 'feEditable'=>true)
      ),
      'resppostal' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['resppostal'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>6, 'feEditable'=>true)
      ),
      'resptown' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['resptown'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>35, 'feEditable'=>true)
      ),
      'respcountry' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['respcountry'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>25, 'feEditable'=>true)
      ),
      'respphone' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['respphone'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>15, 'feEditable'=>true)
      ),
      'respmail' => array
      (
         'label'                   => &$GLOBALS['TL_LANG']['rs_reservation']['respmail'],
         'exclude'                 => true,
         'inputType'               => 'text',
         'eval'                    => array('mandatory'=>true, 'maxlength'=>100, 'rgxp'=>'email', 'feEditable'=>true)
      )
   )
);

?>


Fichier module_path/ModuleReservation.php

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');
/**
 * Contao Open Source CMS
 * Copyright (C) 2005-2011 Leo Feyer
 *
 * PHP version 5
 * @copyright  Leo Feyer 2005-2011
 * @author     Leo Feyer <http://www.contao.org>
 * @package    Frontend
 * @license    LGPL
 * @filesource
 */

/**
 * Class ModuleReservation
 *
 * Front end module "Formulaire de Réservation".
 * @copyright  Raphaël Threis
 * @author     Raphaël Threis (http://www.threis.be)
 * @package    Controller
 */
class ModuleReservation extends Module
{
   /**
    * Template
    * @var string
    */
   protected $strTemplate = 'mod_reservation';

   /**
    * Return a wildcard in the back end
    * @return string
    */
   public function generate()
   {
      if (TL_MODE == 'BE')
      {
         $objTemplate = new BackendTemplate('be_wildcard');

         $objTemplate->wildcard = '### FORMULAIRE DE RESERVATION ###';
         $objTemplate->title = $this->headline;
         $objTemplate->id = $this->id;
         $objTemplate->link = $this->name;
         $objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;

         return $objTemplate->parse();
      }

      $this->editable = deserialize($this->editable);

      // Return if there are not editable fields or if there is no logged in user
      // if (!is_array($this->editable) || count($this->editable) < 1 || !FE_USER_LOGGED_IN)
      if (!FE_USER_LOGGED_IN)
      {
         return '';
      }
      return parent::generate();
   }


   /**
    * Generate module
    */
   protected function compile()
   {
      global $objPage;
      $this->import('FrontendUser', 'User');

      $GLOBALS['TL_LANGUAGE'] = $objPage->language;

      $this->loadLanguageFile('rs_reservation');
      $this->loadDataContainer('rs_reservation');

      // Call onload_callback (e.g. to check permissions)
      if (is_array($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback']))
      {
         foreach ($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback'] as $callback)
         {
            if (is_array($callback))
            {
               $this->import($callback[0]);
               $this->$callback[0]->$callback[1]();
            }
         }
      }

      // Set template
      if (strlen($this->memberTpl))
      {
         $this->Template = new FrontendTemplate($this->memberTpl);
         $this->Template->setData($this->arrData);
      }

      $this->Template->fields = '';
      $this->Template->tableless = $this->tableless;

      $arrFields = array();
      $doNotSubmit = false;
      $hasUpload = false;
      $row = 0;
      $this->Template->fieldnames = '';
      $this->Template->fieldType = '';
      $this->Template->varValue = '';

      // Build form
      // foreach ($this->editable as $field)
      foreach ($GLOBALS['TL_DCA']['rs_reservation']['fields'] as $field => $valeur)
      {
         $arrData = &$GLOBALS['TL_DCA']['rs_reservation']['fields'][$field];
         // $arrData = $field;
         // $this->Template->fieldnames .= $field.' : '.$valeur.' , ';
         
         // Map checkboxWizard to regular checkbox widget
         if ($arrData['inputType'] == 'checkboxWizard')
         {
            $arrData['inputType'] = 'checkbox';
         }

         $strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];
         // $this->Template->fieldType .= $strClass .', ';

         // Continue if the class is not defined
         if (!$this->classFileExists($strClass) || !$arrData['eval']['feEditable'])
         {
            continue;
         }

         $strGroup = $arrData['eval']['feGroup'];

         $arrData['eval']['tableless'] = $this->tableless;
         $arrData['eval']['required'] = (/*$this->User->$field == '' &&*/ $arrData['eval']['mandatory']) ? true : false;
         
         $objWidget = new $strClass($this->prepareForWidget($arrData, $field, $this->User->$field));
         
         $objWidget->storeValues = true;
         $objWidget->rowClass = 'row_'.$row . (($row == 0) ? ' row_first' : '') . ((($row % 2) == 0) ? ' even' : ' odd');

         // Increase the row count if its a password field
         if ($objWidget instanceof FormPassword)
         {
            ++$row;
            $objWidget->rowClassConfirm = 'row_'.$row . ((($row % 2) == 0) ? ' even' : ' odd');
         }

         // Validate input
         if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id)
         {
            $objWidget->validate();
            $varValue = $objWidget->value;

            $rgxp = $arrData['eval']['rgxp'];

            // Convert date formats into timestamps (check the eval setting first -> #3063)
            if (($rgxp == 'date' || $rgxp == 'time' || $rgxp == 'datim') && $varValue != '')
            {
               $objDate = new Date($varValue, $GLOBALS['TL_CONFIG'][$rgxp . 'Format']);
               $varValue = $objDate->tstamp;
            }

            // Make sure that unique fields are unique (check the eval setting first -> #3063)
            if ($arrData['eval']['unique'] && $varValue != '')
            {
               $objUnique = $this->Database->prepare("SELECT * FROM tl_member WHERE " . $field . "=? AND id!=?")
                                    ->limit(1)
                                    ->execute($varValue, $this->User->id);

               if ($objUnique->numRows)
               {
                  $objWidget->addError(sprintf($GLOBALS['TL_LANG']['ERR']['unique'], (strlen($arrData['label'][0]) ? $arrData['label'][0] : $field)));
               }
            }

            // Save callback
            if (is_array($arrData['save_callback']))
            {
               foreach ($arrData['save_callback'] as $callback)
               {
                  $this->import($callback[0]);

                  try
                  {
                     $varValue = $this->$callback[0]->$callback[1]($varValue, $this->User, $this);
                  }
                  catch (Exception $e)
                  {
                     $objWidget->class = 'error';
                     $objWidget->addError($e->getMessage());
                  }
               }
            }

            // Do not submit if there are errors
            if ($objWidget->hasErrors())
            {
               $doNotSubmit = true;
            }

            // Store current value
            elseif ($objWidget->submitInput())
            {
               // Set new value
               $this->User->$field = $varValue;
               $_SESSION['FORM_DATA'][$field] = $varValue;
               $varSave = is_array($varValue) ? serialize($varValue) : $varValue;

               // Save field
               $this->Database->prepare("UPDATE rs_reservation SET " . $field . "=? WHERE id=?")
                           ->execute($varSave, $this->User->id);

               // HOOK: set new password callback
               if ($objWidget instanceof FormPassword && isset($GLOBALS['TL_HOOKS']['setNewPassword']) && is_array($GLOBALS['TL_HOOKS']['setNewPassword']))
               {
                  foreach ($GLOBALS['TL_HOOKS']['setNewPassword'] as $callback)
                  {
                     $this->import($callback[0]);
                     $this->$callback[0]->$callback[1]($this->User, $varValue);
                  }
               }
            }
         }

         if ($objWidget instanceof uploadable)
         {
            $hasUpload = true;
         }

         $temp = $objWidget->parse();

         $this->Template->fields .= $temp;
         $arrFields[$strGroup][$field] .= $temp;
         ++$row;
         if( $arrData['label'][0] == $GLOBALS['TL_LANG']['rs_reservation']['guided'][0])
         {
            /* faire un appel à une fonction pour ajout des ateliers à visiter */
            // $this->Template->fields .= 'caca';
            $this->Template->fields .= $this->liste_atelier(&$row);
         }
      }

      $this->Template->hasError = $doNotSubmit;

      // Redirect or reload if there was no error
      if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id && !$doNotSubmit)
      {
         // HOOK: updated personal data
         if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
         {
            foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
            {
               $this->import($callback[0]);
               $this->$callback[0]->$callback[1]($this->User, $_SESSION['FORM_DATA']);
            }
         }
         
         $this->jumpToOrReload($this->jumpTo);
      }

      $this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
      $this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
      $this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
      $this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];

      // Add groups
      foreach ($arrFields as $k=>$v)
      {
         $this->Template->$k = $v;
      }

      $this->Template->formId = 'rs_reservation_' . $this->id;
      $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['rs_reservation']['submit']);
      $this->Template->action = $this->getIndexFreeRequest();
      $this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
      $this->Template->rowLast = 'row_' . $row . ((($row % 2) == 0) ? ' even' : ' odd');

      // HOOK: add memberlist fields
      if (in_array('memberlist', $this->Config->getActiveModules()))
      {
         $this->Template->profile = $arrFields['profile'];
         $this->Template->profileDetails = $GLOBALS['TL_LANG']['rs_reservation']['profileDetails'];
      }

      // HOOK: add newsletter fields
      if (in_array('newsletter', $this->Config->getActiveModules()))
      {
         $this->Template->newsletter = $arrFields['newsletter'];
         $this->Template->newsletterDetails = $GLOBALS['TL_LANG']['tl_member']['newsletterDetails'];
      }

      // HOOK: add helpdesk fields
      if (in_array('helpdesk', $this->Config->getActiveModules()))
      {
         $this->Template->helpdesk = $arrFields['helpdesk'];
         $this->Template->helpdeskDetails = $GLOBALS['TL_LANG']['tl_member']['helpdeskDetails'];
      }
   }
   
   /**
    * Fonction de création de la liste des ateliers
    */
   protected function liste_atelier($ligne)
   {
      $generatedCode = '';
      // Définition des variables
      $strClass = $GLOBALS['TL_FFL']['radio'];
      $arrData['inputType'] = 'radio';
      $yes = $GLOBALS['TL_LANG']['rs_reservation']['yes'];
      $no  = $GLOBALS['TL_LANG']['rs_reservation']['no'];
      $arrData['options'] = array ($yes, $no);
      $arrData['eval'] = array('mandatory'=>true, 'feEditable'=>true);
      $arrData['eval']['required'] = false;
      $arrData['eval']['tableless'] = $this->tableless;
      
      
      // requête pour récupérer tout les ateliers
      $lesateliers = $this->Database->prepare("SELECT idatelier, nomfr FROM rs_atelier order by idatelier")
                           ->execute();
      if ($lesateliers->numRows)
      {
         while ($lesateliers->next())
         {
            $arrData['label'] = $lesateliers->nomfr;
            $objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier/*, $this->User->$lesateliers->idatelier*/));
            $objWidget->rowClass = 'row_'.$ligne. ((($ligne%2) == 0) ? ' even' : ' odd');
            $generatedCode .= $objWidget->parse();
            ++$ligne;
         }
      }
      else{
         return 'ERROR : table rs_atelier empty';
      }
      return $generatedCode;
   }
}
?>


Fichier module_path/reservation.php

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');

class reservation extends Frontend
{
    public function myProcessFormData($arrPost, $arrForm, $arrFiles)
    {
      if ($arrPost['FORM_SUBMIT'] == 'rs_reservation_')
        {
         /*   Récupération des valeurs saisies dans le formulaire */
            $groupname = (!empty ($arrPost['groupname'])) ? strip_tags($arrPost['groupname']) : null;
         $groupaddr = (!empty($arrPost['groupaddr'])) ? strip_tags($arrPost['groupaddr']) : null;
         $grouppostal = (!empty ($arrPost['grouppostal'])) ? strip_tags($arrPost['grouppostal']) : null;
         $langue = (!empty ($arrPost['langue'])) ? $arrPost['langue'] : null;
         $participants = (!empty ($arrPost['participants'])) ? $arrPost['participants'] : 0;
         $mobred = (!empty ($arrPost['mobred'])) ? $arrPost['mobred'] : 0;
         $datevisite = (!empty ($arrPost['datevisite'])) ? ($arrPost['datevisite']) : null;
         $heurevisite = (!empty ($arrPost['heurevisite'])) ? ($arrPost['heurevisite']) : null;
         $guided = (!empty ($arrPost['guidee'])) ? $arrPost['guidee'] : 0;
         $respfirst = (!empty ($arrPost['respfirst'])) ? strip_tags($arrPost['respfirst']) : null;
         $resplast = (!empty ($arrPost['resplast'])) ? strip_tags($arrPost['resplast']) : null;
         $respaddr = (!empty ($arrPost['respaddr'])) ? strip_tags($arrPost['respaddr']) : null;
         $resppostal = (!empty ($arrPost['resppostal'])) ? strip_tags($arrPost['resppostal']) : null;
         $resptown = (!empty ($arrPost['resptown'])) ? strip_tags($arrPost['resptown']) : null;
         $respcountry = (!empty ($arrPost['respcountry'])) ? $arrPost['respcountry'] : null;
         $respphone = (!empty ($arrPost['respphone'])) ? strip_tags($arrPost['respphone']) : null;
         $respmail = (!empty ($arrPost['respmail'])) ? $arrPost['respmail'] : null;
         
         // requesting the list of rs_atelier [id]
         $objDB = $this->Database->prepare('SELECT idatelier FROM rs_atelier')
                           -> execute();
         $arrAtelier = array();
         while ($objDB->next())
         {
            $arrAtelier[] = array( $objDB->idatelier,$arrPost[$objDB->idatelier]);
         }
         
         
         /* Explosion de la date et reconstruction dans le bon format */
         $explodeDate = explode("/", $datevisite);
         $reversedate = $explodeDate[2].$explodeDate[1].$explodeDate[0];
         $datevisite = $explodeDate[2].'-'.$explodeDate[1].'-'.$explodeDate[0];
         
         /* construction du code de la visite */
         // $codevisite = $guided.'00'.$cuir.$tresor.$fpapier.$apapier.$carnaval;
         /* conversion des codes de visite */
         // $decvisite = bindec($codevisite);
         // $hexvisite = dechex($decvisite);
         
         /* récupération du nombre de visite pour la journée */
         // $nbrvisite = $this->Database->prepare('SELECT id FROM rs_reservation WHERE datevisite = ?')
                              // ->execute(array( $datevisite ));
         /* incrémente le nombre de visite de 1 pour ajouter la nouvelle */
         // $xiemevisite = $nbrvisite->numRows + 1;
         
         // $codeReservation = $reversedate.'-'.$hexvisite.'-'.$xiemevisite;
         $codeReservation='0';
         
         $objDB = $this->Database->prepare('INSERT INTO rs_reservation (idvisite, groupname, groupaddr, grouppostal, langue, datevisite, heurevisite, guided, participants, mobred, respfirst, resplast, respaddr, resppostal, resptown, respcountry, respphone, respmail) VALUES(:idvisite, :idgroupname, :groupaddr, :grouppostal, :langue, :datevisite, :heurevisite, :guided, :participants, :mobred, :respfirst, :resplast, :respaddr, :resppostal, :resptown, :respcountry, :respphone, :respmail)')
                           ->execute(array($codeReservation, $groupname, $groupaddr, $grouppostal, $langue, $datevisite, $heurevisite, $guided, $participants, $mobred, $respfirst, $resplast, $respaddr, $resppostal, $resptown, $respcountry, $respphone, $respmail));
         // get the ID of the reservation
         $idreservation = $this->Database->lastInsertId;
         // add each atelier<=>reservation in the rs_visite table only when atelier is checked
         foreach( $arrAtelier as $atelier)
         {
            if( $atelier[1] == $GLOBALS['TL_LANG']['rs_reservation']['yes'])
            {
               $objDB = $this->Database->prepare('INSERT INTO rs_visite VALUES (idvisite, idatelier) VALUES(?, ?)')
                                 ->execute($idreservation, $atelier[0]);
            }
         }
         
         // $objDB = $this->Database->prepare(...)->execute($arrPost['nom_de_mon_champ']);
        }
    }
   
   public function myOnSubmit_Callback(DataContainer $dc)
   {
      /*
       * Need to create the idReservation in order to allow sorting
       *
       */
      // Return if there is no active record (override all)
      if (!$dc->activeRecord)
      {
         return;
      }
      
      // getting all field back to local variables
      $groupname   = $dc->activeRecord->groupname;
      $groupaddr   = $dc->activeRecord->groupaddr;
      $grouppostal = $dc->activeRecord->grouppostal;
      $langue      = $dc->activeRecord->langue;
      $datevisite  = $dc->activeRecord->datevisite;
      $heurevisite = $dc->activeRecord->heurevisite;
      $guided      = $dc->activeRecord->guided;
      $participant = $dc->activeRecord->participants;
      $mobred      = $dc->activeRecord->mobred;
      $respfirst   = $dc->activeRecord->respfirst;
      $resplast    = $dc->activeRecord->resplast;
      $respaddr    = $dc->activeRecord->respaddr;
      $resppostal  = $dc->activeRecord->resppostal;
      $resptown    = $dc->activeRecord->resptown;
      $respcountry = $dc->activeRecord->respcountry;
      $respphone   = $dc->activeRecord->respphone;
      $respmail    = $dc->activeRecord->respmail;
      
      $myDate = date('y-m-d', strtotime($datevisite));
      $weekDay = date('N', strtotime($datevisite));
      if( $weekDay == 1)
      {
         exit();
      }
      
   }
}
?>


Voilà, il me semble que tous les fichiers sont présents. Une fois de plus, je vous remercie pour l'aide que vous pourrez m'accorder, et vous souhaite à tous de passer une bonne journée.

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 01 Fév 2012 14:03

Alors, j'ai une piste, mais ne sais pas pourquoi.

J'ai ajouter dans mon fichier reservation.php (depuis renommé en fe_reservation.php), ajouter l'appel

Code : Tout sélectionner

log_message('Entered myProcessFormData');

tout au début de la fonction myProcessFormData, et surprise, dans mon log, rien du tout !

Alors, bref récapitulatif :

Je souhaiterai réaliser plusieurs traitement sur les données saisies dans un formulaire AVANT que ce dernier ne soit inséré dans la base de données.
Pour ce faire, j'ai cru comprendre qu'il fallait utiliser le Hook ProcessFormData, que j'ai donc surchargé comme ceci :

Code : Tout sélectionner

// Hooks
array_insert($GLOBALS['TL_HOOKS']['processFormData'], 0, array
(
   'fe_reservation' => 'myProcessFormData'
));
dans le fichier chemin_du_module/config/config.php

Mon fichier fe_reservation.php ressemble à ceci :

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
/**
 * Files containing the myProcessFormData and myOnSubmit_Callback methods
 * @author: Threis Raphael
 * @created: 01/27/2012
 * @modified: 02/01/2012
 **/
class fe_reservation extends Frontend
{
    public function myProcessFormData($arrPost, $arrForm, $arrFiles)
    {
      log_message('Entered myProcessFormData');
      if ($arrPost['FORM_SUBMIT'] == 'rs_reservation_')
        {...


Toute idées, suggestions, remarques et n'importe quoi pouvant me mettre sur la piste est la bien venue.

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 02 Fév 2012 09:34

:D
Au moins maintenant, j'ai compris plusieurs petites choses :

1. Lorsque le formulaire est validé, l'on recharge la page appelante. En rechargeant celle-ci, on reconstruit bien évidemment le formulaire, mais en plus on correspond à la vérification suivante :

Code : Tout sélectionner

// Store current value
elseif ($objWidget->submitInput())
{

Ce qui normalement, devrais nous permettre la mise à jour du / des champs. Donc, pour vérifier que je récupère bien mes valeurs, j'ai placer un ensemble de log_message

Code : Tout sélectionner

log_message('Valeur de id: '.$this->User->id);
log_message('Valeur de field: '.$field);
log_message('Valeur de varSave: '.$varSave);


Et la surprise, id est VIDE !!

Normal me direz-vous, User est l'objet utilisateur, et non pas un objet Reservation. Dois-je donc créer une classe reservation dont j'instancie un objet pour récupérer son ID ? Si oui, comment puis-je récupérer un ID d'un élément n'existant pas encore dans la base de données ?
Il faut quand même bien que je réalise un INSERT dans ma base de données ? Puis le réaliser dans la fonction "compile" de mon fichier mod_reservation.php, ou dois-je créer l'appel dans un autre fichier ?

Avatar de l’utilisateur
rthreis
Membre
Messages : 118
Inscription : 17 Sep 2011 11:36
Localisation : Belgique

Re: Traitement d'un formulaire avant insertion dans la BD

Messagepar rthreis » 02 Fév 2012 14:46

CHAMPAGNE !!

J'ai enfin, réussi à réaliser mon insertion...

Alors, rien que pour informations, je vais vous poster le code en question de mon fichier ModuleReservation.php

Code : Tout sélectionner

<?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');
/**
 * Class ModuleReservation
 *
 * Front end module "Formulaire de Réservation".
 * @copyright  Raphaël Threis
 * @author     Raphaël Threis (http://www.threis.be)
 * @package    Controller
 */
class ModuleReservation extends Module
{
   /**
    * Template
    * @var string
    */
   protected $strTemplate = 'mod_reservation';

   /**
    * Return a wildcard in the back end
    * @return string
    */
   public function generate()
   {
      if (TL_MODE == 'BE')
      {
         $objTemplate = new BackendTemplate('be_wildcard');

         $objTemplate->wildcard = '### FORMULAIRE DE RESERVATION ###';
         $objTemplate->title = $this->headline;
         $objTemplate->id = $this->id;
         $objTemplate->link = $this->name;
         $objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id;

         return $objTemplate->parse();
      }

      $this->editable = deserialize($this->editable);

      // Return if there are not editable fields or if there is no logged in user
      // if (/*!is_array($this->editable) || count($this->editable) < 1 ||*/ !FE_USER_LOGGED_IN)
      // {
         // return '';
      // }
      return parent::generate();
   }


   /**
    * Generate module
    */
   protected function compile()
   {
      global $objPage;
      $this->import('FrontendUser', 'User');

      $GLOBALS['TL_LANGUAGE'] = $objPage->language;

      $this->loadLanguageFile('rs_reservation');
      $this->loadDataContainer('rs_reservation');

      // Call onload_callback (e.g. to check permissions)
      // if (is_array($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback']))
      // {
         // foreach ($GLOBALS['TL_DCA']['rs_reservation']['config']['onload_callback'] as $callback)
         // {
            // if (is_array($callback))
            // {
               // $this->import($callback[0]);
               // $this->$callback[0]->$callback[1]();
            // }
         // }
      // }

      // Set template
      if (strlen($this->memberTpl))
      {
         $this->Template = new FrontendTemplate($this->memberTpl);
         $this->Template->setData($this->arrData);
      }

      $this->Template->fields = '';
      $this->Template->tableless = $this->tableless;

      $arrFields = array();
      $arrPost = array();
      $arrAteliers = array();
      $CV = '';
      $doNotSubmit = false;
      $hasUpload = false;
      $row = 0;
      
      // Build form
      foreach ($GLOBALS['TL_DCA']['rs_reservation']['fields'] as $field => $valeur)
      {
         $arrData = &$GLOBALS['TL_DCA']['rs_reservation']['fields'][$field];
         
         // Map checkboxWizard to regular checkbox widget
         if ($arrData['inputType'] == 'checkboxWizard')
         {
            $arrData['inputType'] = 'checkbox';
         }

         $strClass = $GLOBALS['TL_FFL'][$arrData['inputType']];

         // Continue if the class is not defined
         if (!$this->classFileExists($strClass) || !$arrData['eval']['feEditable'])
         {
            continue;
         }

         $strGroup = $arrData['eval']['feGroup'];

         $arrData['eval']['tableless'] = $this->tableless;
         $arrData['eval']['required'] = (/*$this->User->$field == '' &&*/ $arrData['eval']['mandatory']) ? true : false;
         
         $objWidget = new $strClass($this->prepareForWidget($arrData, $field/*, $this->User->$field*/));
         
         $objWidget->storeValues = true;
         $objWidget->rowClass = 'row_'.$row . (($row == 0) ? ' row_first' : '') . ((($row % 2) == 0) ? ' even' : ' odd');

         // Increase the row count if its a password field
         if ($objWidget instanceof FormPassword)
         {
            ++$row;
            $objWidget->rowClassConfirm = 'row_'.$row . ((($row % 2) == 0) ? ' even' : ' odd');
         }

         // Validate input
         if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id)
         {
            $objWidget->validate();
            $varValue = $objWidget->value;

            $rgxp = $arrData['eval']['rgxp'];

            // Convert date formats into timestamps (check the eval setting first -> #3063)
            if (($rgxp == 'date' || $rgxp == 'time' || $rgxp == 'datim') && $varValue != '')
            {
               $objDate = new Date($varValue, $GLOBALS['TL_CONFIG'][$rgxp . 'Format']);
               $varValue = $objDate->tstamp;
            }

            // Do not submit if there are errors
            if ($objWidget->hasErrors())
            {
               $doNotSubmit = true;
            }

            // Store current value
            elseif ($objWidget->submitInput())
            {
               // log_message('passage dans $objWidget->submitInput');
               // Set new value
               $this->User->$field = $varValue;
               $_SESSION['FORM_DATA'][$field] = $varValue;
               $varSave = is_array($varValue) ? serialize($varValue) : $varValue;

               // log_message('Valeur de id: '.$this->User->id);
               // log_message('Valeur de field: '.$field);
               // log_message('Valeur de varSave: '.$varSave);
               if( $varSave!='')$arrPost[] = array($field,$varSave);
               
               // Save field
               $this->Database->prepare("UPDATE rs_reservation SET " . $field . "=? WHERE id=?")
                           ->execute($varSave, $this->User->id);
            }
         }

         if ($objWidget instanceof uploadable)
         {
            $hasUpload = true;
         }

         $temp = $objWidget->parse();

         $this->Template->fields .= $temp;
         $arrFields[$strGroup][$field] .= $temp;
         ++$row;
         if( $arrData['label'][0] == $GLOBALS['TL_LANG']['rs_reservation']['guided'][0])
         {
            /* faire un appel à une fonction pour ajout des ateliers à visiter */
            $this->Template->fields .= $this->liste_atelier(&$row, &$arrAteliers, &$CV);
         }
      }

      $this->Template->hasError = $doNotSubmit;
      
      // Redirect or reload if there was no error
      if ($this->Input->post('FORM_SUBMIT') == 'rs_reservation_' . $this->id && !$doNotSubmit)
      {
         // need to insert the form data into the database
         $insertFields = '';
         $insertValues = '';
         $arrSize = count($arrPost);
         foreach( $arrPost as $key => $valeur)
         {
            // log_message('Valeur de $key: '.$key.' $valeur[0]: '.$valeur[0].' $valeur[1]: '.$valeur[1]);
            $insertFields .= $valeur[0];
            if($valeur[0]=='datevisite')
            {
               $dateReservation = date('Y-m-d', $valeur[1]);
               $insertValues .= "'".$dateReservation."'";
            }
            elseif($valeur[0]=='heurevisite')
            {
               $insertValues .= "'".date('H:i:s', $valeur[1])."'";
            }
            else
            {
               $insertValues .= "'$valeur[1]'";
            }
            if( $key+1 < $arrSize)
            {
               $insertFields .= ', ';
               $insertValues .= ', ';
            }
         }
         
         // create the CV code
         for($i = 0; $i < 8; $i++)
         {
            if( $arrAteliers[$i][1] == $GLOBALS['TL_LANG']['rs_reservation']['yes'] ) $CV.='1';
            else $CV.='0';
         }
         $decvisite = bindec($CV);
         $hexvisite = dechex($decvisite);
         // getting value for counter in idReservation
         $result = $this->Database->prepare('SELECT count(*) as nombre from rs_reservation where datevisite='.$dateReservation)->execute();
         $result->next();
         $explodeDate = explode("-", $dateReservation);
         $reversedate = $explodeDate[2].$explodeDate[1].$explodeDate[0];
         $counter = $result->nombre+1;
         $idReservation = $explodeDate[0].$explodeDate[1].$explodeDate[2].'-'.$hexvisite.'-'.$counter;
         $insertFields = 'tstamp, idvisite, '.$insertFields;
         $insertValues = "'".time()."', '$idReservation', ".$insertValues;
         
         $result = $this->Database->prepare("INSERT INTO rs_reservation ($insertFields) VALUES($insertValues)")->execute();
         
         $dateReservation = date('Y-m-d', $arrPost[4][1]);
         
         // while for logging the ateliers checked
         $atelierSize = count($arrAteliers);
         foreach( $arrAteliers as $key => $atelier)
         {
            // log_message('Valeur de $keyatelier: '.$key.' $atelier[0]: '.$atelier[0].' atelier[1]: '.$atelier[1]);
            // check if the atelier is asked
            if( $atelier[1] == $GLOBALS['TL_LANG']['rs_reservation']['yes'] )
            {
               $result = $this->Database->prepare('INSERT INTO rs_visite (idatelier, idvisite) VALUES(?, ?)')
                                 ->execute($atelier[0], $idReservation);
            }
         }
      
         // HOOK: updated personal data
         if (isset($GLOBALS['TL_HOOKS']['updatePersonalData']) && is_array($GLOBALS['TL_HOOKS']['updatePersonalData']))
         {
            foreach ($GLOBALS['TL_HOOKS']['updatePersonalData'] as $callback)
            {
               $this->import($callback[0]);
               $this->$callback[0]->$callback[1]($this->User, $_SESSION['FORM_DATA']);
            }
         }
         
         $this->jumpToOrReload($this->jumpTo);
      }

      $this->Template->loginDetails = $GLOBALS['TL_LANG']['tl_member']['loginDetails'];
      $this->Template->addressDetails = $GLOBALS['TL_LANG']['tl_member']['addressDetails'];
      $this->Template->contactDetails = $GLOBALS['TL_LANG']['tl_member']['contactDetails'];
      $this->Template->personalData = $GLOBALS['TL_LANG']['tl_member']['personalData'];

      // Add groups
      foreach ($arrFields as $k=>$v)
      {
         $this->Template->$k = $v;
      }

      $this->Template->formId = 'rs_reservation_' . $this->id;
      $this->Template->slabel = specialchars($GLOBALS['TL_LANG']['rs_reservation']['submit']);
      $this->Template->action = $this->getIndexFreeRequest();
      $this->Template->enctype = $hasUpload ? 'multipart/form-data' : 'application/x-www-form-urlencoded';
      $this->Template->rowLast = 'row_' . $row . ((($row % 2) == 0) ? ' even' : ' odd');
   }
   
   /**
    * Fonction de création de la liste des ateliers
    */
   protected function liste_atelier($ligne, $arrAteliers)
   {
      $generatedCode = '';
      // Définition des variables
      $strClass = $GLOBALS['TL_FFL']['radio'];
      $arrData['inputType'] = 'radio';
      $yes = $GLOBALS['TL_LANG']['rs_reservation']['yes'];
      $no  = $GLOBALS['TL_LANG']['rs_reservation']['no'];
      $arrData['options'] = array ($yes, $no);
      $arrData['eval'] = array('mandatory'=>true, 'feEditable'=>true);
      $arrData['eval']['required'] = false;
      $arrData['eval']['tableless'] = $this->tableless;
      
      
      // requête pour récupérer tout les ateliers
      $lesateliers = $this->Database->prepare("SELECT idatelier, nomfr FROM rs_atelier order by idatelier")
                           ->execute();
      if ($lesateliers->numRows)
      {
         while ($lesateliers->next())
         {
            $arrData['label'] = $lesateliers->nomfr;
            $objWidget = new $strClass($this->prepareForWidget($arrData, $lesateliers->idatelier));
            $objWidget->rowClass = 'row_'.$ligne. ((($ligne%2) == 0) ? ' even' : ' odd');
            $generatedCode .= $objWidget->parse();
            $arrAteliers[] = array($lesateliers->idatelier, $this->Input->post($lesateliers->idatelier));
            ++$ligne;
         }
      }
      else{
         return 'ERROR : table rs_atelier empty';
      }
      return $generatedCode;
   }
}
?>


Je vous demanderai de ne me pas me tenir rigueur du nombre impressionnant de commentaire et de "log_message" que j'y ai déposé.

Alors, les Hooks, je ne sais pas comment vous faites, mais moi, impossible de comprendre comment cela fonctionne. Donc, étant trop null que pour comprendre, j'ai tout, mais alors là tout placer dans la fonction "compile()".

Je ne vous entend pas la derrière, moche me dites vous ? Un cours sur les hooks serait bien entendu la bienvenue.

En attendant, je vous remercie pour l'aide accordée, et vous souhaite de passer une bonne journée.

toto21
Nouveau
Messages : 4
Inscription : 22 Avr 2008 12:59
Localisation : Marseille

Re: [Résolu] Traitement d'un formulaire avant insertion dans

Messagepar toto21 » 14 Fév 2014 11:15

Une petite remarque sur l'utilisation du hook lors du test sur lequel j'ai bloqué

Code : Tout sélectionner

if ($arrPost['FORM_SUBMIT'] == 'rs_reservation_')
comme utilisé par rthreis il manque 'auto_' devant le l'ID du formulaire comme l'avait pourtant indiqué cyril ce qui donne

Code : Tout sélectionner

if ($arrPost['FORM_SUBMIT'] == 'auto_rs_reservation_')


Revenir vers « Développement d'extensions »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité