在Symofny 2中访问控制器中的规范化表单数据

时间:2016-03-21 21:12:50

标签: forms symfony

我必须在FormType中添加一个表单事件监听器(PRE_SUBMIT),以便根据用户提交的另一个字段的值设置字段的默认值:

//In my FormType:

public function onPreSubmit(FormEvent $event)
{
    $formData = $event->getData();
    if (empty($formData['time_until'])) {
        $date = new \DateTime($formData['time_from']);
        $date->add(new \DateInterval('PT1H'));
        $formData['time_until'] = $date->format('Y-m-d H:i');
    }
    $event->setData($formData);
}

time_unti键已设置,稍后其值会映射到表单的time_until字段datetime类型:

        ->add('time_until', datetime, [
            'required' => false,
            'input' => 'datetime',
            'widget' => 'single_text',
            'format' => 'yyyy-MM-dd HH:mm',
            'label' => false,
        ])

到目前为止没问题。但是,我需要访问控制器中表单字段的规范化值,而不是在调用DateTime之后访问表单上的$form->handleRequest($request);个对象

通过“标准化”,我的意思是我希望能够做到:

$form->get('time_until')并返回“yyyy-MM-dd HH:mm”形式的字符串,而不是DateTime键下的表单中存储的time_until对象。

建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 您可以在表单类型中添加一些属性$normalizedTimeUntil +添加将返回此值的getter getNormalizedTimeUntil()。然后在Form事件中你可以设置这个属性,在控制器中你可以用getter函数将它拉出表单类型对象

  2. 或者您可以添加非映射字符串表单字段timeUntilStringhttp://symfony.com/doc/current/reference/forms/types/form.html#mapped)并填写表单事件

  3. 或者您可以添加转换器(http://symfony.com/doc/current/cookbook/form/data_transformers.html)以将此Datetime对象转换为字符串。如果您需要在数据库中以字符串形式存储日期,那么这将是一种便利。然后表单字段getter将在控制器中返回字符串(并且也将以字符串形式存储在db中)