Sonata Admin 从查询字符串编译表单字段

Sonata Admin compile form field from query string

在 Sonata Admin 中是否可以设置或预编译一个从查询字符串中获取的值?

我有一个带有日历的自定义页面,当我单击日历上的一个日期时,我想被重定向到一个事件的创建页面,其中日期已从查询字符串中设置。类似于:

http://localhost:8000/admin/app/event/create?date=2017-07-11

我通过使用 请求服务 和在我的表单生成器上标记为 'mapped' => false 字段解决了这个问题:

protected function configureFormFields(FormMapper $formMapper)
{
    $request = $this->getRequest();
    $dateParameter = $request->query->get('date');
    $date = null;

    if ($dateParameter) {
        $date = \DateTime::createFromFormat('!Y-m-d', $dateParameter);
    }

    if (!$date) {
        $formMapper
            ->add('date', DatePickerType::class)
            ->add('calendarDate', HiddenType::class, array(
                'data' => null,
                'mapped' => false,
            ))
        ;
    } else {
        $formMapper
            ->add('date', DatePickerType::class, array(
                'data' => $date,
                'disabled' => true,
            ))
            ->add('calendarDate', HiddenType::class, array(
                'data' => $date->format('Y-m-d'),
                'mapped' => false,
            ))
        ;
    }

    $formMapper
        // other fields
        ->add('other_field', ModelType::class)
    ;
}

然后,我将通过以下方法更新实体字段:

public function prePersist($myEntity)
{
    $this->preUpdate($myEntity);
}

public function preUpdate($myEntity)
{
    $dateString = $this->getForm()->get('calendarDate')->getData();
    if ($dateString) {
        $date = \DateTime::createFromFormat('!Y-m-d', $dateString);
        if ($date) {
            $myEntity->setDate($date);
        }
    }
}

通过这种方式,我可以在有或没有查询字符串参数的情况下使用我的表单 date:

http://localhost:8000/admin/app/event/24/edit?date=2017-07-01

在 HTML 我有这个:

<input type="hidden" id="s59664a9ea44ce_calendarDate" name="s59664a9ea44ce[calendarDate]" class=" form-control" value="2017-07-01" />

P.S。当有人给出 -1 时,应该很好地解释为什么...