【问题标题】:Symfony TimeType set default value without duplicate value or overwriteSymfony TimeType 设置默认值,没有重复值或覆盖
【发布时间】: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


【解决方案1】:

您可以直接在您的实体/模型中设置您想要的“时间”,例如在您的“新控制器操作”$myEntity->setTime(...) 中,并让 Symfony 和 Doctrine 在您的“编辑控制器操作”中完成它们的工作。

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 2022-01-25
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多