Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2: Passing options to buildForm

Tags:

php

symfony

So I'm pretty new to Symfony and I'm trying to have the controller build slightly different forms based on controller actions. Right now, I have this

//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()
    ));
}

And

//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')
    ;
}

I'd like to pass an option from the controller in buildForm, so that I can do something like this:

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')
    ;
}

How do I do this? I've checked out the Symfony doc and similar questions on here but nothing seems to be quite fitting for my case. I don't know.

like image 409
Afunakwa Avatar asked Apr 23 '15 01:04

Afunakwa


1 Answers

There is no need to create an additional param, just use options to pass custom data. In the following example, I made age attribute mandatory, you could have it optional or specify default value. Read more about OptionsResolver here

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

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

    }
}

Create:

$form = $this->get('form.factory')->create(new ExampleType(), $entry, array(
    'age' => 13
));
like image 57
b.b3rn4rd Avatar answered Oct 26 '22 04:10

b.b3rn4rd