---
title: "Content Blocks for v12"
manual: "Content Blocks"
version: "main"
permalink: "https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:migrations-content-blocks-12@main"
source: "Migrations/ContentBlocks12/Index.rst"
rendered: "2026-09-22T14:15:39+00:00"
---

# Content Blocks for v12 {#migrations-content-blocks-12}

With the release of Content Blocks [1.0.0](https://github.com/FriendsOfTYPO3/content-blocks/releases/tag/1.0.0)
some things changed under the hood, which require migration in your Fluid
templates. Also, the folder structure changed as well as usage of ViewHelpers.

## New composer name {#new-composer-name}

The composer name has changed.

`contentblocks/content-blocks` ➡️ `friendsoftypo3/content-blocks`

Please migrate, as the old package is abandoned.

## New folder structure {#new-folder-structure}

There is a migration wizard to rename your Content Blocks folders and files to
the [new structure](https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:cb-definition@main).

```shell
typo3 upgrade:run contentBlocksFolderStructureMigration
```

Ensure the extension with the old Content Block structure is loaded in the
system before running this wizard.

> [!WARNING]
> On case-insensitive file systems like Windows or MacOS have, the renaming
> of folder `Assets` to `assets` won't be registered in git. This needs to
> be commited on a case-sensitive file system e.g. inside your ddev container.

## New AssetPathViewHelper {#new-assetpathviewhelper}

We replaced the custom AssetViewHelpers with a new
[AssetPathViewHelper](https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:asset-view-helpers@main). Now you can use the Core
AssetViewHelpers and only use the custom ViewHelpers to build the path to your
asset.

```html
<!-- Before -->
<cb:asset.css identifier="cbAccordionCssBackend" file="EditorPreview.css"/>

<!-- After -->
<f:asset.css identifier="cbAccordionCssBackend" href="{cb:assetPath()}/EditorPreview.css"/>
```

## New LanguagePathViewHelper {#new-languagepathviewhelper}

We replaced the custom TranslateViewHelper with a new
[LanguagePathViewHelper](https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:language-path-view-helper@main) that is used to build
the translation key.

```html
<!-- Before -->
<cb:translate key="readmore"/>

<!-- After -->
<f:translate key="{cb:languagePath()}:readmore"/>
```

## Record object {#record-object}

Content Blocks now uses the `\TYPO3\CMS\Core\Domain\Record` under the hood.
This has changed how some record attributes are accessed.

-   `{data._raw}` ➡️ `{data.rawRecord}`
-   `{data.typeName}` ➡️ `{data.recordType}`
-   `{data.tableName}` ➡️ `{data.mainType}`
-   `{data.creationDate}` ➡️ `{data.systemProperties.createdAt}`
-   `{data.updateDate}` ➡️ `{data.systemProperties.lastUpdatedAt}`
-   `{data.localizedUid}` ➡️ `{data.computedProperties.localizedUid}`

## Data processing {#data-processing}

Content Blocks now uses the `\TYPO3\CMS\Frontend\DataProcessing\RecordTransformationProcessor`
under the hood. This has changed how some fields are transformed.

### Link {#link}

The type [Link](https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:field-type-link@main) field will now resolve to an object of
type `\TYPO3\CMS\Core\LinkHandling\TypolinkParameter`. Checks for existence
need to be adjusted to check for the `url` property instead.

```html
<!-- Before -->
<f:if condition="{data.link_field}">
    <!-- -->
</f:if>

<!-- After -->
<f:if condition="{data.link_field.url}">
    <!-- -->
</f:if>
```

### Folder {#folder}

The type [Folder](https://docs.typo3.org/permalink/friendsoftypo3/content-blocks:field-type-link@main) field will now resolve to a list of
`\TYPO3\CMS\Core\Resource\Folder` objects.

```html
<!-- Before -->
<f:for each="{data.folder}" as="folder">
    <f:for each="{folder}" as="image">
        <f:image image="{item}" />
    </f:for>
</f:for>

<!-- After -->
<f:for each="{data.folder}" as="folder">
    <f:for each="{folder.files}" as="image">
        <f:image image="{item}" />
    </f:for>
</f:for>
```

### FlexForm {#flexform}

New: Sub-fields of type FlexForm are now resolved as well.

## Groups {#groups}

The property `group` now works for both the `NewContentElementWizard` and
for the record selector in the edit view. With this, the way to register groups
has changed.

> [!NOTE]
> The group `common` was renamed to `default`.

Before:

**EXT:my_package/Configuration/page.tsconfig**

```typoscript
mod.wizards.newContentElement.wizardItems {
    my_group {
        header = LLL:EXT:my_package/Resources/Private/Language/Backend.xlf:content_group.my_group
        before = common
    }
}
```

After:

**EXT:my_package/Configuration/TCA/Overrides/tt_content.php**

```php
<?php

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItemGroup(
    'tt_content', // table
    'CType', // typeField
    'my_group', // group
    'LLL:EXT:my_package/Resources/Private/Language/Backend.xlf:content_group.my_group', // label
    'before:default', // position
);
```

## Public assets {#public-assets}

The `assets` folder of your Content Block is now symlinked to the extension's
`Resources/Public/ContentBlocks/*` folder.
