---
title: "Breaking: Site sets and static templates have been restructured"
manual: "Academic Contacts for Pages"
version: "3.0"
permalink: "https://docs.typo3.org/permalink/fgtclb/academic-contacts4pages:breaking-site-sets-and-static-templates-restructured@3.0"
source: "Changelog/2.4/Breaking-SiteSetsAndStaticTemplatesRestructured.rst"
rendered: "2026-10-26T17:55:07+00:00"
---

# Breaking: Site sets and static templates have been restructured {#breaking-site-sets-and-static-templates-restructured}

## Description {#description}

The TypoScript of this extension was shipped through a chain of
`@import` statements: the static template read
`Configuration/TypoScript/`, whose `setup.typoscript` imported
`Configuration/TypoScript/Page/`, and the site set
`fgtclb/academic-contacts4pages` shipped a `setup.typoscript` of its
own that imported the first one again. The page TSconfig existed only as
`Configuration/TsConfig/page.tsconfig`, reachable through the
auto-included [`Configuration/page.tsconfig`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/PageTsconfig.html#file-extension-configuration-page-tsconfig) and through nothing else. It
was not selectable on a page at all.

Both mechanisms now read one physical copy of every file, and both of them
deliver the extension per component instead of as one block:

-   `Configuration/TypoScript/List/` holds the TypoScript of the
    **Contacts for this page** content element and is what the static
    template registers *and* what the set points its `typoscript` key at.
    Its `setup.typoscript` carries what
    `Configuration/TypoScript/Page/Plugin.typoscript` and
    `Configuration/TypoScript/Page/Fluidtemplate.typoscript` used to
    carry, with one difference: the three Fluid root paths were literals there
    and are constants now, declared in the `constants.typoscript` beside
    it.
-   `Configuration/TSconfig/List/page.tsconfig` holds its page TSconfig
    and is what the page field **Page TSconfig** offers *and* what the
    set points its `pagets` key at.
-   `Configuration/TypoScript/Full/` and
    `Configuration/TSconfig/Full/page.tsconfig` are the aggregates for
    installations that do not use site sets. On TYPO3 v12 that is every
    installation, because site sets arrived in TYPO3 v13.1.

Note the directory as well: `Configuration/TsConfig/` was renamed to
`Configuration/TSconfig/`, the spelling TYPO3 itself uses, so that all
academic extensions agree on one.

The extension ships a `constants.typoscript` for the first time. It
declares the three Fluid root paths of the plugin,
`plugin.tx_academiccontacts4pages.view.templateRootPath`,
`…partialRootPath` and `…layoutRootPath`, with exactly
the values that were hard coded in the setup before, so a site that changes
nothing renders exactly as it did. What is new is that these paths can now be
overridden as constants, in the constant editor or, on TYPO3 v13, in
`config/sites/<site>/constants.typoscript`.

The content element is now **hidden by default**. The always-included
[`Configuration/page.tsconfig`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/PageTsconfig.html#file-extension-configuration-page-tsconfig) removes
`academiccontacts4pages_list` from the selectable content element
types, and the page TSconfig of the component adds it back. The element is
therefore offered where it is wanted instead of on every page of every
installation. The TCA registration itself did not move, so the frontend renders
existing records exactly as before. Editing such a record in the backend needs
care. Read the warning below before upgrading.

## Impact {#impact}

A `sys_template` record that selected the old static template keeps its
stored value. The folder of that value holds no TypoScript of its own any more.
It imports the files of the component folder instead, so it delivers the
TypoScript of this extension as before. The path is deprecated and will be
removed in version 4.0, see [Deprecation: The static template path of version 2.3](https://docs.typo3.org/permalink/fgtclb/academic-contacts4pages:deprecation-legacy-static-template-path@3.0).

A site package that imported [`Configuration/TypoScript/setup.typoscript`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/TypoScript/Index.html#file-extension-configuration-typoscriptsetup-typoscript)
by path keeps getting the configuration, deprecated in the same way, once it
also imports the `constants.typoscript` that folder holds now. Every
other shipped file it imported by path fails to resolve. `@import`
of a missing file is silent, so this shows up as missing configuration rather
than as an error message.

The **Contacts for this page** content element is no longer offered in
the backend until the page TSconfig of the component is included, through the
site set or through the page field **Page TSconfig**. On TYPO3 v12 the
page field is the only one of the two that works, and that same file also
carries the entry of the new content element wizard, which v12 builds from page
TSconfig rather than from TCA.

> [!WARNING]
> Do not open an existing **Contacts for this page** record in the
> backend form on a page that does not include that page TSconfig. An item
> removed through `TCEFORM.tt_content.CType.removeItems` is
> excluded from the **\[ invalid value \]** fallback TYPO3 otherwise
> adds for a stored value it does not know, and the stored value is dropped
> from the form data as well. The field **Type** therefore comes up
> with nothing selected, and **saving the record writes whatever the browser
> preselected into** `CType`. The record silently becomes another content
> element. The frontend keeps rendering it correctly until that happens.
>
> Include the page TSconfig of the component on every page tree that holds
> such records, and do it before editing them.

The set `fgtclb/academic-contacts4pages` keeps its name and keeps
delivering everything, so a site configuration that depends on it needs no
change.

## Affected Installations {#affected-installations}

Installations that select the static template of this extension in a
`sys_template` record, that import one of the shipped files from an own
site package, or that use the content element without including the page
TSconfig of this extension.

## Migration {#migration}

Replace the deprecated static template entry in the `sys_template`
record:

| Old entry | New entry |
| --- | --- |
| **Contacts for Pages (academic_contacts4pages)**, stored as `EXT:academic_contacts4pages/Configuration/TypoScript/` | **Academic Contacts4Pages: All components (academic_contacts4pages)**, stored as `EXT:academic_contacts4pages/Configuration/TypoScript/Full`, or **Academic Contacts4Pages: Contact list (academic_contacts4pages)**, stored as `EXT:academic_contacts4pages/Configuration/TypoScript/List` |

Both new entries include the shared plugin settings of EXT:academic_persons.
Remove a separate entry of that extension from the record, or its TypoScript is
read twice, see [Deprecation: The static template path of version 2.3](https://docs.typo3.org/permalink/fgtclb/academic-contacts4pages:deprecation-legacy-static-template-path@3.0).

Add the page TSconfig entry, which did not exist before, in the page record of
the site root, tab **Resources**, field **Page TSconfig**:
**Academic Contacts4Pages: All components (academic_contacts4pages)**,
stored as
`EXT:academic_contacts4pages/Configuration/TSconfig/Full/page.tsconfig`. Without
it the content element is not selectable any more, and existing records of it
lose their `CType` when they are saved from the backend form.

Sites that use the site set instead need no migration. They must not use both
mechanisms at once, see the **Configuration** chapter. That applies to
TYPO3 v13 only. On TYPO3 v12 the entries above are required.

Adjust every `@import` in an own site package:

| Old path | New path |
| --- | --- |
| `EXT:academic_contacts4pages/Configuration/TypoScript/setup.typoscript` | `EXT:academic_contacts4pages/Configuration/TypoScript/List/setup.typoscript` |
| `EXT:academic_contacts4pages/Configuration/TypoScript/Page/Plugin.typoscript` | `EXT:academic_contacts4pages/Configuration/TypoScript/List/setup.typoscript` |
| `EXT:academic_contacts4pages/Configuration/TypoScript/Page/Fluidtemplate.typoscript` | `EXT:academic_contacts4pages/Configuration/TypoScript/List/setup.typoscript` |
| `EXT:academic_contacts4pages/Configuration/TypoScript/Page/` | `EXT:academic_contacts4pages/Configuration/TypoScript/List/setup.typoscript` |
| `EXT:academic_contacts4pages/Configuration/TsConfig/page.tsconfig` | `EXT:academic_contacts4pages/Configuration/TSconfig/List/page.tsconfig` |

> [!WARNING]
> A site package that imports the setup must import the constants as well. The
> three Fluid root paths are constants now, and TypoScript leaves an undefined
> constant as its own literal text rather than reporting it. A site package
> that imports only [`…/Configuration/TypoScript/List/setup.typoscript`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/TypoScript/Index.html#file-extension-configuration-typoscriptsetup-typoscript)
> ends up with `templateRootPaths.10` set to the string
> `{$plugin.tx_academiccontacts4pages.view.templateRootPath}` and the plugin
> fails with a missing template. Import the constants in the constants of the
> site package:
>
> ```typoscript
> @import 'EXT:academic_contacts4pages/Configuration/TypoScript/List/constants.typoscript'
> ```
>
> Neither of the two shipped delivery mechanisms is affected: both read the
> whole folder.

A site configuration on TYPO3 v13 may name the new component set instead of
the aggregate:

| Set | Delivers |
| --- | --- |
| `fgtclb/academic-contacts4pages` | Unchanged in name, now delivers through the component set below. |
| `fgtclb/academic-contacts4pages-list` | The **Contacts for this page** content element only. |
