2013-01-06 5 views
0

나는이 다음 폼 클래스 :폼 검증 - 기입하는 단 하나의 필드를 필요

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
     $builder 
      ->add('existingfolder', 'entity', array(
       'class'  => 'ImageBundle:Folder', 
       'required' => false, 
      )) 
      ->add('folder', 'text', array('required' => false)) 
      ->add('file', 'file'); 
} 

내가 모두 existingfolder 또는 folder 필드 중 하나가 채워 져야 있도록 검증을 설정 (하지만 어떻게 그들의)?

감사의 말.

감사합니다.

답변

6

사용 True 또는 Callback 검증 어설, 여기에 사용자가 폴더 중 하나 이상 제공해야합니다 여부를 확인하는 예 : 여기

<?php 
namespace Acme\BlogBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 

class Image 
{ 
    // ...properties, functions, etc... 

    /** 
    * @Assert\True(message = "You must give at least an existing folder or a new folder") 
    */ 
    public function isThereOneFieldFilled() 
    { 
     return ($this->existingfolder || $this->folder); // If false, display an error ! 
    } 
} 

또 다른 예를 사용자가 있지만 둘 다 하나 개의 필드를 제공해야하는 경우 :

/** 
    * @Assert\True(message = "You must give an existing folder or a new folder, not both") 
    */ 
    public function isThereOnlyOneFieldFilled() 
    { 
     return (!$this->existingfolder && $this->folder || $this->existingfolder && !$this->folder); 
    } 

편집 : 폼 내부

콜백 확인 (예 : here) :

// use ... 
use Symfony\Component\Form\CallbackValidator; 
use Symfony\Component\Form\FormError; 
use Symfony\Component\Form\FormInterface; 

// Inside the form: 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('existingfolder', 'entity', array(
      'class'  => 'ImageBundle:Folder', 
      'required' => false, 
     )) 
     ->add('folder', 'text', array('required' => false)) 
     ->add('file', 'file'); 

    // Use the CallbackValidator like a TrueValidator behavior 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form) { 
     if (!$form["existingfolder"]->getData() && !$form["folder"]->getData()) { 
      $form->addError(new FormError('You must give at least an existing folder or a new folder')); 
     } 
    })); 
} 
+0

감사합니다. 모델을 기반으로하지 않는 형태로 이것을 어떻게 사용할 수 있습니까? – Dan

+1

양식 내에서 예를 들어 내 답변을 편집하십시오 ^^ – Sybio