diff --git a/extension/qfq/qfq/helper/Support.php b/extension/qfq/qfq/helper/Support.php index a9c3cef2a84b159dd2cdaff067fd7c376448b772..9e24e4577a28eac8c50cd2170f4631cc3e096f45 100644 --- a/extension/qfq/qfq/helper/Support.php +++ b/extension/qfq/qfq/helper/Support.php @@ -792,7 +792,7 @@ class Support { * @param $typeSpec * @throws UserFormException */ - private function adjustFeToColumnDefinition(array &$formElement, $typeSpec) { + public static function adjustFeToColumnDefinition(array &$formElement, $typeSpec) { self::adjustMaxLength($formElement, $typeSpec); self::adjustDecimalFormat($formElement, $typeSpec); @@ -817,14 +817,15 @@ class Support { 'tinyint' => [-128, 127, SANITIZE_ALLOW_NUMERICAL, 0, 255, SANITIZE_ALLOW_DIGIT], 'smallint' => [-32768, 32767, SANITIZE_ALLOW_NUMERICAL, 0, 65535, SANITIZE_ALLOW_DIGIT], 'mediumint' => [-8388608, 8388607, SANITIZE_ALLOW_NUMERICAL, 0, 16777215, SANITIZE_ALLOW_DIGIT], - 'int' => [0, 4294967295, SANITIZE_ALLOW_NUMERICAL, -2147483648, 2147483647, SANITIZE_ALLOW_DIGIT], + 'int' => [-2147483648, 2147483647, SANITIZE_ALLOW_NUMERICAL, 0, 4294967295, SANITIZE_ALLOW_DIGIT], 'bigint' => [-9223372036854775808, 9223372036854775807, SANITIZE_ALLOW_NUMERICAL, 0, 18446744073709551615, SANITIZE_ALLOW_DIGIT], ]; $min = ''; $max = ''; - $checkType = false; + $checkType = SANITIZE_ALLOW_ALNUMX; $inputType = ''; + $isANumber = true; switch ($formElement[FE_TYPE]) { case FE_TYPE_PASSWORD: @@ -868,8 +869,16 @@ class Support { $inputType = 'number'; $checkType = SANITIZE_ALLOW_DIGIT; break; + + default: + $isANumber = false; + break; } + // Numbers don't need a maxLength because they are being handled by min/max and/or decimalFormat + if ($isANumber) + $formElement[FE_MAX_LENGTH] = ''; + if (!empty($formElement[FE_TYPEAHEAD_SQL]) || !empty($formElement[FE_TYPEAHEAD_LDAP])) { $inputType = ''; $checkType = SANITIZE_ALLOW_ALNUMX; @@ -878,16 +887,11 @@ class Support { // Set parameters if not set by user if ($formElement[FE_CHECK_TYPE] === SANITIZE_ALLOW_AUTO) { - if ($checkType === false) { - $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX; // fallback - } else { - $formElement[FE_CHECK_TYPE] = $checkType; - } + $formElement[FE_CHECK_TYPE] = $checkType; } - - self::setIfNotSet($formElement, FE_MIN, $min); - self::setIfNotSet($formElement, FE_MAX, $max); - self::setIfNotSet($formElement, FE_INPUT_TYPE, $inputType); + if (empty($formElement[FE_MIN])) $formElement[FE_MIN] = $min; + if (empty($formElement[FE_MAX])) $formElement[FE_MAX] = $max; + if (empty($formElement[FE_INPUT_TYPE])) $formElement[FE_INPUT_TYPE] = $inputType; } /** @@ -940,7 +944,7 @@ class Support { $feMaxLength = 10; break; case 'datetime': - $feMaxLength = empty($formElement[FE_SHOW_SECONDS]) ? 16 : 19; + $feMaxLength = 19; break; case 'time': $feMaxLength = 8; diff --git a/extension/qfq/tests/phpunit/SupportTest.php b/extension/qfq/tests/phpunit/SupportTest.php index 4aa5770ebcadfa432cbf2780bb43bba0328c4012..314f10002572e89e7125e4fd85c69e2860826a9c 100644 --- a/extension/qfq/tests/phpunit/SupportTest.php +++ b/extension/qfq/tests/phpunit/SupportTest.php @@ -731,6 +731,80 @@ class SupportTest extends \PHPUnit_Framework_TestCase { $this->assertEquals(1073741824000, Support::returnBytes('1000g')); } + public function testAdjustFeToColumnDefinition() { + // Test CheckType Auto + $formElementTemplate = [ + FE_NAME => 'feTest', + FE_MAX_LENGTH => '', + FE_ENCODE => FE_ENCODE_SPECIALCHAR, + FE_CHECK_TYPE => SANITIZE_ALLOW_AUTO, + FE_TYPE => FE_TYPE_TEXT, + FE_INPUT_TYPE => '', + FE_MIN => '', + FE_MAX => '', + ]; + + $formElement = $formElementTemplate; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'int(11) not null'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_NUMERICAL; + $expected[FE_INPUT_TYPE] = 'number'; + $expected[FE_MIN] = -2147483648; + $expected[FE_MAX] = 2147483647; + $this->assertEquals($expected, $formElement, "CheckType Auto should switch to numerical for signed int"); + + $formElement = $formElementTemplate; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'int(11) unsigned not null'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_DIGIT; + $expected[FE_INPUT_TYPE] = 'number'; + $expected[FE_MIN] = 0; + $expected[FE_MAX] = 4294967295; + $this->assertEquals($expected, $formElement, "CheckType Auto should switch to digit for unsigned int"); + + $formElement = $formElementTemplate; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'decimal(10,2) not null'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_NUMERICAL; + $this->assertEquals($expected, $formElement, "CheckType Auto should switch to numerical for decimal"); + + $formElement = $formElementTemplate; + $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX; + Support::adjustFeToColumnDefinition($formElement, 'int(11) not null'); + $this->assertEquals(SANITIZE_ALLOW_ALNUMX, $formElement[FE_CHECK_TYPE], "CheckType should not switch if set to non-auto"); + + $formElement = $formElementTemplate; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'varchar(255)'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALL; + $expected[FE_MAX_LENGTH] = 255; + $this->assertEquals($expected, $formElement, "Checktype Auto should switch to all for text with encode=specialchars"); + + $formElement = $formElementTemplate; + $formElement[FE_ENCODE] = FE_ENCODE_NONE; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'varchar(64)'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX; + $expected[FE_MAX_LENGTH] = 64; + $this->assertEquals($expected, $formElement, "Checktype Auto should switch to alnumx for text with encode=none"); + + $formElement = $formElementTemplate; + $formElement[FE_TYPEAHEAD_SQL] = "SELECT chocolate WHERE tastes IS good"; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'int(11) not null'); + $expected[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX; + $expected[FE_MIN] = -2147483648; + $expected[FE_MAX] = 2147483647; + $this->assertEquals($expected, $formElement, "Checktype Auto should switch to alnumx if typeAhead is defined"); + + $formElement = $formElementTemplate; + $formElement[FE_CHECK_TYPE] = SANITIZE_ALLOW_ALNUMX; + $expected = $formElement; + Support::adjustFeToColumnDefinition($formElement, 'datetime'); + $expected[FE_MAX_LENGTH] = strlen('0000/00/00 00:00:00'); + $this->assertEquals($expected, $formElement, "maxLength for datetime should be correct"); + } + protected function setUp() { parent::setUp();