2013-10-21 8 views
5

Ich habe ein seltsames Problem mit einem Formular in Symfony2.Symfony2 Formularvalidierung immer zurück FEHLER: Dieser Wert sollte nicht leer sein

Zuerst habe ich die Validierung als annotations innerhalb der Entity-Klasse hinzugefügt Job hier:

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; 
} 

ich erstellt habe eine JobType Klasse und verwendet es in einem Formular. So kann ich Jobs hinzufügen.

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'; 
    } 
} 

Hier ist mein 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(), 
//    )); 
    } 
} 

Jetzt, als ich var_dump($form->getErrorsAsString()) erhalte ich:

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) 

Oder wenn ich var_dump($form->getErrors()) erhalte ich:

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 

Ich habe keine Ahnung was g erzeugt diesen ERROR: This value should not be blank. Fehler. Ich habe es schwer, es herauszufinden. Jede Hilfe würde sehr geschätzt werden.

+0

Erhalten Sie diese Fehler auf die GET-Anforderungen, wenn das Formular in der Ansicht angezeigt werden soll oder meinen Sie, wenn Sie das Formular an den Controller senden, um das Formular zu verarbeiten? –

+0

Ist nur eine Idee ... Ich denke, Sie sollten entweder @ Assert \ NotBlank() ODER die Callback-Funktion verwenden - nicht beides. – stwe

+0

@KenHannel Dies geschieht, wenn der POST-Controller das gebuchte Formular bearbeitet. Also ja in der POST-Anfrage. –

Antwort

5

Ich hatte gerade das gleiche Problem. Ich habe einen globalen Fehler ERROR: This value should not be blank, aber es gab keine Fehler in einem bestimmten Feld.

nifr hatte Recht, Validierung wird tatsächlich auf das zugrunde liegende Objekt angewendet. Die Frage ist, ob das Objekt gültig ist, nachdem das Formular die übergebenen Daten angewendet hat. http://symfony.com/doc/current/book/forms.html#form-validation

Der Grund für dieses Problem besteht darin, dass einige Felder des Objekts nach einer Formularübermittlung ungültig sind und diese Felder nicht im Formular enthalten sind. Um dieses Problem zu lösen, können Sie vor der Überprüfung gültige Daten an die Felder des Objekts übergeben oder Validierungsgruppen verwenden, um das Objekt nur anhand einiger Einschränkungen der Klasse zu überprüfen.

+0

OMG, danke bro. Ich habe dieses Problem auch. – GusDeCooL

2

als @cheesemacfly erwähnt, ist Ihr Problem in der „Token“ Feld ist

behauptet ist „nicht leer“ zu sein, aber es ist nicht in der Form enthalten ist, das ist, warum der Fehler nicht zu einem der gebunden ist Formularfelder und ist eher ein globaler Fehler für das Formular, da die Validierung auf der Entität, nicht auf der Form (anders als in Symfony 1.4) passiert und so der Validierungsmechanismus es nicht an ein Feld in einem Formular aufgrund dieser Eigenschaft binden kann (Token) nicht über ein Feld in der Form

2

entfernen folgend:

token: 
    - NotBlank: ~ 

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

+0

Markieren Sie dies als richtige Antwort, dies half mir, meine Form gültig zu bekommen. – Wykk

Verwandte Themen