Skip to content

Commit

Permalink
[Form] Fix min/max length guessing for numeric types (fix #3091)
Browse files Browse the repository at this point in the history
  • Loading branch information
vicb committed Mar 19, 2012
1 parent edac48a commit fc7c7f6
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 178 deletions.
16 changes: 14 additions & 2 deletions src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php
Expand Up @@ -60,6 +60,8 @@ public function guessType($class, $property)
return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE);
case 'date':
return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE);
case 'time':
return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
case 'decimal':
case 'float':
return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);
Expand All @@ -71,8 +73,6 @@ public function guessType($class, $property)
return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);
case 'text':
return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE);
case 'time':
return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
default:
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
}
Expand Down Expand Up @@ -105,6 +105,10 @@ public function guessMaxLength($class, $property)
if (isset($mapping['length'])) {
return new ValueGuess($mapping['length'], Guess::HIGH_CONFIDENCE);
}

if (in_array($ret[0]->getTypeOfField($property), array('decimal', 'float'))) {
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
}
}
}

Expand All @@ -113,6 +117,14 @@ public function guessMaxLength($class, $property)
*/
public function guessMinLength($class, $property)
{
$ret = $this->getMetadata($class);
if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
$mapping = $ret[0]->getFieldMapping($property);

if (in_array($ret[0]->getTypeOfField($property), array('decimal', 'float'))) {
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
}
}
}

protected function getMetadata($class)
Expand Down
237 changes: 69 additions & 168 deletions src/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php
Expand Up @@ -89,150 +89,68 @@ public function guessTypeForConstraint(Constraint $constraint)
switch ($constraint->type) {
case 'boolean':
case 'bool':
return new TypeGuess(
'checkbox',
array(),
Guess::MEDIUM_CONFIDENCE
);
return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE);

case 'double':
case 'float':
case 'numeric':
case 'real':
return new TypeGuess(
'number',
array(),
Guess::MEDIUM_CONFIDENCE
);
return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);

case 'integer':
case 'int':
case 'long':
return new TypeGuess(
'integer',
array(),
Guess::MEDIUM_CONFIDENCE
);
case 'string':
return new TypeGuess(
'text',
array(),
Guess::LOW_CONFIDENCE
);
return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);

case '\DateTime':
return new TypeGuess(
'date',
array(),
Guess::MEDIUM_CONFIDENCE
);
return new TypeGuess('date', array(), Guess::MEDIUM_CONFIDENCE);

case 'string':
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
}
break;

