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

时间:2017-07-11 16:10:55

标签: symfony sonata-admin sonata

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

我有一个带日历的自定义页面,当我点击日历上的日期时,我希望将其重定向到已从查询字符串设置日期的事件的创建页面。类似的东西:

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

1 个答案:

答案 0 :(得分:0)

我在表单构建器上使用请求服务和标记为'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

enter image description here

在HTML中我有这个:

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

<强> P.S。当有人给出-1时,解释原因应该很好......