在我的Symfony 4应用程序中,我有一个包含日期类型字段的实体。默认情况下,Symfony将其显示为一组月,日,年的选择框。我已将其更改为文本小部件,以便我可以使用jQuery UI日期选择器。
但是我在尝试提交表单时遇到了问题。
这是我的实体上的字段:
/**
* @ORM\Column(type="date")
*/
private $start_date;
这是我在显示字段的方式:
$builder->add('start_date', DateType::class, [
'widget' => 'single_text',
// prevents rendering it as type="date", to avoid HTML5 date pickers
'html5' => false,
// adds a class that can be selected in JavaScript
'attr' => ['class' => 'js-datepicker'],
])
在我的页面上使用jquery和jqueryui,这允许显示日期选择器。
这是我目前正在尝试从日期转换为字符串,反之亦然。目前,我只是试图使用一个硬编码的日期,当我知道我在做什么时,我当然会改变。
$builder->get('start_date')
->addModelTransformer(new CallbackTransformer(
function ( $dateAsString ) {
return new \DateTime('2019-01-01');
},
function ( $dateAsDate ) {
return '2019-01-01';
}
));
提交表单会产生此错误:给出“DateTimeInterface”类型的预期参数,“string”。
有没有人有任何想法如何将日期作为日期类型存储在我的实体中,同时在表单中将其作为字符串显示?
我邀请你看看documentation of DateType
。您会发现,您可以根据input
选项以各种格式存储您的日期:
这是你实体中潜在的qazxsw poi。在您的示例中,您必须选择qazxsw poi,这是默认值。
你为qazxsw poi选项做出了正确的选择 - qazxsw poi。别忘了设置正确的model value
。这是datetime
。
在您的情况下,您不需要编写自己的数据转换器。 Symfony将负责在widget
中改变你的single_text
,反之亦然。它通过format
使用它:
view value
和
model value
虽然view value
和normalised value
的格式各不相同,但`model data`(string, datetime, timestamp, etc.) -> `norm data` (`DateTime`) -> `view data` (string for widget=single_text, array for widget=choice)
的格式总是相同的 - `view data` (string for widget=single_text, array for widget=choice) -> `norm data` (`DateTime`) -> `model data`(string, datetime, timestamp, etc.)
。您添加的模型转换器返回view data
以设置为规范化数据。这就是你得到错误的原因。
您可以向formbuilder添加预定义格式,如下所示
model data
在这种情况下你不需要变压器,formbuilder会处理它。