TYPO3 7.6 Extbase / Fluid形式:htmlspecialchars()要求参数1为字符串,给定对象

时间:2017-08-21 08:51:04

标签: typo3 fluid extbase typo3-7.6.x

我有一个表格,基于Extbase和TYPO3 7.6中的流体。每次出现任何字段中的验证错误时,表单将再次显示,根据需要显示验证错误。 但每次重新显示表单并在日期字段中输入值时,都会显示错误消息htmlspecialchars() expects parameter 1 to be string, object given

我想摆脱这条错误消息。

控制器中有一个日期属性:

<?php

namespace Vendor\Extension\Domain\Model;

class Person extends BaseDto
{
    /**
     * @var \DateTime $privatePersonBirthdate
     */
    protected $privatePersonBirthdate;

    /**
     * @param \DateTime $privatePersonBirthdate
     */
    public function setPrivatePersonBirthdate($privatePersonBirthdate)
    {
        $this->privatePersonBirthdate = $privatePersonBirthdate;
    }

    /**
     * @return \DateTime
     */
    public function getPrivatePersonBirthdate()
    {
        return $this->privatePersonBirthdate;
    }

}

模板:

<f:form.textfield property="privatePersonBirthdate" />

控制器中的属性配置:

$conf->forProperty('privatePersonBirthdate')->setTypeConverterOption('TYPO3\\CMS\\Extbase\\Property\\TypeConverter\\DateTimeConverter', \TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::CONFIGURATION_DATE_FORMAT, 'd.m.Y');

我已在网上找到一些类似的报告,例如https://forge.typo3.org/issues/4268

使用value属性的解决方法可行,但也会破坏用户在验证错误中输入的值:

<f:form.textfield property="privatePersonBirthdate" value="{f:format.date(date: person.privatePersonBirthdate, format: 'd.m.Y')}" />

我似乎缺少了一些东西。我不明白。你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我解决了创建视图助手的问题,该助手在尝试渲染之前转换了DateTime类型的属性:

<?php

namespace Vendor\Extension\ViewHelpers;

use TYPO3\CMS\Fluid\ViewHelpers\Form\TextfieldViewHelper;

/**
 * This view helper solves the issue described https://stackoverflow.com/questions/45792891/typo3-7-6-extbase-fluid-form-htmlspecialchars-expects-parameter-1-to-be-str
 *
 * Class TextfieldForDatesViewHelper
 * @package Educo\Eddaylight\ViewHelpers
 */
class TextfieldForDatesViewHelper extends TextfieldViewHelper
{
    /**
     * Initialize the arguments.
     *
     * @return void
     * @api
     */
    public function initializeArguments()
    {
        parent::initializeArguments();
        $this->registerTagAttribute(self::DATEFORMAT, 'string', 'Required format for date field');
    }

    /**
     * Converts an arbitrary value to a plain value
     *
     * @param mixed $value The value to convert
     * @return mixed
     */
    protected function convertToPlainValue($value)
    {
        if ($value instanceof \DateTime) {
            return $value->format($this->arguments[self::DATEFORMAT]);
        }
        return parent::convertToPlainValue($value);
    }

    const DATEFORMAT = 'dateFormat';
}