【问题标题】:Array to string conversion exception on DateField placeholder attrDateField 占位符 attr 上的数组到字符串转换异常
【发布时间】:2016-04-05 22:51:45
【问题描述】:

我有一个这样的 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',
             ],
        ]);
}

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

在 form_div_layout.html.twig 的第 322 行渲染模板(“注意:数组到字符串的转换”)时引发了异常。

在日志中,我有以下详细信息:

在 Twig_Template ->displayBlock ('widget_attributes', array('value' => object(ExperienceWork), 'attr' => array('autocomplete' => 'off', 'placeholder' => array('year ' => 'ex: 01/09/2007', 'month' => 'ex: 01/09/2007', 'day' => 'ex: 01/09/2007'),[...]

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

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    首先,如果您要添加 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',
                 ],
            ]);
    }
    

    【讨论】:

    • 对不起,它不起作用,我有一个 Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") in form_div_layout.html.twig at line 322 并且占位符作为数组发送。
    【解决方案2】:

    也许我使用的是旧版本的 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 函数中的默认返回。

    【讨论】:

      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2020-11-04
      相关资源
      最近更新 更多