---
title: "Deprecation: #109029 - FormEngine doSave hidden field"
manual: "TYPO3 Core Changelog"
version: "main"
permalink: "https://docs.typo3.org/permalink/changelog:deprecation-109029-1771804800"
source: "Changelog/14.2/Deprecation-109029-FormEngineDoSaveHiddenField.rst"
typo3-version: "14.2"
typo3-major: 14
type: "deprecation"
issue: 109029
forge: "https://forge.typo3.org/issues/109029"
tags: ["Backend", "JavaScript", "NotScanned", "ext:backend"]
rendered: "2026-09-20T18:31:11+00:00"
---

# Deprecation: #109029 - FormEngine `doSave` hidden field {#deprecation-109029-1771804800}

See [forge#109029](https://forge.typo3.org/issues/109029)

## Description {#description}

The `<input type="hidden" name="doSave">` field in FormEngine was a
legacy mechanism where JavaScript set the field value to `1` to
signal to PHP that the submitted form data should be processed as a save
operation.

This indirection is no longer needed. TYPO3 now uses native submit button
values such as `_savedok` directly, which are sufficient to determine
whether a save operation should be performed. The field is **no longer
evaluated internally**.

For backward compatibility, the `doSave` field is still appended to the
form on programmatic saves in TYPO3 v14, but this behavior is deprecated and
will be removed in TYPO3 v15.

## Impact {#impact}

Third-party code reading `$request->getParsedBody()['doSave']` to detect
whether a save operation was triggered will stop working in TYPO3 v15.

## Affected installations {#affected-installations}

Installations with custom backend modules or extensions that inspect the
`doSave` POST field to determine whether incoming form data should be
persisted.

## Migration {#migration}

Replace any checking of the `doSave` POST field with a check of
all native submit action fields that FormEngine sends as part of normal
form submission.

Before:

```php
$parsedBody = $request->getParsedBody();
$doSave = (bool)($parsedBody['doSave'] ?? false);
if ($doSave) {
    // process data
}
```

After:

```php
$parsedBody = $request->getParsedBody();
$isSaveAction = !empty($parsedBody['_savedok'])
    || !empty($parsedBody['_saveandclosedok'])
    || !empty($parsedBody['_savedokview'])
    || !empty($parsedBody['_savedoknew']);
if ($isSaveAction) {
    // process data
}
```
