From 04c56f667aede6108b53fda60ab777cd30496893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 10 Dec 2015 14:55:12 +0100 Subject: [PATCH] register birthdateValidator in birthdate validator, improve the message --- DependencyInjection/ChillPersonExtension.php | 5 +++ DependencyInjection/Configuration.php | 35 ++++++++++++++++--- Resources/config/services.yml | 8 +++++ Resources/config/validation.yml | 2 ++ Resources/translations/validators.fr.yml | 1 + .../Controller/PersonControllerCreateTest.php | 2 +- Validator/Constraints/Birthdate.php | 5 +++ Validator/Constraints/BirthdateValidator.php | 7 +++- 8 files changed, 58 insertions(+), 7 deletions(-) diff --git a/DependencyInjection/ChillPersonExtension.php b/DependencyInjection/ChillPersonExtension.php index 548f3536f..589e2c14e 100644 --- a/DependencyInjection/ChillPersonExtension.php +++ b/DependencyInjection/ChillPersonExtension.php @@ -24,8 +24,13 @@ class ChillPersonExtension extends Extension implements PrependExtensionInterfac $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); + // set configuration for double metaphone $container->setParameter('cl_chill_person.search.use_double_metaphone', $config['search']['use_double_metaphone']); + + // set configuration for validation + $container->setParameter('chill_person.validation.birtdate_not_before', + $config['validation']['birthdate_not_after']); $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index d92d0cfbe..833b5498d 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -12,6 +12,10 @@ use Symfony\Component\Config\Definition\ConfigurationInterface; */ class Configuration implements ConfigurationInterface { + + private $validationBirthdateNotAfterInfos = "The period before today during which" + . " any birthdate is not allowed. The birthdate is expressed as ISO8601 : " + . "https://en.wikipedia.org/wiki/ISO_8601#Durations"; /** * {@inheritDoc} */ @@ -29,13 +33,34 @@ class Configuration implements ConfigurationInterface ->booleanNode('use_double_metaphone') ->defaultFalse() ->end() - ->booleanNode('use_trigrams')->defaultFalse()->end(); + ->booleanNode('use_trigrams') + ->defaultFalse() + ->end() + ->end() + ->end() + ->arrayNode('validation') + ->canBeDisabled() + ->children() + ->scalarNode('birthdate_not_after') + ->info($this->validationBirthdateNotAfterInfos) + ->defaultValue('P1D') + ->validate() + ->ifTrue(function($period) { + try { + $interval = new \DateInterval($period); + } catch (\Exception $ex) { + return true; + } + return false; + }) + ->thenInvalid('Invalid period for birthdate validation : "%s" ' + . 'The parameter should match duration as defined by ISO8601 : ' + . 'https://en.wikipedia.org/wiki/ISO_8601#Durations') + ->end() + ->end() + ->end(); - // Here you should define the parameters that are allowed to - // configure your bundle. See the documentation linked above for - // more information on that topic. - return $treeBuilder; } } diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 26d220c2f..0e81ec15a 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -48,3 +48,11 @@ services: tags: - { name: security.voter } - { name: chill.role } + + chill.person.birthdate_validation: + class: Chill\PersonBundle\Validator\Constraints\BirthdateValidator + arguments: + - "%chill_person.validation.birtdate_not_before%" + tags: + - { name: validator.constraint_validator, alias: birthdate_not_before } + diff --git a/Resources/config/validation.yml b/Resources/config/validation.yml index ccda164ee..f6e683d3e 100644 --- a/Resources/config/validation.yml +++ b/Resources/config/validation.yml @@ -22,6 +22,8 @@ Chill\PersonBundle\Entity\Person: - Date: message: 'Birthdate not valid' groups: [general, creation] + - Chill\PersonBundle\Validator\Constraints\Birthdate: + groups: [general, creation] gender: - NotNull: groups: [general, creation] diff --git a/Resources/translations/validators.fr.yml b/Resources/translations/validators.fr.yml index b29c5306d..38fabbbbf 100644 --- a/Resources/translations/validators.fr.yml +++ b/Resources/translations/validators.fr.yml @@ -11,3 +11,4 @@ 'Closing date is not valid': 'La date de fermeture n''est pas valide' 'Closing date can not be null': 'La date de fermeture ne peut être nulle' The date of closing is before the date of opening: La période de fermeture est après la période d'ouverture +The birthdate must be before %date%: La date de naissance doit être avant le %date% diff --git a/Tests/Controller/PersonControllerCreateTest.php b/Tests/Controller/PersonControllerCreateTest.php index bcada006a..83acbbf7b 100644 --- a/Tests/Controller/PersonControllerCreateTest.php +++ b/Tests/Controller/PersonControllerCreateTest.php @@ -38,7 +38,7 @@ class PersonControllerCreateTest extends WebTestCase const CREATEDATE_INPUT = "chill_personbundle_person_creation[creation_date]"; const CENTER_INPUT = "chill_personbundle_person_creation[center]"; - const LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq."; + const LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta.Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosq."; /** * return an authenticated client, useful for submitting form diff --git a/Validator/Constraints/Birthdate.php b/Validator/Constraints/Birthdate.php index 35ad118df..d09d549fd 100644 --- a/Validator/Constraints/Birthdate.php +++ b/Validator/Constraints/Birthdate.php @@ -34,4 +34,9 @@ use Symfony\Component\Validator\Constraint; class Birthdate extends Constraint { public $message = "The birthdate must be before %date%"; + + public function validatedBy() + { + return 'birthdate_not_before'; + } } diff --git a/Validator/Constraints/BirthdateValidator.php b/Validator/Constraints/BirthdateValidator.php index 5f65c3ed7..cba955ef6 100644 --- a/Validator/Constraints/BirthdateValidator.php +++ b/Validator/Constraints/BirthdateValidator.php @@ -38,6 +38,11 @@ class BirthdateValidator extends ConstraintValidator public function validate($value, Constraint $constraint) { + if ($value === NULL) { + + return; + } + if (!$value instanceof \DateTime) { throw new \LogicException('The input should a be a \DateTime interface,' . (is_object($value) ? get_class($value) : gettype($value))); @@ -47,7 +52,7 @@ class BirthdateValidator extends ConstraintValidator if ($limitDate < $value) { $this->context->buildViolation($constraint->message) - ->setParameter('%date%', $value->format(\DateTime::ATOM)) + ->setParameter('%date%', $limitDate->format('d-m-Y')) ->addViolation(); }