4

私のシステムでは、データベースのタイムスタンプはUTC値として記録されます。

すべてのユーザーのプロファイルにタイムゾーンが記録されています。ログインすると、タイムゾーン値がプロファイルからセッションに転送されます($ session-> set('timezone'、$ tz);)。

私のコードのほとんどはSonataINTLバンドルを使用しているため、フォームフィールドを除いて、ユーザーは自分のタイムゾーンに対して正しく表示された日時の値を確認できます。

私は最近、いくつかのSymfony2タイプのmodel_timezoneフィールドとview_timezoneフィールドを発見しました。フィールドに正しい値を表示させることはできますが(以下のコードスニペットに示されているように)、ユーザーセッションからview_timezoneを設定する方法を理解したいですか?(私は何らかの方法で$ optionsを渡すことができると思いますか?)

イベントコントローラースニペット:

$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',
    ));
4

1 に答える 1

5

この問題の解決策は2つあります。

  • 'view_timezone'の値を含むオプションの配列をcreateFormメソッドに渡します
  • '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',
    ));
}
于 2013-03-04T21:41:15.710 に答える