case 'Symfony\Component\Validator\Constraints\Country':
return new TypeGuess(
'country',
array(),
Guess::HIGH_CONFIDENCE
);
return new TypeGuess('country', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Date':
return new TypeGuess(
'date',
array('type' => 'string'),
Guess::HIGH_CONFIDENCE
);
return new TypeGuess('date', array('type' => 'string'), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\DateTime':
return new TypeGuess(
'datetime',
array('type' => 'string'),
Guess::HIGH_CONFIDENCE
);
return new TypeGuess('datetime', array('type' => 'string'), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Email':
return new TypeGuess(
'email',
array(),
Guess::HIGH_CONFIDENCE
);
return new TypeGuess('email', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\File':
return new TypeGuess(
'file',
array(),
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Image':
return new TypeGuess(
'file',
array(),
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Ip':
return new TypeGuess(
'text',
array(),
Guess::MEDIUM_CONFIDENCE
);
return new TypeGuess('file', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Language':
return new TypeGuess(
'language',
array(),
Guess::HIGH_CONFIDENCE
);
return new TypeGuess('language', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Locale':
return new TypeGuess(
'locale',
array(),
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Max':
return new TypeGuess(
'number',
array(),
Guess::LOW_CONFIDENCE
);
return new TypeGuess('locale', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Time':
return new TypeGuess('time', array('type' => 'string'), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Url':
return new TypeGuess('url', array(), Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Ip':
return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\MaxLength':
return new TypeGuess(
'text',
array(),
Guess::LOW_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Min':
return new TypeGuess(
'number',
array(),
Guess::LOW_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\MinLength':
return new TypeGuess(
'text',
array(),
Guess::LOW_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Regex':
return new TypeGuess(
'text',
array(),
Guess::LOW_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Time':
return new TypeGuess(
'time',
array('type' => 'string'),
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Url':
return new TypeGuess(
'url',
array(),
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Size':
return new TypeGuess(
'number',
array(),
Guess::LOW_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\SizeLength':
return new TypeGuess(
'text',
array(),
Guess::LOW_CONFIDENCE
);
return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Min':
case 'Symfony\Component\Validator\Constraints\Size':
case 'Symfony\Component\Validator\Constraints\Max':
return new TypeGuess('number', array(), Guess::LOW_CONFIDENCE);
}
}

Expand All @@ -247,20 +165,11 @@ public function guessRequiredForConstraint(Constraint $constraint)
{
switch (get_class($constraint)) {
case 'Symfony\Component\Validator\Constraints\NotNull':
return new ValueGuess(
true,
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\NotBlank':
return new ValueGuess(
true,
Guess::HIGH_CONFIDENCE
);
return new ValueGuess(true, Guess::HIGH_CONFIDENCE);

default:
return new ValueGuess(
false,
Guess::LOW_CONFIDENCE
);
return new ValueGuess(false, Guess::LOW_CONFIDENCE);
}
}

Expand All @@ -275,25 +184,21 @@ public function guessMaxLengthForConstraint(Constraint $constraint)
{
switch (get_class($constraint)) {
case 'Symfony\Component\Validator\Constraints\MaxLength':
return new ValueGuess(
$constraint->limit,
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Max':
return new ValueGuess(
strlen((string) $constraint->limit),
Guess::HIGH_CONFIDENCE
);
return new ValueGuess($constraint->limit, Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\SizeLength':
return new ValueGuess(
$constraint->max,
Guess::HIGH_CONFIDENCE
);
return new ValueGuess($constraint->max, Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Type':
if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) {
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
}

case 'Symfony\Component\Validator\Constraints\Max':
return new ValueGuess(strlen((string) $constraint->limit), Guess::LOW_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Size':
return new ValueGuess(
strlen((string) $constraint->max),
Guess::HIGH_CONFIDENCE
);
return new ValueGuess(strlen((string) $constraint->max), Guess::LOW_CONFIDENCE);
}
}

Expand All @@ -308,25 +213,21 @@ public function guessMinLengthForConstraint(Constraint $constraint)
{
switch (get_class($constraint)) {
case 'Symfony\Component\Validator\Constraints\MinLength':
return new ValueGuess(
$constraint->limit,
Guess::HIGH_CONFIDENCE
);
case 'Symfony\Component\Validator\Constraints\Min':
return new ValueGuess(
strlen((string) $constraint->limit),
Guess::HIGH_CONFIDENCE
);
return new ValueGuess($constraint->limit, Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\SizeLength':
return new ValueGuess(
$constraint->min,
Guess::HIGH_CONFIDENCE
);
return new ValueGuess($constraint->min, Guess::HIGH_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Type':
if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) {
return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
}

case 'Symfony\Component\Validator\Constraints\Min':
return new ValueGuess(strlen((string) $constraint->limit), Guess::LOW_CONFIDENCE);

case 'Symfony\Component\Validator\Constraints\Size':
return new ValueGuess(
strlen((string) $constraint->min),
Guess::HIGH_CONFIDENCE
);
return new ValueGuess(strlen((string) $constraint->min), Guess::LOW_CONFIDENCE);
}
}

Expand Down
16 changes: 8 additions & 8 deletions src/Symfony/Component/Form/FormFactory.php
Expand Up @@ -349,16 +349,16 @@ public function createBuilderForProperty($class, $property, $data = null, array

$type = $typeGuess ? $typeGuess->getType() : 'text';

if ($maxLengthGuess) {
$options = array_merge(array('max_length' => $maxLengthGuess->getValue()), $options);
$maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null;
$minLength = $minLengthGuess ? $minLengthGuess->getValue() : null;
$minLength = $minLength ?: 0;

if (null !== $maxLength) {
$options = array_merge(array('max_length' => $maxLength), $options);
}

if ($minLengthGuess) {
if ($maxLengthGuess) {
$options = array_merge(array('pattern' => '.{'.$minLengthGuess->getValue().','.$maxLengthGuess->getValue().'}'), $options);
} else {
$options = array_merge(array('pattern' => '.{'.$minLengthGuess->getValue().',}'), $options);
}
if ($minLength > 0) {
$options = array_merge(array('pattern' => '.{'.$minLength.','.$maxLength.'}'), $options);
}

if ($requiredGuess) {
Expand Down

0 comments on commit fc7c7f6

Please sign in to comment.