【问题标题】:Unset fields in Symfony form after submit提交后取消设置 Symfony 表单中的字段
【发布时间】:2015-08-04 15:11:13
【问题描述】:

在我的 Symfony 项目 (2.7) 中,我有一个实体 Apartment,它有很多属性。其中之一是TownTown 是另一个学说实体,他们有一个City 实体,而City 有一个State

在我的Apartment 表单中,我选择了 3 个选项。对于TownCityState。但是当我想保存时,我只想要Town

...
$builder->add('town', 'entity', array(
    'label' => 'Town',
    'choices' => $towns,
    'class' => "AppBundle\Entity\Town"
));
$builder->add('city', 'entity', array(
    'label' => 'City',
    'choices' => $cities,
    'class' => "AppBundle\Entity\City"
));
$builder->add('state', 'entity', array(
    'label' => 'States',
    'choices' => $states,
    'class' => "AppBundle\Entity\State"
));
...

是否可以取消设置我不想保存实体公寓的额外字段?

if ($request->getMethod() == 'POST') {
    $form->handleRequest($request);

    if ($form->isValid()) {

        //I want to unset State and City entities. 
        $apartment = $form->getData();
        ...
    }

我有这个错误:

Neither the property "state" nor one of the methods "addState()"/"removeState()", "setState()", "state()", "__set()" or "__call()" exist and have public access in class "AppBundle\Entity\Apartment".

【问题讨论】:

  • $apartment->setState(null)?
  • @Matteo, $apartment 没有setState() 方法,因为不必state 属性。
  • 我可以写setState($state)函数,但我认为这不是最好的方法
  • 我不太明白。 $appartment 中是否有 state 班级成员?
  • 不,我的班级$apartment只有Town班级

标签: php forms symfony doctrine-orm


【解决方案1】:

一旦提交,表单数据将无法更改。但是您可以在提交最终确定之前附加一个事件侦听器来执行此操作:

# Don't forget these
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

# ...

$builder->add('city', 'entity', array(
    'label' => 'City',
    'choices' => $cities,
    'class' => "AppBundle\Entity\City",
    'mapped' => FALSE // <-- This is important
));

$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event){
    $data = $event->getData();

    $data['city'] = NULL;
    $data['state'] = NULL;
    # We need this because of PHP's copy on write mechanism.
    $event->setData($data); 
});

如果您需要在验证过程之前将这些设置为 NULL-ed,请将 POST_SUBMIT 替换为 SUBMIT

现在,在控制器中调用 form-&gt;getData() 将返回 NULL 值。

希望这会有所帮助...

【讨论】:

  • 谢谢,但$apartment 没有setCitysetState 方法。只有setTown。我明白了:Neither the property "state" nor one of the methods "addState()"/"removeState()", "setState()", "state()", "__set()" or "__call()" exist and have public access in class "AppBundle\Entity\Apartment". 因为没有setState() 方法
  • 啊,那么,在这种情况下,您需要用'mapped' =&gt; FALSE 标记您的表单字段。与实体字段不相关的表单字段必须标记为未映射。
  • 我已经简化了答案;)
  • 正确!非常感谢:)
  • 其实你可以通过设置mapped=&gt;false来移除一个事件监听器。因为当您将映射设置为 false 时,读取和写入对象时该字段将被忽略。 symfony.com/doc/current/reference/forms/types/form.html#mapped
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多