2015-04-23 4 views
12

Так что я довольно новичок в Symfony, и я стараюсь, чтобы контроллер создавал несколько разные формы на основе действий контроллера. Прямо сейчас, у меня есть этотSymfony2: Опции темы для buildForm

//in Controller 

public function addLocationEntryAction(Request $request) 
{ 
    $entry = new Entry(); 
    $form = $this->get('form.factory')->create(new EntryType('addLocation'), $entry); 

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

public function addArticleEntryAction(Request $request) 
{ 
    $entry = new Entry(); 
    $form = $this->get('form.factory')->create(new EntryType('addArticle'), $entry); 

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

И

//in EntryType 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 

    $builder 
     ->add('title',  'text') 
     ->add('continent', 'text', array('required' => false)) 
     ->add('country', 'text', array('required' => false)) 
     ->add('category', 'text', array('required' => false)) 
     ->add('author',  'hidden') 
     ->add('type',  'hidden') 
     ->add('text',  'textarea') 
     ->add('post',  'submit') 
    ; 
} 

Я хотел бы передать параметр из контроллера в buildForm, так что я могу сделать что-то вроде этого:

public function buildForm(FormBuilderInterface $builder, array $options, $option) 
{ 
    $builder 
     ->add('title',  'text') 
    ; 

    if($option == 'addLocation') 
    { 
     $builder 
      ->add('continent', 'text', array('required' => false)) 
      ->add('country', 'text', array('required' => false)) 
     ; 
    } 
    elseif($option == 'addArticle') 
    { 
     $builder 
      ->add('category', 'text', array('required' => false)) 
     ; 
    } 

    $builder 
     ->add('author',  'hidden') 
     ->add('type',  'hidden') 
     ->add('text',  'textarea') 
     ->add('post',  'submit') 
    ; 
} 

Как это сделать? Я проверил здесь документ Symfony и другие подобные вопросы, но ничто не кажется мне вполне подходящим для моего дела. Я не знаю.

ответ

15

Нет необходимости создавать дополнительный параметр, просто используйте options для передачи пользовательских данных. В следующем примере я сделал обязательным атрибут age, вы можете указать его необязательным или указать значение по умолчанию. Подробнее о OptionsResolverhere

class ExampleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     var_dump($options['age']); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setRequired(array(
      'age' 
     )); 

    } 
} 

Создать:

$form = $this->get('form.factory')->create(new ExampleType(), $entry, array(
    'age' => 13 
)); 
+0

прекрасно работает, спасибо – Afunakwa

+0

@ b.b3rn4rd Лучший ответ! Ясный, простой, эффективный. В моем случае также хорошо работает –

+2

Обратите внимание, что 'setDefaultOptions' устарел в пользу' configureOptions'. http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions – DarksteelPenguin

Смежные вопросы