Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony时区类型表_Php_Forms_Symfony_Time_Timezone - Fatal编程技术网

Php Symfony时区类型表

Php Symfony时区类型表,php,forms,symfony,time,timezone,Php,Forms,Symfony,Time,Timezone,在my symfony 3应用程序中,用户可以在表单中选择时区 所以我把它放在我的表格里如下: $builder ->add('timezone', TimezoneType::class) 这是工作,但我想个性化什么用户可以选择在列表中。 事实上,我看到了各个大陆的所有国家。列表太大,城市太多 我希望有一个只包含主要城市的较短列表,并将UTC放在每个城市之前。 有点像推特 例如: (UTC)伦敦 (UTC+01:00)巴黎 (UTC+02:00)雅典 (UTC+03:

在my symfony 3应用程序中,用户可以在表单中选择时区

所以我把它放在我的表格里如下:

    $builder
    ->add('timezone', TimezoneType::class)
这是工作,但我想个性化什么用户可以选择在列表中。 事实上,我看到了各个大陆的所有国家。列表太大,城市太多

我希望有一个只包含主要城市的较短列表,并将UTC放在每个城市之前。 有点像推特

例如:

  • (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 AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

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

您可能需要使用
选择类型
并创建自己的列表。从文档中:
您可以手动指定选项,但是您应该直接使用ChoiceType。
您需要一个示例吗?我看到您过去在
选择类型方面有问题,如果您仍然有问题,我可以举个例子。一旦你知道怎么做就很容易了。不,没关系,我在想时区中有一个选项,可以通过选择类型手册直接创建一个不同的列表。嘿,太好了,我需要在哪里创建getCustomFlippedTimezones()函数?在我的实体文件中?或者我需要直接从供应商处在时区存储库中进行更改?因为我想在其他表单中使用此函数。为了可重用性,您必须创建自己的表单类型。这很简单,不用担心:永远不要更改供应商目录中的任何内容,您将在以后支付价格;)