加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

symfony-2.1 – 表单:避免将null设置为非提交的字段

发布时间:2020-12-14 23:24:32 所属栏目:资源 来源:网络整理
导读:我有一个简单的模型(源代码简化): class Collection{ public $page; public $limit;} 和表单类型: class CollectionType extends AbstractType{ public function buildForm(FormBuilderInterface $builder,array $options) { $builder-add('page','integer
我有一个简单的模型(源代码简化):
class Collection
{
    public $page;
    public $limit;
}

和表单类型:

class CollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder->add('page','integer');
        $builder->add('limit','integer');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'FSCCommonRestFormModelCollection',));
    }
}

我的控制器:

public function getUsersAction(Request $request)
{
    $collection = new Collection();
    $collection->page = 1;
    $collection->limit = 10;

    $form = $this->createForm(new CollectionType(),$collection)
    $form->bind($request);

    print_r($collection);exit;
}

当我POST / users /?form [page] = 2& form [limit] = 20时,响应是我所期望的:

Collection Object
(
    [page:public] => 2
    [limit:public] => 20
)

现在,当我POST / users /?form [page] = 3时,响应为:

Collection Object
(
    [page:public] => 3
    [limit:public] =>
)

limit变为null,因为它未提交.

我想得到

Collection Object
(
    [page:public] => 3
    [limit:public] => 10 // The default value,set before the bind
)

问题:如何更改表单行为,以便忽略未提交的值?

解决方法

如果只是参数问题(GET参数),您可以将默认值定义到路由文件中
route_name:
pattern: /users/?form[page]={page}&form[limit]={limit}
defaults: { _controller: CompanyNameBundleName:ControllerName:ActionName,limit:10 }

另一种方法可以是使用钩子(即PRE_BIND)并将该值手动更新到此事件中.通过这种方式,您没有将“逻辑”扩展到多段代码中.

最终代码 – 由Adrien建议 – 将是

<?php

use SymfonyComponentFormFormEvent;
use SymfonyComponentFormFormFactoryInterface;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentFormFormEvents;

class IgnoreNonSubmittedFieldSubscriber implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }

    public function preBind(FormEvent $event)
    {
        $submittedData = $event->getData();
        $form = $event->getForm();

        // We remove every child that has no data to bind,to avoid "overriding" the form default data
        foreach ($form->all() as $name => $child) {
            if (!isset($submittedData[$name])) {
                $form->remove($name);
            }
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读