4

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。

为什么?如何禁用它?如何验证阿拉伯数字?有什么建议么?

编辑:已解决,见下文

4

2 回答 2

2

我找到了为什么会发生在这里的答案 正如你所见,symfony 为这些小部件类型注册了一个 ViewTransformer:

    $builder->addViewTransformer(
        new IntegerToLocalizedStringTransformer(
            $options['precision'],
            $options['grouping'],
            $options['rounding_mode']
    ));

电流互感器将整数值转换为本地化字符串。number小部件 (NumberToLocalizedStringTransformer) 和小部件 (MoneyToLocalizedStringTransformer) 也会发生这种情况money

所以我认为需要注册一个不会使用 ViewTransformer 的新 FieldType。

编辑:我解决了这个问题,只是禁用了国际扩展,现在所有数字字段都使用默认的英文数字。如果启用 intl 扩展,则应在输入值中仅使用本地化数字,这是默认行为。

于 2012-10-18T18:30:32.967 回答
0

这是一篇旧帖子,但我希望我的回答能帮助任何遇到这个问题的人。您可以使用表单类型中的数据转换器手动将默认语言环境设置为英语,而不是像上面建议的那样禁用 intl 扩展,这将使字段以英语数字显示。

1)使用数据转换器中断(挂钩)显示现场数据的过程。

2)手动将 Locale 设置为 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;
    }
  ))
);

于 2018-11-05T14:36:41.983 回答