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 :

embedded forms et form_errors


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Par défaut embedded forms et form_errors
    plop,

    J'ai un problème pour afficher les erreurs d'un formulaire embarqué : celles-ci ne s'affichent pas ds mon template via la fonction form_errors, pourtant, elles sont bien déclenchées ds le contrôleur.

    Donc
    {{ form_errors(form.performer.id) }} n'affiche rien
    mais dans mon contrôleur :
    print_r($form->getErrors()); affiche
    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
     
    Array
    (
        [0] => Symfony\Component\Form\FormError Object
            (
                [messageTemplate:protected] => performer.id value should not be blank
                [messageParameters:protected] => Array
                    (
                    )
     
            )
     
        [1] => Symfony\Component\Form\FormError Object
            (
                [messageTemplate:protected] => performer.fullname value should not be blank
                [messageParameters:protected] => Array
                    (
                    )
     
            )
     
    )

    Voici mon code
    class TimesheetForm (main form)
    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
     
    ...
    use Symfony\Component\Form\AbstractType;
    ...
    class TimesheetForm extends AbstractType
    {
        protected $translator;
     
        public function __construct(Translator $translator)
        {
            $this->translator = $translator;
        }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
                $builder->add('description', 'textarea');
     
                $userAutoCompletionType = new UserAutoCompletionType();
                $userAutoCompletionType->setUser($performer);
                $userAutoCompletionType->setTranslator($this->translator);
                $builder->add('performer', new UserAutoCompletionType(), array('data'=>$userAutoCompletionType, 'label'=>'Prestataire','property_path'=>false));
        }
    }
    class UserAutoCompletionType (embbeded form)
    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
     
     
    class UserAutoCompletionType extends AbstractType
    {
        /**
         * @Assert\NotBlank(
    	 * 		message = "performer.id value should not be blank"
    	 * )
         */
        public $id;
        /**
         * @Assert\NotBlank(
    	 * 		message = "performer.fullname value should not be blank"
    	 * )
         */
        public $fullname;
     
    	protected $translator;
    	protected $user;
     
        public function __construct()
        {
            //parent::__construct();
        }
     
    	public function setUser($user)
    	{
    		$this->user = $user;
    	}
     
    	public function setTranslator($translator)
    	{
    		$this->translator = $translator;
    	}
     
        public function buildForm(FormBuilder $builder, array $options)
        {
    		$builder->add('id', 'hidden', array('label'=>'', 'data' => ($this->user ? $this->user->getId() : null)));
    		$builder->add('fullname', null, array('label'=>'Prestataire', 'data' => ($this->user ? $this->user->getFirstname().' '.$this->user->getLastname() : '')));
     
        }   
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => '\vvv\JobBundle\Form\UserAutoCompletionType'
            );
        }
     
    	public function getName()
    	{
    		return 'user_autocompletion_form';
    	}
    }
    Et mon template
    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
     
    ...
    {% if message %}
    <p>{{ message }}</p>
    {% endif %}
    <form action="" method="post" {{ form_enctype(form) }}>
    	{{ form_label(form.status) }}{{ form_errors(form.status) }}{{ form_widget(form.status) }}
    	{# {{ form_label(form.performer_text) }}{{ form_errors(form.performer_text) }}{{ form_widget(form.performer_text) }}{{ form_widget(form.performer_id) }} #}
     
    	{{ form_label(form.performer) }}
    	{{ form_errors(form.performer) }}
    	{{ form_errors(form.performer.id) }}
    	{{ form_errors(form.performer.fullname) }}
    	{{ form_widget(form.performer.id) }}
    	{{ form_widget(form.performer.fullname) }}
     
    	{{ form_label(form.job_text) }}{{ form_errors(form.job_id) }}{{ form_widget(form.job_text) }}{{ form_widget(form.job_id) }}	
    	{{ form_label(form.description) }}{{ form_errors(form.description) }}{{ form_widget(form.description) }}
    	{{ form_label(form.realisation_date) }}{{ form_errors(form.realisation_date) }}{{ form_widget(form.realisation_date) }}
    	{{ form_label(form.realisation_time) }}{{ form_errors(form.realisation_time) }}{{ form_widget(form.realisation_time) }}
     
     
     
        {{ form_rest(form) }}    
        <input type="submit" />
    </form>
    ...
    Je n'arrive pas à cerner d'où vient le problème.
    Peut-être qu'il n'est pas possible d'afficher les erreurs d'un formulaire embarqué via la fonction twig form_errors ?

    Si vous avez une piste...

    Phil-

  2. #2
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Par défaut
    Quelqu'un a-t-il déjà eu le problème ?
    Peut-être faut il intervenir sur la fonction twig form_errors ?

  3. #3
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Et dans ton contrôler tu as quoi ?

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 97
    Par défaut
    Dans mon contrôleur, j'ai :
    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
     
    namespace vvv\JobBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Validator\Constraints;
    use vvv\JobBundle\Entity\Job;
    use vvv\JobBundle\Entity\Timesheet;
    use vvv\JobBundle\Form\TimesheetForm;
     
    class TimesheetController extends Controller
    {
    	public function createAction()
    	{
    		$message='';
    		$translator = $this->get('translator');
    		$timesheet = new Timesheet();
    		if( $user = $this->get('security.context')->getToken()->getUser() )
    			$timesheet->setPerformer($user);
    		$timesheet->setRealisationDate(new \DateTime());
    		$form = $this->container->get('form.factory')->create(new TimesheetForm($translator), $timesheet);				
    		$request = $this->container->get('request');
    		if ($request->getMethod() == 'POST') 
    		{
    			$form->bindRequest($request);
     
    			$violations = $this->container->get('validator')->validateValue($request->get('job_id'), new Constraints\NotBlank());
    			//print_r($form->getErrors());
    			//die();
    			if ($form->isValid()) 
    			{		
    				$em = $this->container->get('doctrine')->getEntityManager();
    				$data_request = $this->getRequest()->request->get('timesheet_form');
    				$performer = $em->find('vvvUserBundle:User', $data_request['performer']['id']);
    				$timesheet->setPerformer($performer);
    				$job = $em->find('vvvJobBundle:Job', $data_request['job_id']);
    				$timesheet->setJob($job);
    				try
    				{
    					$em->persist($timesheet);					
    					$em->flush();
    					$timesheet = new Timesheet();
    					$form = $this->container->get('form.factory')->create(new TimesheetForm($translator), $timesheet);
    					$this->get('session')->setFlash('message','prestation ajoutée !');
    				}
    				catch(\PDOException $e)
    				{
    					//die('Erreur : '.$e->getMessage());
    					$this->get('session')->setFlash('message',"Une erreur est survenue lors de l'enregistrement! (".$e->getMessage().")");
    				}
    			}
    		}		
     
    		return $this->container->get('templating')->renderResponse(
    			'vvvJobBundle:Timesheet:create.html.twig',
    			array(
    				'form' => $form->createView(),
    				'message' => $message
    			)
    		);
    	}
    	...
    }

Discussions similaires

  1. [1.x] Surcharge save() pour embedded form
    Par Nico_F dans le forum Symfony
    Réponses: 6
    Dernier message: 19/07/2011, 11h38
  2. [1.x] Embedded forms & bind()
    Par Nico_F dans le forum Symfony
    Réponses: 7
    Dernier message: 18/05/2011, 15h09
  3. [1.x] Embedded Forms 1 to many : ajout dynamique avec ajax
    Par rastaferraille dans le forum Symfony
    Réponses: 3
    Dernier message: 30/03/2011, 11h53
  4. [1.x] Form filter et embedded form
    Par Jeobs dans le forum Symfony
    Réponses: 9
    Dernier message: 17/09/2010, 17h52
  5. [1.x] Création d'objets avec Embeded form
    Par Adesfire dans le forum Symfony
    Réponses: 4
    Dernier message: 08/01/2010, 16h07

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