Bug #83240

TCA field with type=input, eval=date with range is broken, always lower range value is applied because of int cast of incoming value before ISO-8601->unix timestamp conversion.

Added by Leonie Philine Bitto over 1 year ago. Updated 11 months ago.

Status:
Closed
Priority:
Must have
Assignee:
-
Category:
DataHandler aka TCEmain
Target version:
Start date:
2017-12-06
Due date:
% Done:

100%

TYPO3 Version:
8
PHP Version:
7.1
Tags:
Complexity:
Is Regression:
Yes
Sprint Focus:

Description

Here an example TCA column from tt_products:

        'endtime' => [
            'exclude' => 1,
            'label' => 'LLL:EXT:lang/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
            'config' => [
                'type' => 'input',
                'size' => '8',
                'max' => '20',
                'eval' => 'date',
                'checkbox' => '0',
                'default' => '0',
                'range' => [
                    'upper' => mktime(0, 0, 0, 12, 31, 2020),
                    'lower' => mktime(0, 0, 0, date('m') - 1, date('d'), date('Y'))
                ]
            ]
        ],

This is correct according to the documentation: https://docs.typo3.org/typo3cms/TCAReference/ColumnsConfig/Type/Input.html#range

However, the core handles ranges (as integer) before it converts the date. Therefore, ranges are now broken for eval=date input columns.

This is caused by: https://docs.typo3.org/typo3cms/extensions/core/Changelog/8.5/Important-77702-CustomRenderTypesForDateAndDatetimeFieldsMustUseISO-8601.html?highlight=date
which also caused the distantly related bug https://forge.typo3.org/issues/82981

What happens is the following:

\TYPO3\CMS\Core\DataHandling\DataHandler::checkValueForInput() checks for the TCA range and compares the $value and $tcaFieldConf['range']['lower'] / ['upper'] both cast to "(int)".
As the incoming date is in ISO-8601, it will look like "2018-01-01T00:00:00+00:00". Casting it to integer to compare with the upper/lower range, the value becomes simply "2018". At this point, the lower end of the range ($tcaFieldConf['range']['lower']) is applied to $value.

Only afterwards, \TYPO3\CMS\Core\DataHandling\DataHandler::checkValue_input_Eval() is called, which then attempts to convert the ISO-8601 string to a unix timestamp - but at this point we already lost our original incoming ISO-8601 string, since the lower range value was already applied.


Related issues

Related to TYPO3 Core - Task #77702: Use moment.js and ISO-8601 dates in the backend Closed 2016-08-30
Related to TYPO3 Core - Bug #82981: FormEngineValidation: range-checks not working for datetime-fields Closed 2017-11-13

Associated revisions

Revision 834f9368 (diff)
Added by Jigal van Hemert over 1 year ago

[BUGFIX] Allow range options to work for date/time fields

Date and time fields can contain ISO-8601 values. To apply lower and
upper limits the value must first be converted to a UNIX timestamp.

Resolves: #83240
Releases: master, 8.7
Change-Id: Ic15e9486cf7a4bcdf557c8a197d957ad88302b61
Reviewed-on: https://review.typo3.org/56020
Tested-by: TYPO3com <>
Reviewed-by: Susanne Moog <>
Tested-by: Susanne Moog <>
Reviewed-by: Jigal van Hemert <>
Tested-by: Jigal van Hemert <>
Reviewed-by: Wouter Wolters <>
Reviewed-by: Mathias Schreiber <>
Tested-by: Mathias Schreiber <>
Reviewed-by: Oliver Hader <>
Tested-by: Oliver Hader <>

Revision 0b9ef9e9 (diff)
Added by Jigal van Hemert over 1 year ago

[BUGFIX] Allow range options to work for date/time fields

Date and time fields can contain ISO-8601 values. To apply lower and
upper limits the value must first be converted to a UNIX timestamp.

Resolves: #83240
Releases: master, 8.7
Change-Id: Ic15e9486cf7a4bcdf557c8a197d957ad88302b61
Reviewed-on: https://review.typo3.org/56060
Reviewed-by: Oliver Hader <>
Tested-by: Oliver Hader <>
Tested-by: TYPO3com <>
Reviewed-by: Susanne Moog <>
Tested-by: Susanne Moog <>

History

#1 Updated by Oliver Hader over 1 year ago

  • Subject changed from Regression: TCA field with type=input, eval=date with range is broken, always lower range value is applied because of int cast of incoming value before ISO-8601->unix timestamp conversion. to TCA field with type=input, eval=date with range is broken, always lower range value is applied because of int cast of incoming value before ISO-8601->unix timestamp conversion.
  • Is Regression set to Yes

#2 Updated by Oliver Hader over 1 year ago

  • Related to Task #77702: Use moment.js and ISO-8601 dates in the backend added

#3 Updated by Oliver Hader over 1 year ago

  • Status changed from New to Accepted

#4 Updated by Oliver Hader over 1 year ago

  • Target version changed from next-patchlevel to 8.7.11

#5 Updated by Gerrit Code Review over 1 year ago

  • Status changed from Accepted to Under Review

Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#6 Updated by Gerrit Code Review over 1 year ago

Patch set 2 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#7 Updated by Gerrit Code Review over 1 year ago

Patch set 3 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#8 Updated by Gerrit Code Review over 1 year ago

Patch set 4 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#9 Updated by Gerrit Code Review over 1 year ago

Patch set 5 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#10 Updated by Gerrit Code Review over 1 year ago

Patch set 6 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56020

#11 Updated by Gerrit Code Review over 1 year ago

Patch set 1 for branch TYPO3_8-7 of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/56060

#12 Updated by Jigal van Hemert over 1 year ago

  • Status changed from Under Review to Resolved
  • % Done changed from 0 to 100

#13 Updated by Oliver Hader over 1 year ago

  • Related to Bug #82981: FormEngineValidation: range-checks not working for datetime-fields added

#14 Updated by Benni Mack 11 months ago

  • Status changed from Resolved to Closed

Also available in: Atom PDF