diff --git a/src/Form/Rule/Mapping/PatternRule.php b/src/Form/Rule/Mapping/PatternRule.php new file mode 100644 index 0000000..f7e0ebf --- /dev/null +++ b/src/Form/Rule/Mapping/PatternRule.php @@ -0,0 +1,54 @@ + + */ +class PatternRule implements ConstraintMapperInterface +{ + const RULE_NAME = 'pattern'; + + /** + * @var bool + */ + private $enabled; + + public function __construct($enabled) + { + $this->enabled = $enabled; + } + + /** + * {@inheritdoc} + */ + public function resolve(Constraint $constraint, FormInterface $form, RuleCollection $collection) + { + if (!$this->supports($constraint, $form)) { + throw new LogicException(); + } + + /** @var \Symfony\Component\Validator\Constraints\Regex $constraint */ + $collection->set( + self::RULE_NAME, + new ConstraintRule( + self::RULE_NAME, + $constraint->getHtmlPattern(), + new RuleMessage($constraint->message), + $constraint->groups + ) + ); + } + + public function supports(Constraint $constraint, FormInterface $form) + { + return $this->enabled && get_class($constraint) === 'Symfony\Component\Validator\Constraints\Regex'; + } +} diff --git a/src/Resources/config/form_rule_additional_mappers.yml b/src/Resources/config/form_rule_additional_mappers.yml index 3d47d87..6eac199 100644 --- a/src/Resources/config/form_rule_additional_mappers.yml +++ b/src/Resources/config/form_rule_additional_mappers.yml @@ -29,3 +29,10 @@ services: public: false tags: - { name: form_rule_constraint_mapper } + + boekkooi.jquery_validation.mapper.pattern: + class: Boekkooi\Bundle\JqueryValidationBundle\Form\Rule\Mapping\PatternRule + arguments: [ %boekkooi.jquery_validation.additional.pattern% ] + public: false + tags: + - { name: form_rule_constraint_mapper } diff --git a/tests/Functional/TestBundle/Form/Type/AdditionalRulesFormType.php b/tests/Functional/TestBundle/Form/Type/AdditionalRulesFormType.php index 447785c..8dffc4f 100644 --- a/tests/Functional/TestBundle/Form/Type/AdditionalRulesFormType.php +++ b/tests/Functional/TestBundle/Form/Type/AdditionalRulesFormType.php @@ -54,6 +54,12 @@ public function buildForm(FormBuilderInterface $builder, array $options) )), ), )) + + ->add('pattern', 'text', array( + 'constraints' => array( + new Constraints\Regex('/^[a-zA-Z]+$/'), + ), + )) ; } diff --git a/tests/Functional/TotalFormTest.php b/tests/Functional/TotalFormTest.php index 6f58c4e..1cc5f07 100644 --- a/tests/Functional/TotalFormTest.php +++ b/tests/Functional/TotalFormTest.php @@ -539,7 +539,8 @@ public function it_should_additional_rules() "additional_rules\x5Bipv4_ipv6\x5D": {"one_or_other": {"ipv4": true, "ipv6": true}}, "additional_rules\x5Biban\x5D": {"iban": true}, "additional_rules\x5Bluhn\x5D": {"luhn": true}, - "additional_rules\x5Bfile\x5D": {"accept": "text\/plain,application\/pdf"} + "additional_rules\x5Bfile\x5D": {"accept": "text\/plain,application\/pdf"}, + "additional_rules\x5Bpattern\x5D": {"pattern": "[a-zA-Z]+"} }, messages: { "additional_rules\x5Bipv4\x5D": {"ipv4": "This\x20is\x20not\x20a\x20valid\x20IP\x20address."}, @@ -547,7 +548,8 @@ public function it_should_additional_rules() "additional_rules\x5Bipv4_ipv6\x5D": {"one_or_other": "This\x20is\x20not\x20a\x20valid\x20IP\x20address."}, "additional_rules\x5Biban\x5D": {"iban": "This\x20is\x20not\x20a\x20valid\x20International\x20Bank\x20Account\x20Number\x20\x28IBAN\x29."}, "additional_rules\x5Bluhn\x5D": {"luhn": "Invalid\x20card\x20number."}, - "additional_rules\x5Bfile\x5D": {"accept": "The\x20mime\x20type\x20of\x20the\x20file\x20is\x20invalid\x20\x28\x7B\x7B\x20type\x20\x7D\x7D\x29.\x20Allowed\x20mime\x20types\x20are\x20text\x2Fplain,\x20application\x2Fpdf."} + "additional_rules\x5Bfile\x5D": {"accept": "The\x20mime\x20type\x20of\x20the\x20file\x20is\x20invalid\x20\x28\x7B\x7B\x20type\x20\x7D\x7D\x29.\x20Allowed\x20mime\x20types\x20are\x20text\x2Fplain,\x20application\x2Fpdf."}, + "additional_rules\x5Bpattern\x5D": {"pattern": "This\x20value\x20is\x20not\x20valid."} } }); })(jQuery);',