2012-07-24 1 views
7

symfony에서 양식을 만들 때 조건문을 사용하고 싶습니다.양식을 만들 때 조건문 사용

일반적으로 선택 위젯을 사용하고 있습니다. 사용자가 옵션 "기타"을 선택한 경우 텍스트 상자 위젯을 추가로 표시하려고합니다. 이 자바 스크립트에서 할 수있는 가정하지만, 어떻게 아직도 내 엔터티에서 동일한 속성에 2 위젯에서 데이터를 유지할 수 있습니까?

나는이 지금까지 가지고

$builder->add('menu', 'choice', array(
     'choices' => array('Option 1' => 'Option 1', 'Other' => 'Other'), 
     'required' => false, 
    )); 
    //How to add text box if choice == Other ???? 

나는 DataTransfomer를 사용하는 기획하지만,이 위젯 선수 ??

답변

33

예를 들어 ChoiceOrTextType과 같은 사용자 정의 유형을 만드는 것이 좋습니다. 이 유형에는 선택 사항 ("choice")과 텍스트 필드 ("text")를 모두 추가합니다.

use Symfony\Component\Form\DataTransformerInterface; 

class ValueToChoiceOrTextTransformer implements DataTransformerInterface 
{ 
    private $choices; 

    public function __construct(array $choices) 
    { 
     $this->choices = $choices; 
    } 

    public function transform($data) 
    { 
     if (in_array($data, $this->choices, true)) { 
      return array('choice' => $data, 'text' => null); 
     } 

     return array('choice' => 'Other', 'text' => $data); 
    } 

    public function reverseTransform($data) 
    { 
     if ('Other' === $data['choice']) { 
      return $data['text']; 
     } 

     return $data['choice']; 
    } 
} 

지금 단지 "메뉴는"해당 유형의 필드를 필드 만들기 : 당신은 이미 짐작으로

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class ChoiceOrTextType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('choice', 'choice', array(
       'choices' => $options['choices'] + array('Other' => 'Other'), 
       'required' => false, 
      )) 
      ->add('text', 'text', array(
       'required' => false, 
      )) 
      ->addModelTransformer(new ValueToChoiceOrTextTransformer($options['choices'])) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setRequired(array('choices')); 
     $resolver->setAllowedTypes(array('choices' => 'array')); 
    } 
} 

, 당신은 또한 매우 간단 할 수있는 데이터 변압기가 필요합니다.

$builder->add('menu', new ChoiceOrTextType(), array(
    'choices' => array('Option 1' => 'Option 1', 'Option 2' => 'Option 2'), 
    'required' => false, 
)); 
+2

감사합니다. bernhard. 이 일로 나를 도와 주셔서 정말 기쁩니다. 이것은 아주 훌륭하고 아주 상세한 대답입니다. 나는 +100을 넣을 수 있었으면 좋겠습니다. 모든 것이 이제는 의미가 있습니다. Form 구성 요소에서 수행 한 작업에 대해 많은 감사를드립니다.이 도구는 놀라우면서도 강력한 도구입니다. 감사. – Mick

+0

아마도 이미 알았 듯이 마지막 코드 샘플에는 '기타'=> '기타'가 너무 많습니다. 나는 그것을 지금 제거했다. –

+0

'transform()'에서 data가 null이면 배열을 반환하지 말아야하며, 그렇지 않으면 Other가 기본적으로 선택됩니다. – ncatnow