25

I have a form like below:

class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('tags','text',array(
                'required' => false,
                'attr' => array('name' => 'tags'),
                'mapped' => false))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\ItemBundle\Entity\Item',
            'cascade_validation' => true,
        ));
    }
}

My edit action

public function editAction(Request $request, $id) {
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('MyBundleItemBundle:Item')->find($id);
    $form = $this->createForm(new ItemType(), $entity);
    //$form->get('tags')->setValue('test text');
    // ^- this is what i would like to do -^
    // ...
}

While I am editing an item, How can I change form field value inside controller before rendering it?

Pierre de LESPINAY
  • 44,700
  • 57
  • 210
  • 307
dextervip
  • 4,999
  • 16
  • 65
  • 93

4 Answers4

70

You can use setData() to set data on form fields in Symfony, like this:

$form = $formBuilder->getForm();

$form->get('firstname')->setData('John');
Pierre de LESPINAY
  • 44,700
  • 57
  • 210
  • 307
Rick Pastoor
  • 3,625
  • 1
  • 21
  • 24
  • Could you please provide me an example? – dextervip Jul 04 '13 at 22:10
  • 2
    I just want to say that this method is working for me when I do not provide entity to form, otherwise this will help http://stackoverflow.com/questions/13249485/symfony2-setting-the-value-of-a-form-field-outside-the-form-inside-a-controlle/21039877#21039877 – Tomáš Tibenský Apr 04 '14 at 13:52
  • 4
    This didn't work for me, but simply doing $form->setData(array('field'=>'value')) works. – Acyra Mar 03 '15 at 19:17
  • This is the correct way to do it if you're running a modern version of Symfony. If this doesn't work for you, upgrade or figure out why it's not working. – Halfstop Feb 29 '16 at 03:10
  • @Acyra setting the value with an associative array doesn't work for me on SF4.4 but setting the values individually does and I can't work out why – crmpicco Apr 16 '21 at 08:27
3

You can change tags value in the controller:

$request = $this->get('request');
    if ($request->getMethod() == 'POST') 
{
    $form->bind($request);
    if $form->isValid())
    {
        $entity->setTags('test');
        //persist ...
    }
}
meherzi.sahbi
  • 1,691
  • 1
  • 14
  • 14
  • 1
    `$form-bind()` is obsolete since Symfony 2.3 and is expected to be removed in 3.0. One should use `$form->handleRequest($request)` instead in the newer versions. – tftd Apr 17 '15 at 20:01
1
class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('tags','text',array(
                'required' => false,
                'attr' => array('name' => 'tags','value'=>'newvalue'),
                'mapped' => false))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\ItemBundle\Entity\Item',
            'cascade_validation' => true,
        ));
    }
}
Ron
  • 514
  • 2
  • 13
0

Another way to set the value is to use form options:

class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('tags','text',array(
                'required' => false,
                'attr' => array('name' => 'tags'),
                'mapped' => false,
                'data' => $options['tags_value'],
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\ItemBundle\Entity\Item',
            'cascade_validation' => true,
            'tags_value' => 'default value if you want',
        ));
    }

And then in controller:

public function editAction(Request $request, $id) {
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('MyBundleItemBundle:Item')->find($id);
    $form = $this->createForm(new ItemType(), $entity, ['tags_value' => 'test text']);
}
Artem L
  • 10,123
  • 1
  • 20
  • 15