2013-03-04 61 views
4

在我的系統中,數據庫時間戳記錄爲UTC值。Symfony2在表單中用時區呈現datetime

每個用戶的個人資料中都有一個時區記錄。登錄時,時區值從其配置文件傳輸到其會話($ session-> set('timezone',$ tz);)。

我的大部分代碼都使用Sonata INTL軟件包,因此用戶可以看到他們的時區正確顯示的日期時間值,(表格字段中的除外)。

我最近發現了一些Symfony2類型的model_timezone和view_timezone字段。我可以使字段顯示正確的值(如下面的代碼片段所示),但是我想了解如何從用戶會話填充view_timezone? (我猜我可以通過在$選擇以某種方式?)

事件控制器片段:

$object = <object loaded>; 

$form = $this->createForm(new MyEventType(), $object); 

MyEventType表單代碼:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('id', null, array(
     'label'   => 'Event ID', 
    )); 

    $builder->add('changed', 'datetime', array(
     'date_widget'  => 'single_text', 
     'date_format'  => \IntlDateFormatter::SHORT, 
     'time_widget'  => 'single_text', 

     'model_timezone' => 'UTC', 
     'view_timezone'  => 'Pacific/Auckland', 
    )); 
+0

和最新的問題?您可以將會話值添加到'view_timezone'選項 – Hast 2013-03-04 10:58:18

+0

嗨哈斯特,我想這個問題應該是措辭:「我如何獲得我的會話價值的形式?」我有許多具有日期時間字段的表單。所以使用的方法應該很容易重複。 – ritter 2013-03-04 19:56:49

回答

5

這個問題的解決方案是二-fold:

  • 將一組選項傳遞給createForm方法,其中包含'view_timezone'的值
  • 確保'view_timezone'在表單默認選項中定義。

我已經更新了我的代碼片段,以反映所需的變革:

事件控制器片段:

$object = <object loaded>; 

$form = $this->createForm(new MyEventType(), $object, array(
    'view_timezone' => $this->container->get('session')->get('timezone')) 
); 

MyEventType表單代碼:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('id', null, array(
     'label'   => 'Event ID', 
    )); 

    $builder->add('changed', 'datetime', array(
     'date_widget'  => 'single_text', 
     'date_format'  => \IntlDateFormatter::SHORT, 
     'time_widget'  => 'single_text', 

     'model_timezone' => 'UTC', 
     'view_timezone'  => $options['view_timezone'], 
    )); 

... 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class'  => 'Stuff\CoreBundle\Entity\MyEvent', 
     'view_timezone'  => 'UTC', 
    )); 
} 
+0

如果我在表單本身帶有日期字段的時區字段,並且我想在存儲日期時使用該時區,該怎麼辦? – adityap 2013-05-08 10:41:24