2017-03-21 5 views
2

IntervalType이라는 사용자 정의 FormType을 생성하고 있습니다. 내 IntervalType은 startend의 두 필드를 가지며 정수 유형입니다. 이 사용자 정의 FormType은 data_class없이 항상 사용됩니다.data_class가없는 양식에 콜백 어설 션을 사용할 수 없습니다.

startend보다 낮도록 제약 조건을 추가하고 싶습니다.

data_class없이 Symfony \ Component \ Validator \ Constraints \ Callback을 FormType에서 직접 사용하는 방법은 무엇입니까? 여기

은 참조를 위해, 내 IntervalType입니다 :

// src/AppBundle/Form/Type/IntervalType.php 
namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\IntegerType; 
use Symfony\Component\Validator\Constraints\NotBlank; 

class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('start', IntegerType::class, array(
       'constraints' => array(
        new NotBlank(), 
       ), 
      )) 
      ->add('end', IntegerType::class, array(
       'constraints' => array(
        new NotBlank(), 
       ), 
      )) 
     ); 
    } 
} 

답변

4

양식이 유일한 옵션 data_class 하나를 사용하지 않을 콜백 제약 될 것으로 보인다.

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\IntegerType; 
use Symfony\Component\Validator\Constraints\Callback; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 

class IntervalType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('start', IntegerType::class, array(
       'constraints' => array(
        new NotBlank(), 
       ), 
      )) 
      ->add('end', IntegerType::class, array(
       'constraints' => array(
        new NotBlank(), 
        new Callback(array($this, 'validateInterval')), 
       ), 
      )) 
      ->add('submit', SubmitType::class); 
    } 

    public function validateInterval($value, ExecutionContextInterface $context) 
    { 
     $form = $context->getRoot(); 
     $data = $form->getData(); 

     if ($data['start'] >= $value) { 
      $context 
       ->buildViolation('The end value has to be higher than the start value') 
       ->addViolation(); 
     } 
    } 
} 
+0

parcially 작동합니다. '$ context-> getRoot()'가 루트 양식을 반환하므로'$ data [ 'start']'가 존재하지 않기 때문에 IntervalType을 다른 양식 안에 삽입하면 실패합니다. – murilolobato