2016-04-14 48 views
0

Bu nedenle, yerel saatte bir etkinlik için bir tarih belirlemek için seçenekleri göstermek, ancak bunu UTC'de symfony standardı olarak kaydetmek istiyorum. 5 farklı Timezon değeri olan 5 farklı Kullanıcı segmentim var. Bir kullanıcı bir formda yeni bir aktivite ayarlayabilir. Her kullanıcı varlığının kendi saat dilimi kümesi vardır. Sorum şu, dönüşümü nerede ayarlayabilirim? Oturum açmış bir kullanıcı oturum durumunda kullanıcı var.Symfony buildForm datetime öğesini yerel olarak ve utc'ye dönüştürebilir

FormBuilder'ı çağırdığım ControllerAction'da?

FormBuilder'da?

Form oluşturucu benim için hala biraz bulanık ve içinde çok şey olduğunu biliyorum. basitleştirilmiş

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

Yani, iman Sadece sormak beni zorlar Kendi sorumu, Yanıtım; Bu kongre/en iyi uygulama nasıl yapılır?

cevap

0

Bunu fazlasıyla karıştırıyorsunuz. Symfony2 formları zaten bu güzelce kapsar.

bakınız:

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

Görünüm dilimi: Doğru kullanıldığında http://symfony.com/doc/current/reference/forms/types/date.html#view-timezone

bu gerekli herhangi bir ekstra kodu olmadan sorunu çözmek.

Kullanıcı segmentinizi (veya doğru saat dilimi olan çıktısını almak için kullandığınız her türlü veriyi) formunuza enjekte edebilir ve tarih diliminizde view_timezone değerini ayarlamak için o kullanıcı segmentindeki saat dilimini kullanabilirsiniz. Yine de bu hatlar boyunca birşeyler :)

+0

Teşekkür ederiz! Ben benim dev makine CEST ve UTC üzerinde üretim sunucusunda olduğunu fark edene kadar saçımı çekiyordum. Ama bu hile yaptı! – Conjak