From d9e142bd624fe4c6311442f420837cf3390d5e16 Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Mon, 23 Apr 2012 15:55:54 +0200 Subject: [PATCH] [Form] Restored and deprecated method `guessMinLength` in FormTypeGuesser --- CHANGELOG-2.1.md | 1 + UPGRADE-2.1.md | 23 +++++++ .../Doctrine/Form/DoctrineOrmTypeGuesser.php | 7 ++ .../Bridge/Propel1/Form/PropelTypeGuesser.php | 7 ++ .../Validator/ValidatorTypeGuesser.php | 11 ++- src/Symfony/Component/Form/FormFactory.php | 16 +++-- .../Component/Form/FormTypeGuesserChain.php | 10 +++ .../Form/FormTypeGuesserInterface.php | 14 +++- .../Component/Form/Tests/FormFactoryTest.php | 68 +++++++++++++++++++ 9 files changed, 150 insertions(+), 7 deletions(-) diff --git a/CHANGELOG-2.1.md b/CHANGELOG-2.1.md index faf070c12a..a0892cc739 100644 --- a/CHANGELOG-2.1.md +++ b/CHANGELOG-2.1.md @@ -280,6 +280,7 @@ To get the diff between two versions, go to https://github.com/symfony/symfony/c "input" * ValidatorTypeGuesser now guesses "collection" for array type constraint * added method `guessPattern` to FormTypeGuesserInterface to guess which pattern to use in the HTML5 attribute "pattern" + * deprecated method `guessMinLength` in favor of `guessPattern` ### HttpFoundation diff --git a/UPGRADE-2.1.md b/UPGRADE-2.1.md index 500a690dc1..29baddf4f6 100644 --- a/UPGRADE-2.1.md +++ b/UPGRADE-2.1.md @@ -372,6 +372,29 @@ * [BC BREAK] renamed "field_*" theme blocks to "form_*" and "field_widget" to "input" + + * The method `guessMinLength()` of FormTypeGuesserInterface was deprecated + and will be removed in Symfony 2.3. You should use the new method + `guessPattern()` instead which may return any regular expression that + is inserted in the HTML5 attribute "pattern". + + Before: + + public function guessMinLength($class, $property) + { + if (/* condition */) { + return new ValueGuess($minLength, Guess::LOW_CONFIDENCE); + } + } + + After: + + public function guessPattern($class, $property) + { + if (/* condition */) { + return new ValueGuess('.{' . $minLength . ',}', Guess::LOW_CONFIDENCE); + } + } ### Validator diff --git a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php index 5267bca511..552ac9ab13 100644 --- a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php +++ b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php @@ -112,6 +112,13 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface } } + /** + * {@inheritDoc} + */ + public function guessMinLength($class, $property) + { + } + /** * {@inheritDoc} */ diff --git a/src/Symfony/Bridge/Propel1/Form/PropelTypeGuesser.php b/src/Symfony/Bridge/Propel1/Form/PropelTypeGuesser.php index 7ee64cba57..4ee475ea2f 100644 --- a/src/Symfony/Bridge/Propel1/Form/PropelTypeGuesser.php +++ b/src/Symfony/Bridge/Propel1/Form/PropelTypeGuesser.php @@ -121,6 +121,13 @@ class PropelTypeGuesser implements FormTypeGuesserInterface } } + /** + * {@inheritDoc} + */ + public function guessMinLength($class, $property) + { + } + /** * {@inheritDoc} */ diff --git a/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php b/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php index 58c5e23e1e..27c59fa063 100755 --- a/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php +++ b/src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php @@ -65,6 +65,13 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface }); } + /** + * {@inheritDoc} + */ + public function guessMinLength($class, $property) + { + } + /** * {@inheritDoc} */ @@ -206,7 +213,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface /** * Guesses a field's pattern based on the given constraint - * + * * @param Constraint $constraint The constraint to guess for * * @return Guess The guess for the pattern @@ -228,7 +235,7 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface case 'Symfony\Component\Validator\Constraints\Size': return new ValueGuess(sprintf('.{%s,%s}', strlen((string) $constraint->min), strlen((string) $constraint->max)), Guess::LOW_CONFIDENCE); - + case 'Symfony\Component\Validator\Constraints\Type': if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) { return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE); diff --git a/src/Symfony/Component/Form/FormFactory.php b/src/Symfony/Component/Form/FormFactory.php index 448116716d..9529a7bea2 100644 --- a/src/Symfony/Component/Form/FormFactory.php +++ b/src/Symfony/Component/Form/FormFactory.php @@ -327,24 +327,32 @@ class FormFactory implements FormFactoryInterface $typeGuess = $this->guesser->guessType($class, $property); $maxLengthGuess = $this->guesser->guessMaxLength($class, $property); + // Keep $minLengthGuess for BC until Symfony 2.3 + $minLengthGuess = $this->guesser->guessMinLength($class, $property); $requiredGuess = $this->guesser->guessRequired($class, $property); $patternGuess = $this->guesser->guessPattern($class, $property); $type = $typeGuess ? $typeGuess->getType() : 'text'; $maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null; + $minLength = $minLengthGuess ? $minLengthGuess->getValue() : null; $pattern = $patternGuess ? $patternGuess->getValue() : null; + // overrides $minLength, if set + if (null !== $pattern) { + $options = array_merge(array('pattern' => $pattern), $options); + } + if (null !== $maxLength) { $options = array_merge(array('max_length' => $maxLength), $options); } - if ($requiredGuess) { - $options = array_merge(array('required' => $requiredGuess->getValue()), $options); + if (null !== $minLength && $minLength > 0) { + $options = array_merge(array('pattern' => '.{'.$minLength.','.$maxLength.'}'), $options); } - if (null !== $pattern) { - $options = array_merge(array('pattern' => $pattern), $options); + if ($requiredGuess) { + $options = array_merge(array('required' => $requiredGuess->getValue()), $options); } // user options may override guessed options diff --git a/src/Symfony/Component/Form/FormTypeGuesserChain.php b/src/Symfony/Component/Form/FormTypeGuesserChain.php index ec40ce1e12..1e9681db8a 100644 --- a/src/Symfony/Component/Form/FormTypeGuesserChain.php +++ b/src/Symfony/Component/Form/FormTypeGuesserChain.php @@ -70,6 +70,16 @@ class FormTypeGuesserChain implements FormTypeGuesserInterface }); } + /** + * {@inheritDoc} + */ + public function guessMinLength($class, $property) + { + return $this->guess(function ($guesser) use ($class, $property) { + return $guesser->guessMinLength($class, $property); + }); + } + /** * {@inheritDoc} */ diff --git a/src/Symfony/Component/Form/FormTypeGuesserInterface.php b/src/Symfony/Component/Form/FormTypeGuesserInterface.php index a029526a42..db6d16933c 100644 --- a/src/Symfony/Component/Form/FormTypeGuesserInterface.php +++ b/src/Symfony/Component/Form/FormTypeGuesserInterface.php @@ -43,9 +43,21 @@ interface FormTypeGuesserInterface */ function guessMaxLength($class, $property); + /** + * Returns a guess about the field's minimum length + * + * @param string $class The fully qualified class name + * @param string $property The name of the property to guess for + * + * @return Guess A guess for the field's minimum length + * + * @deprecated Deprecated since version 2.1, to be removed in 2.3. + */ + function guessMinLength($class, $property); + /** * Returns a guess about the field's pattern - * + * * - When you have a min value, you guess a min length of this min (LOW_CONFIDENCE) , lines below * - If this value is a float type, this is wrong so you guess null with MEDIUM_CONFIDENCE to override the previous guess. * Example: diff --git a/src/Symfony/Component/Form/Tests/FormFactoryTest.php b/src/Symfony/Component/Form/Tests/FormFactoryTest.php index 3336ad1faa..206fa5eccf 100644 --- a/src/Symfony/Component/Form/Tests/FormFactoryTest.php +++ b/src/Symfony/Component/Form/Tests/FormFactoryTest.php @@ -458,6 +458,74 @@ class FormFactoryTest extends \PHPUnit_Framework_TestCase $this->assertEquals('builderInstance', $builder); } + public function testCreateBuilderUsesMinLengthIfFound() + { + $this->guesser1->expects($this->once()) + ->method('guessMinLength') + ->with('Application\Author', 'firstName') + ->will($this->returnValue(new ValueGuess( + 2, + Guess::MEDIUM_CONFIDENCE + ))); + + $this->guesser2->expects($this->once()) + ->method('guessMinLength') + ->with('Application\Author', 'firstName') + ->will($this->returnValue(new ValueGuess( + 5, + Guess::HIGH_CONFIDENCE + ))); + + $factory = $this->createMockFactory(array('createNamedBuilder')); + + $factory->expects($this->once()) + ->method('createNamedBuilder') + ->with('text', 'firstName', null, array('pattern' => '.{5,}')) + ->will($this->returnValue('builderInstance')); + + $builder = $factory->createBuilderForProperty( + 'Application\Author', + 'firstName' + ); + + $this->assertEquals('builderInstance', $builder); + } + + public function testCreateBuilderPrefersPatternOverMinLength() + { + // min length is deprecated + $this->guesser1->expects($this->once()) + ->method('guessMinLength') + ->with('Application\Author', 'firstName') + ->will($this->returnValue(new ValueGuess( + 2, + Guess::HIGH_CONFIDENCE + ))); + + // pattern is preferred even though confidence is lower + $this->guesser2->expects($this->once()) + ->method('guessPattern') + ->with('Application\Author', 'firstName') + ->will($this->returnValue(new ValueGuess( + '.{5,10}', + Guess::LOW_CONFIDENCE + ))); + + $factory = $this->createMockFactory(array('createNamedBuilder')); + + $factory->expects($this->once()) + ->method('createNamedBuilder') + ->with('text', 'firstName', null, array('pattern' => '.{5,10}')) + ->will($this->returnValue('builderInstance')); + + $builder = $factory->createBuilderForProperty( + 'Application\Author', + 'firstName' + ); + + $this->assertEquals('builderInstance', $builder); + } + public function testCreateBuilderUsesRequiredSettingWithHighestConfidence() { $this->guesser1->expects($this->once())