在Symfony 2中禁用输入值的自动转换

时间:2012-10-18 14:44:23

标签: symfony symfony-2.1

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。

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

编辑已解决,见下文

2 个答案:

答案 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;
    }
  ))
);