DateField占位符attr上的数组到字符串转换异常

时间:2016-04-05 22:51:46

标签: php symfony twig

我有一个像这样的DateField表单:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('started', 'date', [
            'label' => 'Début',
            'placeholder' => 'ex: 01/09/2007',
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'attr' => [
               'autocomplete' => 'off',
             ],
        ]);
}

当我想在页面中查看它时,我会发生异常:

  

在第322行的form_div_layout.html.twig中呈现模板("注意:数组到字符串转换")期间抛出了异常。

在日志中,我有这个细节:

  

在Twig_Template - > displayBlock(' widget_attributes',数组('值' =>对象(体验工作),' attr' =>数组( '自动填充' =>'关闭','占位符' =>数组('年' =>' ex: 01/09 / 2007','月' =>'例如:01/09 / 2007',' day' =>'例如:01/09/2007'),[...]

我认为Twig无法解析数组占位符,但在DateType.php source中我发现这种行为是无法避免的。我想我做错了什么,但我不知道是什么。

2 个答案:

答案 0 :(得分:0)

首先,如果您要添加HTML5占位符,则不是这样做的。您可以通过attr数组添加它。

http://symfony.com/doc/current/reference/forms/types/form.html#attr

如果不是:

看起来您的表单需要一个占位符数组,而不是字符串。

文档:

http://symfony.com/doc/current/reference/forms/types/date.html#placeholder

您可以将您的元素重写为:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('started', 'date', [
            'label' => 'Début',
            'placeholder' => array(
               'year' => '2007', 'month' => '09', 'day' => '01'
            ),
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'attr' => [
               'autocomplete' => 'off',
             ],
        ]);
}

答案 1 :(得分:0)

也许我使用旧版本的symfony,但是我已经使用自定义日期字段对象覆盖setDefaultOptions(OptionsResolverInterface $resolver),以避免在占位符字段中返回数组,如下所示:

$placeholderDefault = function (Options $options) {
    return $options['required'] ? null : '';
};

$placeholderNormalizer = function (Options $options, $placeholder) use ($placeholderDefault) {
    if (is_array($placeholder)) {
        $default = $placeholderDefault($options);

        return array_merge(
            array('year' => $default, 'month' => $default, 'day' => $default),
            $placeholder
        );
    }

    return $placeholder;
};

$resolver->setNormalizers(array(
    'empty_value' => $placeholderNormalizer,
    'placeholder' => $placeholderNormalizer,
));

我唯一替换的是$ placeholderNormalizer函数的默认返回。