diff --git a/src/Bundle/ChillPersonBundle/Form/DataTransformer/PhoneNumberTypeDataTransformer.php b/src/Bundle/ChillPersonBundle/Form/DataTransformer/PhoneNumberTypeDataTransformer.php new file mode 100644 index 000000000..2ccaaf7bb --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Form/DataTransformer/PhoneNumberTypeDataTransformer.php @@ -0,0 +1,45 @@ +countryCodePrefix = $countryCodePrefix; + } + + /** + * @param string $phoneNumber + */ + public function reverseTransform($phoneNumber): string + { + $phoneNumber = preg_replace('/[^0-9+]/', '', $phoneNumber); + + if (0 === strpos($phoneNumber, '00', 0)) { + $phoneNumber = substr_replace($phoneNumber, '+', 0, 2); + } + + if (0 === strpos($phoneNumber, '0', 0)) { + $phoneNumber = substr_replace($phoneNumber, $this->countryCodePrefix, 0, 1); + } + + return $phoneNumber; + } + + public function transform($phoneNumber) + { + return $phoneNumber; + } +} diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php b/src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php index 00243349f..804eec7a9 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php @@ -36,7 +36,7 @@ class PersonPhoneType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { - $builder->add('phonenumber', TelType::class, [ + $builder->add('phonenumber', PhoneNumberType::class, [ 'label' => 'Other phonenumber', 'required' => true, ]); diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PhoneNumberType.php b/src/Bundle/ChillPersonBundle/Form/Type/PhoneNumberType.php new file mode 100644 index 000000000..a56ffcee0 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Form/Type/PhoneNumberType.php @@ -0,0 +1,51 @@ +parameterBag = $parameterBag; + } + + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->addViewTransformer( + new PhoneNumberTypeDataTransformer($options['default_country_prefix']) + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver + ->setDefined('default_country_prefix') + ->setAllowedTypes('default_country_prefix', 'string') + ->setDefaults([ + // TODO: Is it the best way to do that? + 'default_country_prefix' => $this->parameterBag->get('chill_main.phonenumber_default_country_code') ?? '+32', + ]); + } + + public function getParent(): string + { + return TelType::class; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Form/Type/PhoneNumberTypeTest.php b/src/Bundle/ChillPersonBundle/Tests/Form/Type/PhoneNumberTypeTest.php new file mode 100644 index 000000000..9108c281f --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Form/Type/PhoneNumberTypeTest.php @@ -0,0 +1,84 @@ +parameterBag = $this->createMock(ParameterBagInterface::class); + + // Mandatory + parent::setUp(); + } + + protected function getExtensions() + { + // create a type instance with the mocked dependencies + $type = new PhoneNumberType($this->parameterBag); + + return [ + new PreloadedExtension([$type], []), + ]; + } + + public function singleFieldProvider() + { + yield ['abc', [], '']; + + yield ['abc', ['default_country_prefix' => '+34'], '']; + + yield ['123', [], '123']; + + yield ['0,-03f212@%3g4 g5k 6789', [], '+32123456789']; + + yield ['0032 123456789', [], '+32123456789']; + + yield ['+32 123456789', ['default_country_prefix' => '+34'], '+32123456789']; + + yield ['0123456789', ['default_country_prefix' => '+33'], '+33123456789']; + + yield ['0486/540660', [], '+32486540660']; + + yield ['0486/540.660', ['default_country_prefix' => '+36'], '+36486540660']; + } + + + /** + * @dataProvider singleFieldProvider + */ + public function testSingleField(string $input, array $options, string $output) + { + $form = $this->factory->create(PhoneNumberType::class, null, $options); + + $form->submit($input); + + if (method_exists($form, 'getTransformationFailure') && $failure = $form->getTransformationFailure()) { + throw $failure; + } + + self::assertTrue($form->isSynchronized()); + + $view = $form->createView(); + + self::assertSame($output, $view->vars['value']); + } +}