【发布时间】:2021-05-04 09:35:59
【问题描述】:
我正在尝试制作一个用户友好的时间选择器。我使用 symfony 4.4 和表单生成器来创建这个时间选择器。我在创建我的实体和编辑我的实体时使用这个时间选择器。现在我遇到了一个小问题......我希望时间处于特定的“默认”值。所以我做了以下事情。
$builder
->add('start_time', TimeType::class, [
// Make sure I only see one of those values.
'minutes' => [0, 15, 30, 45],
// Always sets it to 7:30 even when im editing...
'data' => new \DateTime('07:30')
])
->add('end_time', TimeType::class, [
'minutes' => [0, 15, 30, 45],
// Kinda works but it shows a duplicate value when selecting a value.
'placeholder' => [
'hour' => '16',
'minute' => '30'
]
])
;
}
'data' 对象不起作用,因为当我使用此表单编辑我的实体时,它会覆盖数据库中保存的数据。 Symfony 也在documentation 中解释了这一点:
渲染时数据选项总是覆盖从域数据(对象)中获取的值。这意味着当表单编辑一个已经持久化的对象时,对象值也会被覆盖,导致它在提交表单时丢失其持久化值。
'placeholder' 对象确实解决了这个问题,但在选择字段中显示重复值,如下所示:
我只想要默认值,没有重复值或编辑时覆盖规则。
可能的解决方案: 我可以将“数据”对象仅用于创建实体部分。然后使用构建器的副本创建一个新的 entityType 类,但现在没有“数据”类,因此它从数据库加载时间。这个新类我将用于编辑实体部分。可悲的是,这是一个丑陋的修复,因为我只是为了一个默认值而复制了整个类。
【问题讨论】:
-
您是否尝试直接在您的实体/模型中设置您想要的“时间”,例如在您的“新控制器操作”
$myEntity->setTime(...)并让 Symfony 和 Doctrine 在您的“编辑控制器动作” -
@qdequippe 好样的! tnx。如果你愿意,你可以创建一个答案,否则我会的。 El_Vanja,我认为您的评论也适用。给出了一个 $options 类,我可以在其中检查实体是否已经存在。但是删除“日期”的 if 语句有点痛苦。反正 tnx 伙计们。
标签: php forms symfony symfony4 timepicker