Correct input generation for postgres numeric types.

Numeric types in postgres are treated like decimals, except they can
have no length, precision or scale components defined.

IE does not accept 1.00000 as a valid step attribute so we'll default to
any when we encounter decimal types with no length.

Refs #7497
This commit is contained in:
mark_story 2015-10-01 21:46:21 -04:00
parent 3fa5c4ff94
commit 506051f688
2 changed files with 14 additions and 2 deletions

View file

@ -353,6 +353,7 @@ class ValidateUser extends CakeTestModel {
'email' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
'balance' => array('type' => 'float', 'null' => false, 'length' => '5,2'),
'cost_decimal' => array('type' => 'decimal', 'null' => false, 'length' => '6,3'),
'null_decimal' => array('type' => 'decimal', 'null' => false, 'length' => null),
'ratio' => array('type' => 'decimal', 'null' => false, 'length' => '10,6'),
'population' => array('type' => 'decimal', 'null' => false, 'length' => '15,0'),
'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''),
@ -2045,6 +2046,17 @@ class FormHelperTest extends CakeTestCase {
);
$this->assertTags($result, $expected);
$result = $this->Form->input('ValidateUser.null_decimal');
$expected = array(
'div' => array('class'),
'label' => array('for'),
'Null Decimal',
'/label',
'input' => array('name', 'type' => 'number', 'step' => 'any', 'id'),
'/div',
);
$this->assertTags($result, $expected);
$result = $this->Form->input('ValidateUser.ratio');
$expected = array(
'div' => array('class'),

View file

@ -1209,10 +1209,10 @@ class FormHelper extends AppHelper {
if ($options['type'] === 'number' &&
!isset($options['step'])
) {
if ($type === 'decimal') {
if ($type === 'decimal' && isset($fieldDef['length'])) {
$decimalPlaces = substr($fieldDef['length'], strpos($fieldDef['length'], ',') + 1);
$options['step'] = sprintf('%.' . $decimalPlaces . 'F', pow(10, -1 * $decimalPlaces));
} elseif ($type === 'float') {
} elseif ($type === 'float' || $type === 'decimal') {
$options['step'] = 'any';
}
}