如何在Symfony 2中更改表单字段的值

25

我有一个如下的表单:

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

我的编辑操作

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 -^
    // ...
}

在我编辑一个项目时,如何在控制器中更改表单字段的值,然后再呈现它?


1
你可以在你的情况下这样做: $form->get('fieldName')->setData('my_value'); 这也适用于Symfony 3。 - Todor Todorov
4个回答

70
你可以使用 setData() 在Symfony表单字段中设置数据,就像这样:
$form = $formBuilder->getForm();

$form->get('firstname')->setData('John');

请您能否给我提供一个例子? - dextervip
2
我只想说,当我不向表单提供实体时,这种方法对我有效,否则请参考https://dev59.com/6WYr5IYBdhLWcg3w--wI#21039877。 - Tomáš Tibenský
4
这对我来说不起作用,但简单地执行$form->setData(array('field'=>'value'))就可以。 - Acyra
如果您正在运行现代版本的Symfony,则这是正确的操作方式。如果此方法不适用于您,请升级或找出原因并解决它。 - Halfstop
@Acyra,使用关联数组设置值在SF4.4上对我无效,但逐个设置值可以,我想不出原因。 - crmpicco

3
您可以在控制器中更改标签值:
$request = $this->get('request');
    if ($request->getMethod() == 'POST') 
{
    $form->bind($request);
    if $form->isValid())
    {
        $entity->setTags('test');
        //persist ...
    }
}

1
$form-bind()自Symfony 2.3版本起已经过时,预计在3.0版本中将被移除。在较新的版本中应使用$form->handleRequest($request)代替。 - tftd

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

我需要在控制器操作中进行更改。 - dextervip
控制器动作在哪里? - Ron

0

另一种设置值的方法是使用表单选项:

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

然后在控制器中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接