2013-10-21 11 views
5

Mam dziwny problem przy użyciu formularza w Symfony2.Sprawdzanie poprawności formularza Symfony2 zawsze zwracające BŁĄD: Ta wartość nie powinna być pusta

pierwsze Dodałem walidację jako annotations wewnątrz klasy podmiotu Job tutaj:

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

I utworzeniu klasy JobType i stosować go wewnątrz formy. Więc mogę dodać pracę.

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

Oto mój kontroler:

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

Teraz kiedy robię var_dump($form->getErrorsAsString()) uzyskać:

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) 

Albo kiedy robię var_dump($form->getErrors()) uzyskać:

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 

mam nie wiem co g generuje ten błąd ERROR: This value should not be blank.. Mam ciężkie czasy, żeby to rozgryźć. Każda pomoc będzie bardzo ceniona.

+0

Czy otrzymujesz te błędy w żądaniach GET, gdy formularz ma być wyświetlany w widoku lub masz na myśli, kiedy POST formularz do kontrolera, aby przetworzyć formularz? –

+0

Jest tylko pomysłem ... Myślę, że powinieneś albo @Asert \ NotBlank() LUB używając funkcji zwrotnej - nie obu. – stwe

+0

@KenHannel Zdarza się to, gdy kontroler POST przetworzy wysłany formularz. Tak więc w żądaniu POST. –

Odpowiedz

5

Po prostu miałem ten sam problem. Wystąpił błąd globalny ERROR: This value should not be blank, ale nie wystąpiły żadne błędy w określonym polu.

nifr miał rację, sprawdzanie poprawności jest w rzeczywistości stosowane do obiektu leżącego pod spodem. Pytanie brzmi, czy przedmiot jest ważny, czy formularz zastosował do niego przesłane dane. http://symfony.com/doc/current/book/forms.html#form-validation

Przyczyną tego problemu jest to, że niektóre pola obiektu nie są ważne po przesłaniu formularza, a pola te nie są zawarte w formularzu. Aby rozwiązać ten problem, możesz przekazać prawidłowe dane do pól obiektu przed sprawdzaniem poprawności lub użyć grup sprawdzania poprawności do sprawdzenia poprawności obiektu tylko dla niektórych ograniczeń na klasie.

+0

OMG, dziękuję bracie. Mam też ten problem. – GusDeCooL

2

jak @cheesemacfly wspomniano, problem jest w „symboliczną” pola

to podejrzewana być „nie puste”, ale to nie jest w formie, dlatego błąd nie jest związany z dowolną z pola formularza i jest raczej globalnym błędem dla formularza, ponieważ walidacja odbywa się na jednostce, a nie na formularzu (innym niż w symfony 1.4), a zatem mechanizm sprawdzania poprawności nie może powiązać go z polem w formularzu, ponieważ ta właściwość (żeton) nie ma pola w formularzu

2

usunąć następujące dane:

token: 
    - NotBlank: ~ 

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

+0

Oznacz to jako poprawną odpowiedź, pomogło mi to w uzyskaniu prawidłowego formularza. – Wykk

Powiązane problemy