---
title: "Breaking: #92434 - Use Record API in Page Module Preview Rendering"
manual: "TYPO3 Core Changelog"
version: "main"
permalink: "https://docs.typo3.org/permalink/changelog:breaking-92434-1761644184"
source: "Changelog/14.0/Breaking-92434-UseRecordAPIInPageModulePreviewRendering.rst"
typo3-version: "14.0"
typo3-major: 14
type: "breaking"
issue: 92434
forge: "https://forge.typo3.org/issues/92434"
tags: ["Backend", "PHP-API", "Fluid", "NotScanned", "ext:backend"]
rendered: "2026-10-01T08:40:31+00:00"
---

# Breaking: #92434 - Use Record API in Page Module Preview Rendering {#breaking-92434-1761644184}

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

## Description {#description}

The Page Module preview rendering has been refactored to use the Record API
internally instead of accessing raw database arrays. This affects both custom
preview renderers that extend `\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer` and
Fluid-based preview templates.

The method signature has changed for
`\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer`:

-   `StandardContentPreviewRenderer->linkEditContent()` now expects a
    `\TYPO3\CMS\Core\Domain\RecordInterface` object as the second `$record` parameter
    instead of an array

The `\TYPO3\CMS\Backend\View\Event\PageContentPreviewRenderingEvent` has
also been updated:

-   `PageContentPreviewRenderingEvent->getRecord()` now returns a
    `\TYPO3\CMS\Core\Domain\RecordInterface` object instead of an array
-   `PageContentPreviewRenderingEvent->setRecord()` now expects a
    `\TYPO3\CMS\Core\Domain\RecordInterface` object instead of an array

Additionally, the `@internal` class
`\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem` has been
updated to work with Record objects:

-   The constructor of `\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem`
    now requires a `\TYPO3\CMS\Core\Domain\RecordInterface` object as
    the third `$record` parameter instead of an array
-   `GridColumnItem->getRecord()` now returns a `\TYPO3\CMS\Core\Domain\RecordInterface` object
    instead of an array
-   `GridColumnItem->setRecord()` now expects a `\TYPO3\CMS\Core\Domain\RecordInterface` object
    instead of an array
-   A new method `GridColumnItem->getRow()` has been added to access the raw
    database array if needed

For Fluid-based content element previews, the template variables have changed.
Previously, all record fields were passed as individual variables to the Fluid
template. Now, only a single `{record}` variable is passed, which is a
`\TYPO3\CMS\Core\Domain\RecordInterface` object providing access to all record data through
the Record API.

Using the `{pi_flexform_transformed}` variable in Fluid-based content
element previews no longer works. The resolved flex form can be directly
accessed on the `\TYPO3\CMS\Core\Domain\RecordInterface` object, for example via
`{record.pi_flexform}`. The value is a `FlexFormFieldValues`
object, which properly groups the fields by their sheets.

## Impact {#impact}

Extensions that extend `\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer` and override the
`linkEditContent()` method will need to update their method signature.

Extensions that access `GridColumnItem->getRecord()` expecting an array will
need to update their code to work with `\TYPO3\CMS\Core\Domain\RecordInterface` objects.

Extensions using event listeners for `PageContentPreviewRenderingEvent` that
access the record via `getRecord()` expecting an array will need to update
their code to work with `\TYPO3\CMS\Core\Domain\RecordInterface` objects.

Custom Fluid templates for content element preview rendering must be updated to
use the `{record}` variable instead of accessing individual field variables.

## Affected installations {#affected-installations}

All installations with extensions that:

-   Extend `\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer` and call or override the
    `linkEditContent()` method
-   Instantiate `\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem` or call `GridColumnItem->getRecord()` /
    `GridColumnItem->setRecord()`
-   Register event listeners for `PageContentPreviewRenderingEvent`
-   Use custom Fluid templates for content element preview rendering via PageTSconfig
    `mod.web_layout.tt_content.preview.[recordType]`

## Migration {#migration}

For custom preview renderers extending `\TYPO3\CMS\Backend\Preview\StandardContentPreviewRenderer`:

Update the method signature of `linkEditContent()` to accept a
`\TYPO3\CMS\Core\Domain\RecordInterface` object:

**Before (TYPO3 v13 and lower)**

```php
protected function linkEditContent(string $linkText, array $row, string $table = 'tt_content'): string
{
    $uid = (int)$row['uid'];
    $pid = (int)$row['pid'];
    // ...
}
```

**After (TYPO3 v14+)**

```php
use TYPO3\CMS\Core\Domain\RecordInterface;

protected function linkEditContent(string $linkText, RecordInterface $record): string
{
    $uid = $record->getUid();
    $pid = $record->getPid();
    $table = $record->getMainType();
    // ...
}
```

For code working with `\TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem`:

**Before (TYPO3 v13 and lower)**

```php
$row = $columnItem->getRecord();
$uid = (int)$row['uid'];
$title = $row['header'];
```

**After (TYPO3 v14+)**

```php
use TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem;
use TYPO3\CMS\Core\Domain\RecordInterface;

$record = $columnItem->getRecord();
$uid = $record->getUid();
$title = $record->has('header') ? $record->get('header') : '';

// Or if raw array access is needed:
$row = $columnItem->getRow();
$uid = (int)$row['uid'];
```

For custom Fluid templates used for content element preview rendering:

**Before (TYPO3 v13 and lower)**

```html
<h2>{header}</h2>
<p>{bodytext}</p>
<f:if condition="{image}">
    <p>Image UID: {image}</p>
</f:if>
```

**After (TYPO3 v14+)**

```html
<h2>{record.header}</h2>
<p>{record.bodytext}</p>
<f:if condition="{record.image}">
    <p>Image UID: {record.image.uid}</p>
</f:if>
```

For flex form value rendering, there are two options:

**Before (TYPO3 v13 and lower)**

```html
<h2>{header}</h2>
<p>{bodytext}</p>
<small>{pi_flexform_transformed.settings.welcome_header}</small>
<f:if condition="{image}">
    <p>Image UID: {image}</p>
</f:if>
```

**After (TYPO3 v14+)**

```html
<f:variable name="path" value="s_messages/settings" />
<small>{record.pi_flexform.{path}.welcome_header}</small>

<!-- or -->

<small>{record.pi_flexform.sheets.s_messages.settings.welcome_header}</small>
```
