我想知道在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';
}
}
答案 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();
}
您必须自己决定如何只保存部分实体;它可能涉及从数据库中检索另一个副本,将其与从表单中填充的副本进行比较,并在持久化之前有选择地仅更新相关字段。