Skip to content
Permalink
Browse files

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
  • Loading branch information...
markstory committed Oct 2, 2015
1 parent 3fa5c4f commit 506051f688431f6234edfb818c191f1d7a9df384
Showing with 14 additions and 2 deletions.
  1. +12 −0 lib/Cake/Test/Case/View/Helper/FormHelperTest.php
  2. +2 −2 lib/Cake/View/Helper/FormHelper.php
@@ -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 @@ public function testInput() {
);
$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'),
@@ -1209,10 +1209,10 @@ protected function _magicOptions($options) {
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';
}
}

1 comment on commit 506051f

@pyrite357

This comment has been minimized.

Copy link

pyrite357 commented on 506051f Oct 2, 2015

Thanks mark, I'll try to get this tested tomorrow.

Please sign in to comment.
You can’t perform that action at this time.