IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

formulaire et embedForm erreur de validation


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut formulaire et embedForm erreur de validation
    Bonjour,

    Je suis actuellement confronter à un problème de formulaire. Le but étant de créer un formulaire représentant les informations d'un utilisateur stocké dans la base selon son "profil" dans mon cas j'ai choisi d'utiliser les embedForm.

    Voici ma classe actions dans laquelle je génère et sauve le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class informationsActions extends sfActions
    {
      public function executeEdit(sfWebRequest $request)
      {
      	$idtiers = Doctrine::getTable('UTILISATEUR')->find($this->getUser()->getAttribute('id'))->getidtiers();
     
      	$this->form = new TIERSForm(Doctrine::getTable('TIERS')->find($idtiers));
     
      	if($this->getUser()->hasAttribute('IDAUDITEUR'))
      	{
      		$this->form->embedForm("auditeur",new AUDITEURForm(Doctrine::getTable('AUDITEUR')->find($this->getUser()->getAttribute('IDAUDITEUR'))));
      	}
      	if($this->getUser()->hasAttribute('IDCLIENT'))
      	{
        	$this->form->embedForm("client",new CLIENTForm(Doctrine::getTable('CLIENT')->find($this->getUser()->getAttribute('IDCLIENT'))));
      	}    
      	if($request->isMethod("post"))
      	{
      		$this->processForm($request, $this->form);
      	}
      }
     
      protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()));
     
        if ($form->isValid())
        {
        	$user = $form->save();
        	$this->redirect('informations/edit');
        }
     
      }
    }
    Voici mon _form.php pour le rendu du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php include_stylesheets_for_form($form) ?>
    <?php include_javascripts_for_form($form) ?>
     
    <form action="<?php echo url_for('informations/edit') ?>" method="post">
     
    	<?php echo $form->renderHiddenFields() ?>
    	<?php echo $form->renderGlobalErrors() ?>
     
    	<table style="border-collapse: separate;">
     
    	<tr>
    		<th colspan="2">Mon profil :</th>
    	</tr>
    	<tr>
    		<td class="information" colspan="2"><b>Information :</b> les champs marqu&eacute;s d'un * sont obligatoires.</td>
    	</tr>
    	<tr>
    		<th class="partie" colspan="2">Etat civil :</th>
    	</tr>
    	<tr>
    		<td class="colonne-libelle" width="150"><?php echo $form['idcivilite']->renderLabel() ?> * :</td>
    		<td class="colonne-champ" width="400"><?php echo $form['idcivilite'] ?></td>
    		<?php echo $form['idcivilite']->renderError() ?>
    	</tr>
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['nomtiers']->renderLabel() ?> * :</td>
    		<td class="colonne-champ"><?php echo $form['nomtiers'] ?></td>
    		<td><?php echo $form['nomtiers']->renderError() ?></td>
    	</tr>
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['prenomtiers']->renderLabel() ?>  :</td>
    		<td class="colonne-champ"><?php echo $form['prenomtiers'] ?></td>
    		<?php echo $form['prenomtiers']->renderError() ?>
    	</tr>
    	<tr>
    		<th class="partie" colspan="2">Contact :</th>
    	</tr>
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['emailtiers']->renderLabel() ?>  :</td>
    		<td class="colonne-champ"><?php echo $form['emailtiers'] ?></td>
    		<?php echo $form['emailtiers']->renderError() ?>
    	</tr>
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['numtelephone1tiers']->renderLabel() ?>  :</td>
    		<td class="colonne-champ"><?php echo $form['numtelephone1tiers'] ?></td>
    		<?php echo $form['numtelephone1tiers']->renderError() ?>
    	</tr>
     
    	<!-- Affichage du formulaire pour un auditeur -->
    	<?php if ($user->hasAttribute('IDAUDITEUR')): ?>
    	<tr>
    		<th class="partie" colspan="2">Infos Auditeur:</th>
    	</tr>
     
    	<?php endif; ?>
     
    	<!-- Affichage du formulaire pour un client -->
    	<?php if ($user->hasAttribute('IDCLIENT')): ?>
    	<tr>
    		<th class="partie" colspan="2">Infos Client:</th>
    	</tr>
     
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['client']['idconditionpaiement']->renderLabel() ?> * :</td>
    		<td class="colonne-champ"><?php echo $form['client']['idconditionpaiement'] ?></td>
    		<?php echo $form['client']['idconditionpaiement']->renderError() ?>
    	</tr>
    	<tr>
    		<td class="colonne-libelle"><?php echo $form['client']['siretclient']->renderLabel() ?>  :</td>
    		<td class="colonne-champ"><?php echo $form['client']['siretclient'] ?></td>
    		<?php echo $form['client']['siretclient']->renderError() ?>
    	</tr>
     
    	<?php endif; ?>
     
    </table>
     
    	<input type="submit" value="Mettre &agrave; jour mon profil" />
     
    </form>
    Enfin voici mon fichier TIERSForm.class.php et EditSuccess.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <?php
     
    /**
     * TIERS form.
     *
     * @package    form
     * @subpackage TIERS
     * @version    SVN: $Id: sfDoctrineFormTemplate.php 6174 2007-11-27 06:22:40Z fabien $
     */
    class TIERSForm extends BaseTIERSForm
    {
      public function configure()
      {
      	unset($this['descriptiontiers'],$this['commentairetiers']
      	,$this['idformateur'],$this['idville'],$this['vil_idville']
      	,$this['idprospect'],$this['idfinanceur']
      	,$this['idpartenaire'],$this['idorganismeaccueil']);
     
      	$years = range(date('Y') - 70 , date('Y') );
     
      	$this->setWidgets(array(
          'idtiers'                => new sfWidgetFormInputHidden(),
      	  'idcivilite'             => new sfWidgetFormDoctrineChoice(array('model' => 'CIVILITE', 'add_empty' => false)),
          'nomtiers'               => new sfWidgetFormInput(),
          'acedextiers'            => new sfWidgetFormInput(),
          'prenomtiers'            => new sfWidgetFormInput(),
          'datenaissancetiers'     => new sfWidgetFormDate(array('years'=>array_combine($years, $years))),
          'adressetiers'           => new sfWidgetFormInput(),
          'complementadressetiers' => new sfWidgetFormInput(),
          'bptiers'                => new sfWidgetFormInput(),
      	  'acedextiers'            => new sfWidgetFormInputCheckbox(),
          'cedextiers'             => new sfWidgetFormInput(),
          'emailtiers'             => new sfWidgetFormInput(),
          'numtelephone1tiers'     => new sfWidgetFormInput(),
          'numtelephone2tiers'     => new sfWidgetFormInput(),
          'numfaxtiers'            => new sfWidgetFormInput(),
      	  'idauditeur'             => new sfWidgetFormInputHidden(),
          'idclient'               => new sfWidgetFormInputHidden(),
        ));
     
        $this->widgetSchema->setLabels(array(
          'idtiers'                => 'Tiers',
    	  'idcivilite'             => 'Civilit&eacute;',
          'nomtiers'               => 'Nom',
          'prenomtiers'            => 'Pr&eacute;nom',
          'datenaissancetiers'     => 'Date de naissance',
          'adressetiers'           => 'Adresse',
          'complementadressetiers' => 'Compl&eacute;ment adresse',
          'bptiers'                => 'BP',
          'acedextiers'            => 'Cedex',
          'cedextiers'             => 'n&deg cedex',
          'emailtiers'             => 'Email',
          'numtelephone1tiers'     => 'n&deg; de t&eacute;l&eacute;phone',
          'numtelephone2tiers'     => 'n&deg; de t&eacute;l&eacute;phone alt',
          'numfaxtiers'            => 'Fax',
        ));
     
        $this->setValidators(array(
          'idtiers'                => new sfValidatorDoctrineChoice(array('model' => 'TIERS', 'column' => 'idtiers', 'required' => true)),
          'idcivilite'             => new sfValidatorDoctrineChoice(array('model' => 'CIVILITE', 'column' => 'idcivilite' , 'required' => true)),
          'nomtiers'               => new sfValidatorString(array('max_length' => 255, 'required' => true),array('required' => 'Veuillez saisir votre nom')),
          'prenomtiers'            => new sfValidatorString(array('max_length' => 255, 'required' => false)),
          'datenaissancetiers'     => new sfValidatorDate(array('required' => false)),
          'adressetiers'           => new sfValidatorString(array('max_length' => 255, 'required' => false)),
          'complementadressetiers' => new sfValidatorString(array('max_length' => 255, 'required' => false)),
          'bptiers'                => new sfValidatorString(array('max_length' => 20, 'required' => false)),
          'acedextiers'            => new sfValidatorInteger(array('required' => false)),
          'cedextiers'             => new sfValidatorString(array('max_length' => 20, 'required' => false)),
          'emailtiers'             => new sfValidatorString(array('max_length' => 255, 'required' => false)),
          'numtelephone1tiers'     => new sfValidatorString(array('max_length' => 30, 'required' => false)),
          'numtelephone2tiers'     => new sfValidatorString(array('max_length' => 30, 'required' => false)),
          'numfaxtiers'            => new sfValidatorString(array('max_length' => 30, 'required' => false)),
          'idauditeur'             => new sfValidatorDoctrineChoice(array('model' => 'AUDITEUR', 'required' => false)),
          'idclient'               => new sfValidatorDoctrineChoice(array('model' => 'CLIENT', 'required' => false)),
        ));
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <?php use_stylesheet('template.css') ?>
     
    <?php include_partial('form', array('form'=>$form,'user'=>$sf_user)) ?>
    Malgré mes efforts le formulaire reste impossible à enregistrer que ce soit avec un tiers disposant du statut d'auditeur ou d'un tiers sans aucun statut.

    Le premier affichage se fait sans problème et avec les bonnes informations mais dès la soumission de mon formulaire aucun de mes validateurs ne passe, les erreur suivante s'affichent :

    * Tiers: Required.
    * csrf token: Required.
    * Required.
    * Veuillez saisir votre nom
    Si quelqu'un à une solution je suis preneur.

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 117
    Par défaut
    Si je suis bien ton raisonnement tu prend les informations d'une des tables en fonction de l'Id Utilisateur.

    Pour cela c'est bien mais dans chaque table tu dois avoir un id et un csrf_token pour tes formulaires...

    Essaye ca dans ton _form.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php echo $form['id'] ?>
    <?php echo $form['_csrf_token']; ?>
    Je pense que cela va te régler déjà un problème

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Effectivement j'ai cru à une erreur de ce type mais le fait est que mes champs idXXXXX et _csrf_token son des "sfWidgetFormInputHidden()" et leur rendu avec les bonnes valeurs insérer est réaliser par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo $form->renderHiddenFields() ?>
    Je pense que l'erreur vient plus du fait que certains champ du formulaire ne sont ni afficher ni mis dans le "unset" de ma classe formulaire, je vais faire un essaie et je te tien au courant

    Bon le fait que tous les champ qui ne sont pas afficher/utiliser soit en unset ne change rien à mes erreurs actuelles.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Je ne sais pas si cela est la cause de mon problème de validation mais lors de la soumission de mon formulaire j'obtiens le warning suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in /usr/share/php/symfony/util/sfParameterHolder.class.php on line 53
    Le lien situer entre les [] me renvoie vers une erreur 404 don l'intitulé est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Empty module and/or action after parsing the URL "/informations/function.array-key-exists" (/).
    Voila si quelqu'un à une piste ou une idée je l'en remercie

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 117
    Par défaut
    Tu as regardé dans ton code source de ton navigateur si tu avais bien le champ id de ta table et le csrf_token?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Oui grâce a la barre de débug de symfony je peut voir que tout les paramètres de mon formulaire et leur valeur son présent dans "Request" et "Global post: ... "

Discussions similaires

  1. Gérer les erreurs de validation d'un formulaire
    Par laloune dans le forum Langage
    Réponses: 6
    Dernier message: 04/12/2013, 09h32
  2. [2.x] affichage d'erreur de validation d'un formulaire Symfony2.1
    Par encours dans le forum Symfony
    Réponses: 8
    Dernier message: 06/12/2012, 09h22
  3. Réponses: 3
    Dernier message: 05/04/2012, 14h52
  4. Réponses: 8
    Dernier message: 22/04/2011, 21h27
  5. [DOM] Erreur pour valider une DTD
    Par lenghh dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 19/05/2004, 18h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo