Symfony2自动将输入字段值转换为十进制或整数类型。 我的应用程序有两种语言:阿拉伯语和英语 我创建了一个包含以下字段的实体:
/**
* @var float $price
*
* @ORM\Column(name="price", type="decimal", scale=2, nullable=true)
*
* @Assert\Regex(pattern="/^[0-9]+(\.\d{1,2})?$/",message="Incorrect price.")
* @Assert\Type(type="float")
* @Assert\Min(0)
*/
private $price;
在形式中,我让sf猜测一个字段类型:
$builder->add('price')
我在阿拉伯语界面中加载用于编辑此实体的表单。
在价格字段中,我看到١٢٫٤
而不是12.40
。
我无法保存表单,因为HTML5验证失败。
如果我在当前字段中输入12.40并保存实体,则将保存12,而不是12.40。
为什么呢?如何禁用它?如何验证阿拉伯数字? 有什么建议吗?
编辑已解决,见下文
答案 0 :(得分:3)
我找到了答案的原因here 如您所见,symfony为这些窗口小部件类型注册了一个ViewTransformer:
$builder->addViewTransformer(
new IntegerToLocalizedStringTransformer(
$options['precision'],
$options['grouping'],
$options['rounding_mode']
));
电流互感器将整数值转换为本地化字符串。它也适用于number
小部件(NumberToLocalizedStringTransformer)和money
小部件(MoneyToLocalizedStringTransformer)。
所以我认为需要注册一个不使用ViewTransformer的新FieldType。
编辑:我解决了问题,只是禁用了intl扩展,现在所有数字字段都使用默认的英文数字。如果启用intl扩展,则应仅在输入值中使用本地化数字,这是默认行为。
答案 1 :(得分:0)
这是旧文章,但我希望我的回答可以帮助任何遇到此问题的人。 您可以使用表单类型的Data Transformers手动将默认语言环境设置为英语,而不是按照上面的建议禁用int扩展名,这将使字段显示为英文数字。
1)使用Data Transformers中断(插入)显示字段数据的过程。
2)Manually set Locale to English。
这是我对表单类型中的dateOfBirth字段所做的操作:
$builder -> add(
$builder -> create(
'dateOfBirth', DateType::class, array(
'label' => 'Date of Birth',
'widget' => 'single_text',
'required' => false,
'html5' => false,
'attr' => ['class' => 'form-control']
)) -> addModelTransformer(new CallbackTransformer(
function($dateOfBirth) {
\Locale::setDefault('en');
return $dateOfBirth;
},
function($dateOfBirth) {
return $dateOfBirth;
}
))
);