Symfony buildForm конвертирует дату и время в локальную и обратно в utc

Поэтому я хочу показать опции для установки даты для активности по местному времени, но сохранить ее в UTC как стандарт Symfony. У меня 5 разных пользовательских сегментов с 5 разными значениями часовых поясов. Пользователь может установить новую активность в форме. Каждый пользовательский объект имеет свой собственный часовой пояс. У меня вопрос, где мне установить конверсию? У меня есть пользовательский объект в состоянии сеанса пользователя.

В действии Controller, где я вызываю 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')));
}

The 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);
}

Поэтому я считаю, что я только что ответил на свой вопрос, который заставляет меня задавать вопросы; Это соглашение / лучшая практика, как вы это делаете?

1 ответ

Решение

Вы это усложняете. Формы Symfony2 уже хорошо справляются с этой задачей.

Посмотри пожалуйста:

Часовой пояс модели: http://symfony.com/doc/current/reference/forms/types/date.html

Просмотреть часовой пояс: http://symfony.com/doc/current/reference/forms/types/date.html

При правильном использовании они решат вашу проблему без какого-либо дополнительного кода.

Вы можете добавить свой пользовательский сегмент (или любые другие данные, которые вы используете для определения правильного часового пояса) в вашу форму и использовать часовой пояс в этом пользовательском сегменте, чтобы установить view_timezone в поле даты. Что-то в том же духе:)

Другие вопросы по тегам