Symfony buildForm 将日期时间转换为本地时间并返回到 utc
Symfony buildForm convert datetime to local and back to utc
所以我想显示选项以在本地时间设置 activity 的日期,但将其保存为 UTC 作为 symfony 标准。我有 5 个不同的用户段和 5 个不同的时区值。用户可以在表单中设置新的 activity。每个用户实体都有自己的时区集。我的问题是在哪里设置转换?我的用户实体处于登录用户会话状态。
在调用 formBuilder 的 ControllerAction 中?
在 formBuilder 中?
Formbuilder 对我来说还是有点模糊,我知道里面发生了很多事情。
formBuilder,简化:
public function buildForm(FormBuilderInterface $builder, array $options)
{
//...
$builder->add('name');
$builder->add('startDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
$builder->add('endDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
//...
$builder->add('submit', SubmitType::class, array('attr' => array('class' => 'button')));
}
ControllerAction:
public function activityAction(Request $request, Activity $activity){
$variables = array();
/**
* TODO Determine User Local timezone and store as UTC
*
*/
$user = $this->get('security.token_storage')->getToken()->getUser();
$timezone = $user->getTimezone();
$activity = new Activity();
$form = $this->createForm(ActivityType::class, $activity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$activity->setName($form->get('name')->getData());
/**
*
* Maybe here, (I've just realized)
* Because earlier, the form just handled the datetime without conversion
* And just stored them in the DB as they where
*
*/
// Example: $timezone = 'Europe/London';
$date = new DateTime();
$date->setTimestamp( $form->get('startDate')->getData() );
$date->setTimezone(new DateTimeZone($timezone));
$activity->setStartDate($date->format("Y-m-d H:i:s"));
$date = new DateTime();
$date->setTimestamp( $form->get('endDate')->getData() );
$date->setTimezone(new DateTimeZone($timezone));
$activity->setEndDate($date->format("Y-m-d H:i:s"));
$em = $this->getDoctrine()->getManager();
$em->persist($activity);
$em->flush();
}
elseif ($form->isSubmitted() && !$form->isValid() ) {
$variables['message'] = 'Something went wrong!';
}
$variables["title"] = "Create Activty";
$variables["form"] = $form->createView();
return $this->render('AcmeBundle:SomeViews:activity.html.twig', $variables);
}
所以我相信,我刚刚回答了我自己的问题,这迫使我问;这是convention/best练习你怎么做的吗?
你把这个复杂化了。 Symfony2 表单已经很好地涵盖了这一点。
请看:
模型时区:
http://symfony.com/doc/current/reference/forms/types/date.html#model-timezone
查看时区:
http://symfony.com/doc/current/reference/forms/types/date.html#view-timezone
正确使用这些可以解决您的问题,无需任何额外代码。
您可以将您的用户段(或您用来推断哪个是正确时区的任何数据)注入您的表单,并使用该用户段上的时区在您的日期字段上设置 view_timezone。无论如何,这方面的东西:)
所以我想显示选项以在本地时间设置 activity 的日期,但将其保存为 UTC 作为 symfony 标准。我有 5 个不同的用户段和 5 个不同的时区值。用户可以在表单中设置新的 activity。每个用户实体都有自己的时区集。我的问题是在哪里设置转换?我的用户实体处于登录用户会话状态。
在调用 formBuilder 的 ControllerAction 中?
在 formBuilder 中?
Formbuilder 对我来说还是有点模糊,我知道里面发生了很多事情。
formBuilder,简化:
public function buildForm(FormBuilderInterface $builder, array $options)
{
//...
$builder->add('name');
$builder->add('startDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
$builder->add('endDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
//...
$builder->add('submit', SubmitType::class, array('attr' => array('class' => 'button')));
}
ControllerAction:
public function activityAction(Request $request, Activity $activity){
$variables = array();
/**
* TODO Determine User Local timezone and store as UTC
*
*/
$user = $this->get('security.token_storage')->getToken()->getUser();
$timezone = $user->getTimezone();
$activity = new Activity();
$form = $this->createForm(ActivityType::class, $activity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$activity->setName($form->get('name')->getData());
/**
*
* Maybe here, (I've just realized)
* Because earlier, the form just handled the datetime without conversion
* And just stored them in the DB as they where
*
*/
// Example: $timezone = 'Europe/London';
$date = new DateTime();
$date->setTimestamp( $form->get('startDate')->getData() );
$date->setTimezone(new DateTimeZone($timezone));
$activity->setStartDate($date->format("Y-m-d H:i:s"));
$date = new DateTime();
$date->setTimestamp( $form->get('endDate')->getData() );
$date->setTimezone(new DateTimeZone($timezone));
$activity->setEndDate($date->format("Y-m-d H:i:s"));
$em = $this->getDoctrine()->getManager();
$em->persist($activity);
$em->flush();
}
elseif ($form->isSubmitted() && !$form->isValid() ) {
$variables['message'] = 'Something went wrong!';
}
$variables["title"] = "Create Activty";
$variables["form"] = $form->createView();
return $this->render('AcmeBundle:SomeViews:activity.html.twig', $variables);
}
所以我相信,我刚刚回答了我自己的问题,这迫使我问;这是convention/best练习你怎么做的吗?
你把这个复杂化了。 Symfony2 表单已经很好地涵盖了这一点。
请看:
模型时区: http://symfony.com/doc/current/reference/forms/types/date.html#model-timezone
查看时区: http://symfony.com/doc/current/reference/forms/types/date.html#view-timezone
正确使用这些可以解决您的问题,无需任何额外代码。
您可以将您的用户段(或您用来推断哪个是正确时区的任何数据)注入您的表单,并使用该用户段上的时区在您的日期字段上设置 view_timezone。无论如何,这方面的东西:)