Symfony 奏鸣曲使 formmapper 项目可在逻辑条件下编辑

Symfony sonata make make formmapper item editable with logical condition

我在使用 symfony 时遇到了一个非常小的问题,但我现在根本不知道如何开始。我现在在编码时不断变化,从未完成实际的事情。

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('id')
        ->add('schedule');
}

现在,日程表是日期时间类型。一个 cronjob,以便在日程安排与当前白天匹配时执行代码。

管理员只需要能够在未来发生时更改计划日期时间,因此 read_only 应该在发生在过去时设置为真。

小问题,但我不知道最好的方法是什么?我可以想到多种解决方案:

  1. 我是否应该使用 twig 创建一个自定义模板来覆盖默认的编辑和构建逻辑?
  2. 应该在 configureListField 中创建链接到自定义模板的自定义操作吗?
  3. 我应该创建一个自定义控制器让控制器决定吗?如果是这样,我可以在管理员中保持我的 configureListField 和 configureShowField 完整,还是应该通过这个控制器完成列表和创建?

谢谢!

我终于解决了

我还尝试了获取您添加到表单映射器的内容的值。

//todo get value
$formMapper
  ->add('date')

所以我决定在 configureFormField 函数中做一个 var_dump。

protected function configureFormFields(FormMapper $formMapper)
{
   die("DIED ".var_dump($this)." DIED @".__FILE__." line ".__LINE__);
}

在 var_dump 中,我找到了一个名为 subject 的变量,在该主题中存储了您可以添加到 formmapper 的所有信息。

您可以通过以下方式获取主题:

$this->getSubject()

在主题中,您可以像处理您要编辑的实体一样处理它。就我而言,这是时间表。

if ($this->getSubject->getSchedule > new \Datetime('now')
{
  $formMapper
     ->add('channel', null, array('label' => 'Choose a channel'));
else
{
  $formMapper
     ->add('channel', null, array('label' => 'Channel', 'read_only' => 'true'));