2016-08-24 8 views
5

Próbuję utworzyć pole formularza z zestawem opcji z dodatkowym wprowadzeniem tekstu, które należy wypełnić, jeśli wybierzesz opcję "inne" :Dodanie opcji "inny, proszę określić" do mojego pola wyboru typu pola w Symfony

How often do you exercise? 
(*) I do not exercise at the moment 
() Once a month 
() Once a week 
() Once a day 
() Other, please specify: [    ] 

Obecnie używam ChoiceType gdzie mam ustaw moją choices takiego:

$form->add('exercise', Type\ChoiceType::class, array(
    'label' => 'How often do you exercise?', 
    'choices' => [ 'I do not excerise at the moment' => 'not', ... ], 
    'expanded' => true, 
    'multiple' => false, 
    'required' => true, 
    'constraints' => [ new Assert\NotBlank() ], 
)); 

jak mogę dostać się „inne”, proszę podać opcję działa zgodnie z oczekiwaniami?

Odpowiedz

2

W takim przypadku należy utworzyć niestandardowy typ formularza, który będzie kombinacją ChoiceType i TextType. Miły wstęp do typów formularza niestandardowego można znaleźć id Doc: http://symfony.com/doc/master/form/create_custom_field_type.html

powinno to być coś podobnego do:

class ChoiceWithOtherType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // prepare passed $options 

     $builder 
      ->add('choice', Type\ChoiceType::class, $options) 
      ->add('other', Type\TextType::class, $options) 
     ; 

     // this will requires also custom ModelTransformer 
     $builder->addModelTransformer($transformer) 

     // constraints can be added in listener 
     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
      // ... adding the constraint if needed 
     }); 

    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function buildView(FormView $view, FormInterface $form, array $options) 
    { 
     // if needed 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     // 
    } 

)); 

Proszę spojrzeć na:

Myślę, że najlepszym sposobem, aby to osiągnąć, jest przyjrzenie się kodowi źródłowemu DateTimeType.

+0

Dzięki! Mam zamiar utworzyć klasę 'ChoiceWithOtherType' (lub coś takiego), która rozszerza' AbstractType', a następnie w mojej 'buildForm()' muszę utworzyć przyciski dla każdego wyboru. W przypadku "innych, proszę określić" muszę utworzyć 2 wejścia: wejście radiowe i wejście tekstowe. W jaki sposób wprowadzić tekst wymagany do wejścia radia? Chyba muszę dodać to ograniczenie w POST? – Bjorn

+1

Zaktualizowałem moją odpowiedź. Daj mi znać, jeśli potrzebujesz więcej informacji. –

-1

Oto mój dataTransformer dla kogo, kto może pomóc

<?php 


namespace AppBundle\Form\Type; 


use Doctrine\ORM\EntityManagerInterface; 
use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class ChoiceToTextTransformer implements DataTransformerInterface 
{ 

private $em; 

/** 
* ChoiceToTextTransformer constructor. 
* @param EntityManagerInterface $em 
*/ 
function __construct(EntityManagerInterface $em) 
{ 
    $this->em = $em; 
} 

public function transform($values) 
{ 
    if (!$values) return array(); 

    $array = array(); 

    foreach ($values as $value) 
    { 
     list($id, $type) = explode("_", $value); 
     $array[] = $this->em->getRepository('AppBundle:' . $type)->find($id); 
    } 

    return $array; 
} 


public function reverseTransform($values) 
{ 

    if ($values === null) return array(); 

    $choices = array(); 
    foreach ($values as $object) 
    { 
     $choices[] = array_filter($choices); 
    } 

    foreach ($values as $key => $value){ 

     if (!$value == null){ 
      dump($value); 
      return $value; 
     } 
    } 

    return $value; 

} 
} 
+0

Nie zapewnia to odpowiedzi na pytanie. Możesz wyszukać podobne pytania (// stackoverflow.com/search) lub odnieść się do powiązanych i powiązanych pytań po prawej stronie, aby znaleźć odpowiedź. Jeśli masz powiązane, ale inne pytanie, [zadaj nowe pytanie] (// stackoverflow.com/questions/ask) i dołącz link do tego, aby pomóc zapewnić kontekst. Zobacz: [Zadawaj pytania, otrzymuj odpowiedzi, nie rozpraszaj] (// stackoverflow.com/tour) –

+1

OK Dziękuję za odpowiedź To był mój pierwszy wpis, więc poprawię go teraz –