Skip to content

Commit

Permalink
[Form] Restored and deprecated method guessMinLength in FormTypeGue…
Browse files Browse the repository at this point in the history
…sser
  • Loading branch information
webmozart committed Apr 23, 2012
1 parent b7189fd commit d9e142b
Show file tree
Hide file tree
Showing 9 changed files with 150 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-2.1.md
Expand Up @@ -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

Expand Down
23 changes: 23 additions & 0 deletions UPGRADE-2.1.md
Expand Up @@ -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

Expand Down
7 changes: 7 additions & 0 deletions src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php
Expand Up @@ -112,6 +112,13 @@ public function guessMaxLength($class, $property)
}
}

/**
* {@inheritDoc}
*/
public function guessMinLength($class, $property)
{
}

/**
* {@inheritDoc}
*/
Expand Down
7 changes: 7 additions & 0 deletions src/Symfony/Bridge/Propel1/Form/PropelTypeGuesser.php
Expand Up @@ -121,6 +121,13 @@ public function guessMaxLength($class, $property)
}
}

/**
* {@inheritDoc}
*/
public function guessMinLength($class, $property)
{
}

/**
* {@inheritDoc}
*/
Expand Down
Expand Up @@ -65,6 +65,13 @@ public function guessMaxLength($class, $property)
});
}

/**
* {@inheritDoc}
*/
public function guessMinLength($class, $property)
{
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -206,7 +213,7 @@ public function guessMaxLengthForConstraint(Constraint $constraint)

/**
* 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
Expand All @@ -228,7 +235,7 @@ public function guessPatternForConstraint(Constraint $constraint)

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);
Expand Down
16 changes: 12 additions & 4 deletions src/Symfony/Component/Form/FormFactory.php
Expand Up @@ -327,24 +327,32 @@ public function createBuilderForProperty($class, $property, $data = null, array

$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
Expand Down
10 changes: 10 additions & 0 deletions src/Symfony/Component/Form/FormTypeGuesserChain.php
Expand Up @@ -70,6 +70,16 @@ public function guessMaxLength($class, $property)
});
}

/**
* {@inheritDoc}
*/
public function guessMinLength($class, $property)
{
return $this->guess(function ($guesser) use ($class, $property) {
return $guesser->guessMinLength($class, $property);
});
}

/**
* {@inheritDoc}
*/
Expand Down
14 changes: 13 additions & 1 deletion src/Symfony/Component/Form/FormTypeGuesserInterface.php
Expand Up @@ -43,9 +43,21 @@ function guessRequired($class, $property);
*/
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:
Expand Down
68 changes: 68 additions & 0 deletions src/Symfony/Component/Form/Tests/FormFactoryTest.php
Expand Up @@ -458,6 +458,74 @@ public function testCreateBuilderUsesMaxLengthIfFound()
$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())
Expand Down

0 comments on commit d9e142b

Please sign in to comment.