Breaking: #92497 - Workspaces: Move Placeholders removed

See forge#92497


Workspaces had a so-called Move Placeholder since TYPO3 4.2, which indicated that a versioned record (the move pointer) was moved to a new location - either to a new page or to a different sorting position.

When querying records in a workspace, the Move Placeholder was included in the initial database query, and then reverted to the actual live record (to get the original PID), and then overloaded with the versioned record (Move Pointer) containing other modified fields.

The main two fields of this Move Placeholder record were the PID and the sorting, referring to the newly moved location. All other fields were insignificant. An additional field "t3ver_move_id" contained the actual live record ID.

Move Placeholders were identified by having the following field values:

  • t3ver_state = 3 - indicating the type Move Placeholder
  • t3ver_wsid = the workspace ID where a record was moved
  • t3ver_oid = 0, in order to fetch them from the database together with live records
  • pid = new Page location
  • sorting (optional) = the new sorting location
  • t3ver_move_id = the live version which was moved in the workspace

The Move Pointer is indicated like this:

  • t3ver_state = 4 - indicating the type Move Pointer
  • t3ver_wsid = the workspace ID where a record was moved
  • t3ver_oid = the live version which was moved in the workspace
  • pid = new Page location
  • sorting (optional) = the new sorting location

Due to a significant change in TYPO3 v10, the Move Pointer (versioned record) now also has the new PID, which was previously set to "-1", indicating a versioned record. However, since all information is now also available in the Move Pointer, the move placeholder database record is not needed anymore.

Move Placeholders are now neither evaluated, nor created by TYPO3 Core anymore, and remaining move placeholders are removed with an Upgrade Wizard.

The TCA setting $TCA[$table][ctrl][shadowColumnsForMovePlaceholders] is not evaluated anymore and removed at TCA building-time.

The main benefits of this change:

  • fewer database queries when fetching records within a workspace
  • more consistent handling with versioned records
  • less complexity within TYPO3's internal API
  • fewer database records when working with TYPO3's Workspaces feature


When querying database records in a workspace, all Move Pointer records are now fetched directly instead of the Move Placeholder records. This is all done with the existing API methods in PageRepository, BackendUtility and the Doctrine DBAL Workspace Restriction.

When moving a record in a workspace, Move Placeholders are not created anymore, making them obsolete, as all information is now stored in the Move Pointer.

The constant VersionState::MOVE_PLACEHOLDER is obsolete.

Lots of internal functionality regarding move placeholders has been removed.

The ctrl section $TCA[$table][ctrl][shadowColumnsForMovePlaceholders] is automatically removed from any table with a deprecation notice.

The database field t3ver_move_id is obsolete and not created automatically for workspace enabled tables anymore.

Affected Installations

Any TYPO3 installation using Workspaces which also hooks into the workspaces-internal process via third-party extensions.

Any TYPO3 extension not using the Doctrine DBAL restrictions for handling Workspaces.


Run the upgrade wizard to remove any obsolete Move Placeholder records.

Use the TYPO3 API to read and write data from the database, including the WorkspaceRestriction and the Versioning Overlay methods.

Remove the setting $TCA[$table][ctrl][shadowColumnsForMovePlaceholders] which is not evaluated anymore to avoid deprecation notices.

The database analyzer suggests the removal of database field t3ver_move_id for various tables. The field can be safely dropped after the upgrade wizard has been executed.