Symfony TimezoneType Form



在我的symfony 3应用程序中,用户可以在表单中选择他们的时区。

所以我把它放在我的形式中,就像这样:

    $builder
    ->add('timezone', TimezoneType::class)

它正在工作,但我想个性化用户可以在列表中选择的内容。实际上,我逐个大陆看到所有国家。这个名单太大了,城市太多了。

我想有一个更短的列表,只有主要城市,并将UTC放在每个城市之前。像推特这样的东西。

例:

  • (世界标准时间( 伦敦
  • (UTC+01:00( 巴黎
  • (UTC+02:00( 雅典
  • (UTC+03:00( 莫斯科
  • 等。。。

有人可以帮助我吗?

谢谢

正如你在时区类型中看到的,Symfony以这种方式获取时区:

private static function getFlippedTimezones()
{
    if (null === self::$timezones) {
        self::$timezones = array();
        foreach (DateTimeZone::listIdentifiers() as $timezone) {
            $parts = explode('/', $timezone);
            if (count($parts) > 2) {
                $region = $parts[0];
                $name = $parts[1].' - '.$parts[2];
            } elseif (count($parts) > 1) {
                $region = $parts[0];
                $name = $parts[1];
            } else {
                $region = 'Other';
                $name = $parts[0];
            }
            self::$timezones[$region][str_replace('_', ' ', $name)] = $timezone;
        }
    }
    return self::$timezones;
}

您可以创建自己的类型或在表单中使用它,例如

 $choices = self::getCustomFlippedTimezones();
 $builder
        ->add('timeZone', ChoiceType::class, array(
                'choices' => $choices
            ))

对于可重用性:

// src/AppBundle/Form/Type/CustomTimeZoneType.php
namespace AppBundleFormType;
use SymfonyComponentFormAbstractType;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
class CustomTimeZoneType extends AbstractType
{
    private static function getFlippedTimezones() { /*[...]*/}
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => self::getCustomFlippedTimezones(),
            'choices_as_values' => true,
        ));
    }
    public function getParent()
    {
        return ChoiceType::class;
    }
}

相关内容

  • 没有找到相关文章