2016-04-14 7 views
0

したがって、現地時間での活動の日付を設定するオプションを表示したいが、それをsymfony標準としてUTCに保存する。 5つの異なるタイムゾーン値を持つ5つの異なるユーザーセグメントがあります。ユーザーはフォームで新しいアクティビティを設定できます。各ユーザーエンティティには独自のタイムゾーンが設定されています。私の質問はどこでコンバージョンを設定するのですか?私はユーザーエンティティをログインしているユーザーセッション状態にしています。Symfony buildForm datetimeをローカルに変換してからutcに戻す

私がformBuilderを呼び出すControllerActionでは、

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

だから私は信じて、私はちょうど尋ねるために私を強制的に自分の質問に答えました。これは、あなたがそれを行う方法のコンベンション/ベストプラクティスですか?

答えて

0

これを複雑にしています。 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を設定することができます。とにかくそれらの行に沿ったもの:)

+0

ありがとう!私の開発マシンがCEST上にあり、本番サーバーがUTC上にあることに気づくまで、私は髪を引っ張っていました。しかし、これはトリックでした! – Conjak

関連する問題