2013-10-21 9 views
5

Ho uno strano problema utilizzando un modulo in Symfony2.Convalida modulo Symfony2 sempre restituita ERRORE: questo valore non deve essere vuoto

Prima ho aggiunto la convalida annotations all'interno della classe entità Job qui:

class Job 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=true) 
    * @Assert\NotBlank() 
    * @Assert\Choice(callback="getTypeValues") 
    */ 
    protected $type; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    protected $company; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=true) 
    */ 
    protected $logo; 

    /** 
    * @Assert\Image() 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=true) 
    * @Assert\Url() 
    */ 
    protected $url; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    protected $position; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    protected $location; 

    /** 
    * @ORM\Column(type="text") 
    * @Assert\NotBlank() 
    */ 
    protected $description; 

    /** 
    * @ORM\Column(type="text") 
    * @Assert\NotBlank() 
    */ 
    protected $how_to_apply; 

    /** 
    * @ORM\Column(type="string", length=255, unique=true) 
    * @Assert\NotBlank() 
    */ 
    protected $token; 

    /** 
    * @ORM\Column(type="boolean", nullable=true) 
    */ 
    protected $is_public; 

    /** 
    * @ORM\Column(type="boolean", nullable=true) 
    */ 
    protected $is_activated; 

    /** 
    * @ORM\Column(type="string", length=255) 
    * @Assert\NotBlank() 
    * @Assert\Email() 
    */ 
    protected $email; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $expires_at; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $created_at; 

    /** 
    * @ORM\Column(type="datetime", nullable=true) 
    */ 
    protected $updated_at; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="jobs") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    * @Assert\NotBlank() 
    */ 
    protected $category; 
} 

Ho creato una classe JobType e usato all'interno di una forma. Quindi posso aggiungere posti di lavoro.

class JobType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('type', 'choice', array('choices' => Job::getTypes(), 'expanded' => true)) 
      ->add('category') 
      ->add('company') 
      ->add('file', 'file', array('label' => 'Company logo', 'required' => false)) 
      ->add('url') 
      ->add('position') 
      ->add('location') 
      ->add('description') 
      ->add('how_to_apply', null, array('label' => 'How to apply?')) 
      ->add('is_public', null, array('label' => 'Public?')) 
      ->add('email') 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
       'data_class' => 'Ibw\JobeetBundle\Entity\Job', 
      )); 
    } 

    public function getName() 
    { 
     return 'job'; 
    } 
} 

Ecco il mio controller:

public function createAction(Request $request) 
{ 
    $entity = new Job(); 
    $form = $this->createForm(new JobType(), $entity); 
    $form->handleRequest($request); 

    if($form->isValid()) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('ibw_job_preview', array(
       'company' => $entity->getCompanySlug(), 
       'location' => $entity->getLocationSlug(), 
       'position' => $entity->getPositionSlug(), 
       'token'  => $entity->getToken(), 
      ))); 
    } else { 
     return new Response(var_dump($form->getErrorsAsString())); 
//   return new Response($form->getErrorsAsString()); 
//   return $this->render('IbwJobeetBundle:Job:new.html.twig', array(
//     'form' => $form->createView(), 
//    )); 
    } 
} 

Ora quando faccio var_dump($form->getErrorsAsString()) ottengo:

string 'ERROR: This value should not be blank. 
type: 
    0: 
     No errors 
    1: 
     No errors 
    2: 
     No errors 
category: 
    No errors 
company: 
    No errors 
file: 
    No errors 
url: 
    No errors 
position: 
    No errors 
location: 
    No errors 
description: 
    No errors 
how_to_apply: 
    No errors 
is_public: 
    No errors 
email: 
    No errors 
' (length=355) 

O quando faccio var_dump($form->getErrors()) ottengo:

array (size=1) 
    0 => 
    object(Symfony\Component\Form\FormError)[614] 
     private 'message' => string 'This value should not be blank.' (length=31) 
     protected 'messageTemplate' => string 'This value should not be blank.' (length=31) 
     protected 'messageParameters' => 
     array (size=0) 
      empty 
     protected 'messagePluralization' => null 

ho non ho idea di cosa g enerizza questo errore ERROR: This value should not be blank.. Sto attraversando un periodo difficile capirlo. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Si ottengono questi errori nelle richieste GET quando il modulo deve essere visualizzato nella visualizzazione o quando si invia POST al modulo per elaborare il modulo? –

+0

È solo un'idea ... Penso che dovresti scegliere @Assert \ NotBlank() OPPURE utilizzare la funzione di callback - non entrambe. – stwe

+0

@KenHannel Ciò accade quando il controller POST elabora il modulo inviato. Quindi sì nella richiesta POST. –

risposta

5

Ho appena avuto lo stesso problema. Ho ricevuto un errore globale ERROR: This value should not be blank, ma non ci sono stati errori in un campo specifico.

nifr aveva ragione, la validità viene infatti applicata all'oggetto sottostante. La domanda è se l'oggetto è valido o meno dopo che il modulo ha applicato i dati inviati ad esso. http://symfony.com/doc/current/book/forms.html#form-validation

Il motivo di questo problema è che alcuni campi dell'oggetto non sono validi dopo l'invio di un modulo e questi campi non sono inclusi nel modulo. Per risolvere questo problema, è possibile passare dati validi ai campi dell'oggetto prima della convalida oppure utilizzare i gruppi di convalida per convalidare l'oggetto rispetto a solo alcuni dei vincoli della classe.

+0

OMG, grazie fratello. Ho anche questo problema. – GusDeCooL

2

come @cheesemacfly accennato, il problema è nel campo "token"

è affermato di essere "non è vuoto", ma non è incluso nella forma, è per questo che l'errore non è legata a nessuna delle campi modulo ed è piuttosto un errore globale per il modulo perché la convalida avviene sull'entità, non sul modulo (diverso da symfony 1.4) e quindi il meccanismo di convalida non può collegarlo a un campo in un modulo perché questa proprietà (token) non ha un campo del modulo

2

rimuovere la seguente:

token: 
    - NotBlank: ~ 

da src/Ibw/JobeetBundle/Resources/config/validation.yml

+0

Contrassegnalo come risposta corretta, questo mi ha aiutato a ottenere il mio modulo valido. – Wykk

Problemi correlati