Symfony 2:如何使用多个提交保存按钮处理映射表单

时间:2014-10-14 06:24:02

标签: symfony symfony-forms symfony-2.3

我想知道在sf2表单中如何管理具有多个保存按钮的表单(提交类型)。 我的表单映射到一个对象上,我只想在单击“savePersonn”按钮时保留personn字段。

另外,我想只在点击“saveAdress”按钮时保留地址字段。 最后,我想在点击“saveAll”按钮时保存所有表单信息。 有谁知道怎么做?目前,在我的处理程序中,所有信息都是持久的。 我的formType的代码:

<?php

namespace Foobar\OwnerBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class OwnerType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('firstName', null);
        $builder->add('lastName', null);
        $builder->add('dateOfBirth', null);
        $builder->add('savePersonn', 'submit');

        $builder->add('address', null);
        $builder->add('country', null);
        $builder->add('saveAdress', 'submit');

        $builder->add('saveAll', 'submit');

    }

        public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Foobar\CarBundle\Entity\Owner'
        ));
    }

    public function getName() {
        return 'owner';
    }

}

1 个答案:

答案 0 :(得分:0)

如果您追求的是&#34;只保存一些实体&#34;部分而不是&#34;如果点击不同的按钮,如何做不同的事情&#34;那么一个选项将是我在下面暗示的关于将改变后的实体与来自DB的新实体进行比较,例如

$ownerRepo = $this->getRepository('Bundle:Owner');
$changedOwner = $ownerRepo->find($id);

//Handle request etc, $changedOwner gets data from submitted form

if ($form->isValid()) {

    $em = $this->getDoctrine()->getManager();

    if ($form->get('saveAll')->isClicked() )
    {
        $em->flush(); //$changedOwner was already managed, just need to save all changes
    }
    elseif ($form->get('saveAdress')->isClicked() )
    {
        //Save just address
        $em->detach($changedOwner); //Don't want everything in this to be persisted
        $freshOwner = $ownerRepo->find($id); //untouched
        $freshOwner->setAddress($changedOwner->getAddress() ); //and other fields
        $em->flush(); //Update $freshOwner
    }
    elseif ($form->get('savePersonn')->isClicked() )
    {
        //Save just person
        //As above, but with person rather than address
    }

    return $this->redirect();
}

<小时/> 错误轨道上的旧答案

Symfony Form Docs中所述,在您的控制器中,您可以测试点击了哪个按钮:

if ($form->isValid()) {

    if ($form->get('saveAll')->isClicked() )
    {
        //Save entire entity
    }
    elseif ($form->get('saveAdress')->isClicked() )
    {
        //Save just address
    }
    elseif ($form->get('savePersonn')->isClicked() )
    {
        //Save just person
    }

    return $this->redirect();
}

您必须自己决定如何只保存部分实体;它可能涉及从数据库中检索另一个副本,将其与从表单中填充的副本进行比较,并在持久化之前有选择地仅更新相关字段。