Bug #101798
openPrevent saving unchanged inline records to save performance
0%
Description
Problem
When you have a record, which has 10 inline items and the record is translated (along with the inline items) into 10 languages, then saving the record even with no changes to the inline items causes the DataHandler to save 110 database records which can take some 30 seconds.
Why is that?
The inline records have toggles to hide/unhide them (unless the table does no support that), which means when saving the record there will be a `someid => ['hidden' => '0']` entry for each inline item, which causes DataHandler to save that inline item, which then also triggers saving of its translations.
Solution(?)
It could be solved in backend JavaScript, so that the inline `hidden` form fields are only included in the request when their value was changed.
Workaround
For our project I created a backend middleware, that intercepts the `data` when a record is saved and removes any entries, that have just the hidden field and it is unchanged. (Yes, I create a database request for each of those entries but it's still way faster than before)
Files
Updated by Andreas Kienast 12 months ago
- Status changed from New to Needs Feedback
Interesting, I got a similar finding with #100035, but my case didn't involve translations. Do you mind checking whether my bugfix was incomplete?
Updated by Sebastian Michaelsen 12 months ago
@Andreas Kienast Thank you very much for the pointer. It seems your fix is specific for a workspaces related field. I suppose also in your case DataHandler still explicitly saves the inline records (given they have a visbility toggle available).
I checked on demo.typo3.org, which currently runs v12.4.5 and the saving request also features the hidden
field:
Updated by Sebastian Michaelsen 12 months ago
- Status changed from Needs Feedback to New
Updated by Patrick Schriner 12 months ago
DataHandler::compareFieldArrayWithCurrentAndUnset should throw theses "empty" field away, but a lot of (expensive) stuff happens before
Updated by Sebastian Michaelsen 12 months ago
Yes, I took a deeper look. The problem seems to be that before unchanged fields get filtered out, the DataMapProcessor
already adds records that also need saving. So for my unchanged inline record, it still schedules all its translation records to be udpated.
https://github.com/TYPO3/typo3/blob/2aebe1eac32747b427725422a22d0c08d00ef5fd/typo3/sysext/core/Classes/DataHandling/DataHandler.php#L834 (from main branch currently 13.0.0-dev)