2013-08-07 27 views
3

Symfony(v 2.3.2)表单有一个奇怪的问题。这是非常简单的形式,没有关系。我还应该注意到,这种形式仅用于REST API。Symfony2表单提交无效的布尔值

所以我有一个发布的领域(布尔)。在实体上它默认设置为false。

更新时,REST API客户端发送正确的PUT请求,即...&[entity]published=0&...。这个值也在Symfony分析器中的表单参数中显示。

但是我注意到数据库中的实际值设置为true(或1,因为它是tinyint)。 Request: 0, form: 1

所以,要找出什么问题,我$form->submit($request);

throw new \Exception(sprintf('Request: %s, form: %s', $request->get('entity')['published'], $form->get('published')->getData()));

throw new \Exception(sprintf('Request: %s, form: %s', $request->get('entity')['published'], $form->getData()->getPublished()));

异常消息称后添加throw语句。这意味着,在某处提交方法的字符串值“0”转换为1

场构造与$builder->add('published', 'checkbox', [ 'required' => false ])

而且我发现奇怪的东西,这可能是相关的。在Symfony分析器,面板请求中,我收到错误:Warning: json_encode(): Invalid UTF-8 sequence in classes.php line 3758,我没有发送任何奇怪的字符 - 只是单词“测试”。

回答

2

进一步的调查显示,典型的HTML表单复选框仅在检查时才发送到服务器。所以我认为将发送值设置为0 | false | off会使其工作,就好像它将被设置为true。

因此,如果您将表单窗口小部件设置为键入复选框,则不要在请求中发送复选框,如果您希望将其设置为false。在我的情况是这样的:

Array 
(
    [entity] => Array 
    (
     [id] => 73 
     [_token] => d63dad39ea458f7d3c7ae5dbea10c325cb9ee93d 
    ) 
) 

否则发送任何东西,0,假,过会工作太

Array 
(
    [entity] => Array 
    (
     [id] => 73 
     [published] => 1|0|false|on|off 
     [_token] => d63dad39ea458f7d3c7ae5dbea10c325cb9ee93d 
    ) 
) 
0

使用时把这个正好是有点问题...... 我解决它通过添加用户到我的所有形式的解决这个问题(此代码也解决在使用PUT的问题没有填写的所有资料):

class RestFormSubscriber implements EventSubscriberInterface { 

    /** 
    * {@inheritdoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(FormEvents::PRE_SUBMIT => "preSubmit"); 
    } 

    /** 
    * Remove null fields on update 
    * Fixes boolean value 
    * @param FormEvent $event 
    */ 
    public function preSubmit(FormEvent $event) 
    { 
     $form = $event->getForm(); 
     $data = $event->getData(); 

     $isPUT = strtoupper($form->getConfig()->getMethod()) == "PUT"; 

     $accessor = PropertyAccess::createPropertyAccessor(); 
     foreach ($form->all() as $name => $child) { 
      if ($isPUT && !isset($data[$name])) { 
       $form->remove($name); 
       continue; 
      } 
      if(is_bool($accessor->getValue($form->getData(), $name))) { 
       $val = $data[$name]; 
       $data[$name] = ($val=="true")||($val=="1")||($val=="on"); 
      } 
     } 
     $event->setData($data); 
    } 
}