2016-04-14 7 views
0

Also ich möchte Optionen zeigen, um ein Datum für eine Aktivität in lokaler Zeit zu setzen, aber speichern Sie es in UTC als symfony Standard. Ich habe 5 verschiedene Benutzersegmente mit 5 verschiedenen Zeitzonenwerten. Ein Benutzer kann eine neue Aktivität in einem Formular festlegen. Für jede Benutzereinheit ist eine eigene Zeitzone festgelegt. Meine Frage ist, wo setze ich die Konvertierung ein? Ich habe die Benutzereinheit in einem angemeldeten Benutzersitzungszustand.Symfony buildForm konvertiert datetime zu local und zurück zu utc

In der ControllerAction, wo ich den formBuilder aufrufen?

Im FormularBuilder?

Der Formbauer ist immer noch etwas verschwommen für mich und ich weiß, dass da viel passiert.

Die Formbuilder vereinfacht:

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

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

So glaube ich, ich habe meine eigene Frage nur beantworten, die mich zu fragen, zwingt; Ist das die Konvention/Best Practice, wie geht das?

Antwort

0

Sie verkomplizieren dies. Symfony2 Forms deckt das schon schön ab.

Bitte sehen:

Modell Zeitzone: http://symfony.com/doc/current/reference/forms/types/date.html#model-timezone

Blick Zeitzone: http://symfony.com/doc/current/reference/forms/types/date.html#view-timezone

Richtig eingesetzt diese Ihr Problem ohne zusätzlichen Code benötigt lösen.

Sie könnten Ihr Benutzersegment (oder die Daten, die Sie zur Ableitung der richtigen Zeitzone verwenden) in Ihr Formular einfügen und die Zeitzone für dieses Benutzersegment verwenden, um view_timezone in Ihrem Datumsfeld festzulegen. Etwas in diese Richtung sowieso :)

+0

Vielen Dank! Ich zog mir die Haare aus, bis ich bemerkte, dass meine Dev-Maschine auf MESZ und Produktionsserver auf UTC war. Aber das hat den Trick gemacht! – Conjak