<?php
declare(strict_types=1);
namespace App\Form\Type;
use App\Form\DataTransformer\CountryPhoneTransformer;
use libphonenumber\PhoneNumberUtil;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CountryPhoneType extends AbstractType
{
private CountryPhoneTransformer $transformer;
private ?string $currentLanguage;
public function __construct(CountryPhoneTransformer $transformer, RequestStack $requestStack)
{
$this->transformer = $transformer;
$this->currentLanguage = $requestStack->getCurrentRequest()?->getLocale() ?? 'en';
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$phoneUtil = PhoneNumberUtil::getInstance();
$regions = $phoneUtil->getSupportedRegions();
$prefixChoices = [];
foreach ($regions as $region) {
$countryCode = $phoneUtil->getCountryCodeForRegion($region);
$countryName = \Locale::getDisplayRegion('-' . $region, $this->currentLanguage) . " (+{$countryCode})";
$prefixChoices[$countryName] = $countryCode;
}
$builder
->add('country_code', ChoiceType::class, [
'label' => 'pages.common.component.phone.countryCode',
'choices' => $prefixChoices,
'preferred_choices' => $options['preferred_choices'],
])
->add('phone_number', TextType::class, [
'label' => 'pages.common.component.phone.number',
'attr' => [
'maxlength' => 20,
'pattern' => '[0-9+]*',
],
])
;
$builder->addModelTransformer($this->transformer);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'preferred_choices' => [],
]);
$resolver->setAllowedTypes('preferred_choices', ['array', \Traversable::class, 'callable', 'string', PropertyPath::class, PreferredChoice::class]);
}
}