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

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

## Description {#description}

The TypoScript and the page TSconfig of this extension were shipped twice: the
static template read `Configuration/TypoScript/Default/`, and the two site
sets `fgtclb/academic-persons-default` and
`fgtclb/academic-persons-standalone` shipped their own
`constants.typoscript` and `setup.typoscript`, each of them a single
`@import` of that folder. The page TSconfig existed as one flat
file, `Configuration/TSconfig/page.tsconfig`, and 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 content element instead of as one block:

-   `Configuration/TypoScript/Default/` still holds the shared
    `plugin.tx_academicpersons` block. All six content elements are
    driven by one Extbase plugin, so there is one copy of it and every component
    folder names it in its own `include_static_file.txt`.
-   `Configuration/TypoScript/<Component>/` is what the static template
    registers *and* what the component set points its `typoscript` key at.
-   `Configuration/TSconfig/<Component>/page.tsconfig` holds the page
    TSconfig of one content element 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.

Site sets arrived in TYPO3 v13.1. On **TYPO3 v12 they do not exist**, so
everything below that names a site set applies to v13 only, and on v12 the
static template and the page field **Page TSconfig** are the whole
mechanism. The set definitions this extension ships are simply never read there.

The content elements are 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 all six from the selectable content
element types, and the page TSconfig of a component adds its own back. An
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.

The entry each content element has in the new content element wizard moved into
the page TSconfig of its component as well, together with the
`mod.wizards.newContentElement.wizardItems.academic.show` entry that
TYPO3 v12 gates it on. Both arrive together or not at all.

The same holds for the page TSconfig that hides the plugin options the
**Profile Card** does not use: grouping, sorting, pagination, alphabet
pagination and view mode. Version 2.3 shipped it in the always-included page
TSconfig. It is part of the page TSconfig of the card component now, so the
options stay hidden wherever the card can be selected.

Two defaults changed as well.
`plugin.tx_academicpersons.demand.groupBy` and
`plugin.tx_academicpersons.demand.sortBy` were empty in
`constants.typoscript` while the site sets declared `lastNameAlpha` and
`title` for the very same paths, so the two mechanisms configured a site
differently. Both now carry the same value everywhere.

`demand.sortBy` is additionally corrected to `lastName`. The value
the site sets shipped, `title`, is not one the extension accepts: the
extension configuration `demand.allowedSortByValues` allows
`firstName` and `lastName` only, and
`ProfileRepository::getOrderingsFromDemand()` drops anything else. A site
on a site set therefore asked for an ordering it never got.

## Impact {#impact}

The `sys_template` records of this extension keep working. Both values that
installations store, `EXT:academic_persons/Configuration/TypoScript/Default` and
`EXT:academic_persons/Configuration/TypoScript/Standalone`, still resolve, and
both still deliver the plugin configuration. Only the labels shown next to them
in the record changed.

A site that has no site set and did not set
`plugin.tx_academicpersons.demand.groupBy` itself now groups a
profile list by the first letter of the last name, because that is the default
the site sets already applied. Set the constant to an empty value to keep an
ungrouped list. On TYPO3 v12 this affects every installation, because there is
no site set there.

A site **on a site set** that did not set
`plugin.tx_academicpersons.demand.sortBy` itself now sorts a profile
list by last name. It asked for `title` before and got no ordering at all,
because the value was rejected. Set the setting to `firstName` for the other
accepted ordering. There is no supported way back to "no ordering" through this
setting.

A site package that imported one of the removed files by path fails to resolve
it. `@import` of a missing file is silent, so this shows up as
missing configuration rather than as an error message.

None of the six content elements is offered in the backend until the page
TSconfig of its component is included, through the page field **Page
TSconfig** or, on TYPO3 v13, through the site set. This affects every
installation: before this change the extension hid nothing.

> [!WARNING]
> Do not open an existing record of one of these content elements in the
> backend form on a page that does not include the page TSconfig of its
> component. 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.
>
> This holds on TYPO3 v12 and v13 alike. Include the page TSconfig of the
> components on every page tree that holds such records, and do it before
> editing them.

The sets `fgtclb/academic-persons-default` and
`fgtclb/academic-persons-standalone` keep their names and keep delivering
everything, so a site configuration that depends on either needs no change.

## Affected Installations {#affected-installations}

Every installation that uses one of the content elements of this extension, plus
installations that import one of the shipped files from an own site package.

## Migration {#migration}

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

This is the migration step for **every** installation on TYPO3 v12. On TYPO3
v13, sites that use a site set instead need no migration. They must not use both
mechanisms at once, see the **Configuration** chapter.

The static template entries in the `sys_template` record need no migration
either. Their labels changed, their stored values did not:

| Stored value | Old label | New label |
| --- | --- | --- |
| `EXT:academic_persons/Configuration/TypoScript/Default` | **Academic Persons Settings (academic_persons)** | **Academic Persons: Shared plugin settings (academic_persons)** |
| `EXT:academic_persons/Configuration/TypoScript/Standalone` | **Academic Persons Standalone (academic_persons)** | **Academic Persons: Standalone page (academic_persons)** |

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

| Old path | New path |
| --- | --- |
| `EXT:academic_persons/Configuration/TypoScript/constants.typoscript` | `EXT:academic_persons/Configuration/TypoScript/Default/constants.typoscript` |
| `EXT:academic_persons/Configuration/TypoScript/setup.typoscript` | `EXT:academic_persons/Configuration/TypoScript/Default/setup.typoscript` |
| `EXT:academic_persons/Configuration/TypoScript/Standalone/constants.typoscript` | `EXT:academic_persons/Configuration/TypoScript/Default/constants.typoscript` |
| `EXT:academic_persons/Configuration/TypoScript/Standalone/setup.typoscript` | `EXT:academic_persons/Configuration/TypoScript/Default/setup.typoscript` and, for the `page` object, `EXT:academic_persons/Configuration/TypoScript/StandalonePage/setup.typoscript` |
| `EXT:academic_persons/Configuration/TSconfig/page.tsconfig` | `EXT:academic_persons/Configuration/TSconfig/Full/page.tsconfig` |

The first two were shipped as `@deprecated` one line forwards to
`Configuration/TypoScript/Default/` and are removed with this change.

On TYPO3 v13 a site configuration may name the new component sets instead of the
aggregate:

| Set | Delivers |
| --- | --- |
| `fgtclb/academic-persons` | New name of the aggregate, delivers through the component sets below. |
| `fgtclb/academic-persons-default` | Unchanged in name, now an alias of `fgtclb/academic-persons`. |
| `fgtclb/academic-persons-standalone` | Unchanged in name, now the aggregate plus the `page` object. |
| `fgtclb/academic-persons-list` | The **Persons List** content element only. |
| `fgtclb/academic-persons-list-and-detail` | The **Persons List and Detail** content element only. |
| `fgtclb/academic-persons-detail` | The **Persons Detail** content element only. |
| `fgtclb/academic-persons-card` | The **Profile Card** content element only. |
| `fgtclb/academic-persons-selected-profiles` | The **Profiles: Selected Profiles** content element only. |
| `fgtclb/academic-persons-selected-contracts` | The **Profiles: Selected Contracts** content element only. |
