在我的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;
}
}