我有一个表格,基于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')}" />
我似乎缺少了一些东西。我不明白。你知道如何解决这个问题吗?
答案 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';
}