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 :

[sf 1.4.x] Ne pas enregistrer les embeded formulaires vides


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut [sf 1.4.x] Ne pas enregistrer les embeded formulaires vides
    Bonjour,

    J'ai plusieurs soucis que je n'arrive pas à résoudre avec les embeded forms.

    J'ai fait une validation "conditionnelle" en me servant du tuto advanced forms part 2.

    Une fois sur deux, et bien une fois sur deux, mon embeded form est validé même s'il est vide.

    A la première soumission du formulaire, le embeded même vide est enregistré dans la base de données et un 0 apparait dans le champ code_postal (je ne sais pas pourquoi), Si je reclique sur enregistrer, il n'est pas sauvegardé en base de données (comme prévu), si je clique une troisième fois, le zero disparait et le formulaire est sauvé en base de données et ainsi de suite.

    Le formulaire est à Null une fois sur deux si je fais un var dump dans la méthode saveEmbededForms.

    Je n'y comprends absolument rien...

    le code de mon validateur :

    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    <?php
    /*
     * Created on 28 déc. 2009
     *
     * To change the template for this generated file go to
     * Window - Preferences - PHPeclipse - PHP - Code Templates
     */
     
     
    class TiersResponsableValidatorSchema extends sfValidatorSchema
    {
     
     
    	protected function configure($options = array(), $messages = array()){
    		$this->addMessage('nom', 'Obligatoire.');
    		$this->addMessage('prenom', 'Obligatoire.');
    		$this->addMessage('adresse', 'Obligatoire.');
    		$this->addMessage('code_postal', 'Obligatoire.');
    		$this->addMessage('ville', 'Obligatoire.');
    	}
     
    	protected function doClean($values)
    		{
    		$errorSchema = new sfValidatorErrorSchema($this);
    		$erreur = false;
    		foreach($values as $key => $value)
    		{
    			$errorSchemaLocal = new sfValidatorErrorSchema($this);
    			if (isset($value['nom']) && isset($value['prenom']) && isset($value['adresse']) && isset($value['code_postal']) && isset($value['ville'])){
     
    				if ($value['nom'] || ($value['prenom'] || $value['adresse'] || $value['code_postal'] || $value['ville']))
    				{
    					if ($value['nom']) {
    						if ($erreur == false){
    							if (!$value['prenom']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'prenom');
    								$erreur = true;
    							}
    							if (!$value['adresse']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'adresse');
    								$erreur = true;
    							}
    							if(!$value['code_postal']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'code_postal');
    								$erreur = true;
    							}
    							if(!$value['ville']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'ville');
    								$erreur = true;
    							}
    						}
    					}
     
    					if ($value['prenom']) {
    						if ($erreur == false){
    							if (!$value['nom']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'nom');
    								$erreur = true;
    							}
    							if (!$value['adresse']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'adresse');
    								$erreur = true;
    							}
    							if(!$value['code_postal']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'code_postal');
    								$erreur = true;
    							}
    							if(!$value['ville']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'ville');
    								$erreur = true;
    							}
    						}
    					}
     
    					if ($value['adresse']) {
    						if ($erreur == false){
    							if (!$value['prenom']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'prenom');
    								$erreur = true;
    							}
    							if (!$value['adresse']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'nom');
    								$erreur = true;
    							}
    							if(!$value['code_postal']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'code_postal');
    								$erreur = true;
    							}
    							if(!$value['ville']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'ville');
    								$erreur = true;
    							}
    						}
    					}
     
    					if ($value['code_postal']) {
    						if ($erreur == false){
    							if (!$value['prenom']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'prenom');
    								$erreur = true;
    							}
    							if (!$value['adresse']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'adresse');
    								$erreur = true;
    							}
    							if(!$value['code_postal']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'nom');
    								$erreur = true;
    							}
    							if(!$value['ville']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'ville');
    								$erreur = true;
    							}
    						}
    					}
     
    					if ($value['ville']) {
    						if ($erreur == false){
    							if (!$value['prenom']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'prenom');
    								$erreur = true;
    							}
    							if (!$value['adresse']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'adresse');
    								$erreur = true;
    							}
    							if(!$value['code_postal']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'code_postal');
    								$erreur = true;
    							}
    							if(!$value['ville']){
    								$errorSchemaLocal->addError(new sfValidatorError($this, 'required'), 'nom');
    								$erreur = true;
    							}
    						}
    					}
     
    				}
    				// On n'enregistre pas en base les tiers responsables vides
    				//var_dump($values[$key]);
    				if (!$value['nom'] && !$value['prenom'] && !$value['adresse'] && !$value['ville'])
    				{
    					unset($values[$key]);
    				}
    			}
    			// Des erreurs dans le embeded form
    			if (count($errorSchemaLocal))
    			{
    				$errorSchema->addError($errorSchemaLocal, (string) $key);
    			}
     
     
    		}
     
    		// throws the error for the main form
    		if (count($errorSchema))
    		{
    			throw new sfValidatorErrorSchema($this, $errorSchema);
    		}
     
    		return $values;
    		}
    }
    ?>
    Le code de mon 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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    <?php
     
    /**
     * Declaration form.
     *
     * @package    declarationsAT
     * @subpackage form
     * @author     Your name here
     * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
     */
    class DeclarationForm extends BaseDeclarationForm
    {
      public function configure()
      {
     
    //	$this->setValidators(array(
    //		'date_accident'    => new sfValidatorAnd(array(), array('required' => 'Veuillez s&eacute;lectionner une date pour l\'accident')),
    //		'lieu_accident'    => new sfValidatorAnd(array(), array('required' => 'Veuillez saisir le lieu de l\'accident')),
    //		'circonstances_accident'    => new sfValidatorAnd(array(), array('required' => 'Veuillez saisir les circonstances de l\'accident')),
    //		'idregime'    => new sfValidatorAnd(array(), array('required' => 'Veuillez s&eacute;lectionner le r&eacute;gime de l\'agent')),
    //		'idsituation'    => new sfValidatorAnd(array(), array('required' => 'Veuillez saisir la situation de l\'agent')),
    //		'idvictime'    => new sfValidatorAnd(array(), array('required' => 'Veuillez s&eacute;lectionner une victime')),
    //	));
     
     
    	$this->widgetSchema['constat'] = new sfWidgetFormInputCheckbox();
    	$this->widgetSchema['accident_conteste'] = new sfWidgetFormInputCheckbox();
    	$this->widgetSchema['avec_arret'] = new sfWidgetFormInputCheckbox();
     
    	//$this->validatorSchema['date_accident'] = new sfValidatorAnd(array(), array('required' => 'Obligatoire'));
    	$this->validatorSchema['lieu_accident'] = new sfValidatorAnd(array(), array('required' => 'Obligatoire'));
    	$this->validatorSchema['circonstances_accident'] = new sfValidatorAnd(array(), array('required' => 'obligatoire'));
    	$this->validatorSchema['idregime'] = new sfValidatorAnd(array(), array('required' => 'Obligatoire'));
    	$this->validatorSchema['idsituation'] = new sfValidatorAnd(array(), array('required' => 'Obligatoire'));
     
    	$this->validatorSchema['constat'] = new sfValidatorBoolean();
    	$this->validatorSchema['accident_conteste'] = new sfValidatorBoolean();
    	$this->validatorSchema['avec_arret'] = new sfValidatorBoolean();
     
    	unset($this['date_creation'],$this['clone'],$this['iddeclaration_clone'],$this['idvictime'],$this['idetat'],$this['auteur_login'],$this['iddeclaration_clone']);
     
        $this->widgetSchema['date_premiers_soins'] = new sfWidgetFormJQueryDate(array('culture' => 'fr', 'format' => '%day%/%month%/%year%',));
    	$this->widgetSchema['date_accident'] = new sfWidgetFormJQueryDate(array('culture' => 'fr', 'format' => '%day%/%month%/%year%',));
    	$this->widgetSchema['date_transport'] = new sfWidgetFormJQueryDate(array('culture' => 'fr', 'format' => '%day%/%month%/%year%',));
     
    	$this->widgetSchema->setLabels(array('date_creation' => 'Date de cr&eacute;ation',
    					     'date_premiers_soins' => 'Date',
    					     'lieu_premiers_soins' => 'Lieu',
    					     'premiere_personne_avisee_nom'	=> 'Nom',
    					     'premiere_personne_avisee_prenom'	=> 'Pr&eacute;nom',
    					     'date_accident' => 'Date',
    					     'lieu_accident' => 'Lieu',
    					     'circonstances_accident' => 'Circonstances',
    					     'circonstances_accident' => 'Circonstances',
    					     'nature_travail' => 'Nature du travail',
    					     'date_transport' => 'Date',
    					     'heure_transport' => 'Heure',
    					     'destination_transport' => 'Destination',
    					     'intervenant_transport' => 'Intervenant',
    					     'sst_nom' => 'Nom',
    					     'sst_prenom' => 'Prenom',
    					     'avec_arret' => 'Avec Arr&ecirc;t',
    					     'Commentaire' => 'Commentaire',
    					     'nb_jours_arret' => 'Nombre de jours d\'arr&ecirc;t',
    					     'nb_jours_soin' => 'Nombre de jours de soin',
    					     'auteur_login' => 'Auteur',
    					     'accident_conteste' => 'Accident contest&eacute; ?',
    					     'constat' => 'Constat ?',
    					     'sst_prenom' => 'Prenom du SST',
    					     'clone' => 'Clone ?',
    					     'horaire_matin_debut' => 'Horaire d&eacute;but de matin&eacute;e',
    					     'horaire_matin_fin' => 'Horaire fin de matin&eacute;e',
    					     'horaire_apres_midi_debut' => 'Horaire d&eacute;but d\'apr&egrave;s midi',
    					     'horaire_apres_midi_fin' => 'Horaire fin d\'apr&egrave;s midi',
    					     'idtiersresponsable' => 'Tiers responsable',
    					     'idvictime' => 'Victime',
    					     'idtypeaccident' => 'Type d\'accident',
    					     'iddeclaration_clone' => 'Declaration (clone)',
    					     'idetat' => 'Etat',
    					     'idregime' => 'R&eacute;gime',
    					     'idsituation' => 'Situation',
    					     'asouat_idasouat' => 'AS ou AT ?',
    	));
     
     
        $subForm = new sfForm();
        $subForm2 = new sfForm();
       	$subForm3 = new sfForm();
     
       	$victime = $this->getObject()->getVictime();
       	$victimeForm = new VictimeForm($victime);
       	unset($victimeForm['idvictime']);
        $this->embedForm('victime', $victimeForm);
     
        $typeAccident = $this->getObject()->getTypeAccident();
       	$typeAccidentForm = new TypeAccidentForm($typeAccident);
       	unset($typeAccidentForm['idtypeaccident']);
        $this->embedForm('typeAccident', $typeAccidentForm);
     
    	$tiersResponsable = $this->getObject()->getTiersResponsable();
       	$tiersResponsableForm = new TiersResponsableForm($tiersResponsable);
       	unset($tiersResponsableForm['idtiersresponsable']);
        $this->embedForm('tiersResponsable', $tiersResponsableForm);
     
     
     
      	$this->mergePostValidator(new TiersResponsableValidatorSchema());
     
      }
     
    	public function bind(array $taintedValues = null, array $taintedFiles = null){
    		$ret = parent::bind($taintedValues, $taintedFiles);
    	    foreach($this->embeddedForms as $name => $form)
       			$form->bind($taintedValues[$name]);
       		return $ret;
    	}
     
    	public function saveEmbeddedForms($con = null, $forms = null)
    		{
    //		if (null === $forms)
    //		{
    //			
    //			$tiersResponsable = $this->getValue('tiersResponsable');
    //			$forms = $this->embeddedForms;
    //			if (!isset($forms['tiersResponsable']['nom']) || ($forms['tiersResponsable']['nom']->getValue() == "")){
    //				
    //				unset($forms['tiersResponsable']
    //			}
    //			
    //			
    //		}
     
    		if (null === $forms)
    		{
    			$tiersResponsable = $this->getValue('tiersResponsable');
    			$forms = $this->embeddedForms;
    				  // Le nom est obligatoire (au cas où d'autres champs 
    				 // ont été remplis. Si le nom est vide, c'est que tous les autres champs 
    				// sont vides. On ne sauve donc pas de formulaires vides dans la base de données.)
    				if (!isset($tiersResponsable["nom"]) || ($tiersResponsable["nom"]==""))
    				{
    					unset($forms['tiersResponsable']["nom"]);
    					unset($forms['tiersResponsable']["prenom"]);
    					unset($forms['tiersResponsable']["adresse"]);
    					unset($forms['tiersResponsable']["assurance"]);
    					unset($forms['tiersResponsable']["numero_vehicule"]);
    					unset($forms['tiersResponsable']["complement_adresse"]);
    					unset($forms['tiersResponsable']["code_postal"]);
    					unset($forms['tiersResponsable']["ville"]);
    					if (isset($forms['tiersResponsable']["code_postal"])){
    						var_dump($forms['tiersResponsable']["code_postal"]);
    					}
    					unset($forms['tiersResponsable']);
    				}
    		}
     
     
     
     
     
    		return parent::saveEmbeddedForms($con, $forms);
    		}
     
    }
    Le code de mon formulaire "embeded" :

    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
    <?php
     
    /**
     * TiersResponsable form.
     *
     * @package    declarationsAT
     * @subpackage form
     * @author     Your name here
     * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
     */
    class TiersResponsableForm extends BaseTiersResponsableForm
    {
      public function configure()
      {
      	$this->validatorSchema['nom']->setOption('required', false);
      	$this->validatorSchema['prenom']->setOption('required', false);
      	$this->validatorSchema['adresse']->setOption('required', false);
      	$this->validatorSchema['complement_adresse']->setOption('required', false);
      	$this->validatorSchema['code_postal']->setOption('required', false);
      	$this->validatorSchema['ville']->setOption('required', false);
      }
    }

    Pardon d'avoir mis autant de code, mais je ne sais absolument pas d'où vient le problème...

    Merci beaucoup de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut
    J'ai avancé un peu sur ce comportement étrange :

    je clique sur save avec des données remplies, tout se passe bien, le formulaire réapparaît avec les données saisies précédemment. Les données sont également bien en base de données.

    Si je re-clique ensuite sur save sans rien changer, le formulaire embarqué réapparaît vide (les données du formulaire principal sont quant à elles toujours là), et rien n'est enregistré en base de données.

    Si je clique une troisième fois, toujours sans rien changer, un objet vide (correspondant au embeded form) est sauvé en base de données...

    Je deviens dingue !!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut
    ça marche. Il me manquait l'override de la methode doSave.
    Par contre ça continue a me sauver des embeded forms vide en base quand je ne les remplis pas. Quelqu'un a une idée ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 131
    Par défaut
    Personne n'a une idée ?

  5. #5
    Membre chevronné Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Par défaut
    Je pense que le plus simple est de vérifier si le champ est vide et dans ce cas, de ne pas sauvegarder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if($this->getObject()->getChampATester() != "")
    {
      // --
      return parent::save();
    }
    Quelque chose dans le style.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/08/2010, 16h11
  2. Réponses: 0
    Dernier message: 20/11/2008, 10h08
  3. Réponses: 4
    Dernier message: 16/10/2006, 20h20
  4. Réponses: 11
    Dernier message: 16/05/2006, 12h34
  5. [MySQL] Mon livre d'or ne veut pas enregistrer les messages
    Par Invité dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/03/2006, 16h28

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