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); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |