Nan*_*com 4 forms symfony-forms symfony symfony-2.3
我有一个布尔字段,我把它作为一个选择字段放在一个表单中(是或否).没有数据转换器,我会得到0或1.我添加了一个视图BooleanToStringTransformer(看起来合理):
$builder
->add(
$builder->create('myBooleanField', 'choice', array(
'choices' => array(true => 'Yes', false => 'No'),
))
->addViewTransformer(new BooleanToStringTransformer('1'))
)
Run Code Online (Sandbox Code Playgroud)
当我尝试显示表单时,我收到错误"Expected a Boolean.".在创建表单之前,我的字段设置为false.
我试图将它设置为模型转换器:表单被调度,但是当我提交它时,我的字段被声明为无效.
我究竟做错了什么?
编辑:我差不多了.
array(true => 'Yes', false => 'No')
为array('yes' => 'Yes', 'no' => 'No')
所以代码现在看起来像 ->addModelTransformer(new BooleanToStringTransformer('yes'))
数据转换工作,除了我的字段始终设置为true,无论我选择什么值.
怎么了?
答案是:我不应该想到默认的Symfony BooleanToStringDataTransformer正在完成这项工作.它为false值而不是字符串返回null.
所以我创建了自己的datatransformer:
<?php
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
class BooleanToStringTransformer implements DataTransformerInterface
{
private $trueValue;
private $falseValue;
public function __construct($trueValue, $falseValue)
{
$this->trueValue = $trueValue;
$this->falseValue = $falseValue;
}
public function transform($value)
{
if (null === $value) {
return null;
}
if (!is_bool($value)) {
throw new TransformationFailedException('Expected a Boolean.');
}
return true === $value ? $this->trueValue : $this->falseValue;
}
public function reverseTransform($value)
{
if (null === $value) {
return null;
}
if (!is_string($value)) {
throw new TransformationFailedException('Expected a string.');
}
return $this->trueValue === $value;
}
}
Run Code Online (Sandbox Code Playgroud)