---
title: "Upgrading from 2.3 to 3.0"
manual: "Academic Programs"
version: "main"
permalink: "https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0@main"
source: "Upgrade/From23To30.rst"
rendered: "2026-10-17T08:47:58+00:00"
---

# Upgrading from 2.3 to 3.0 {#upgrade-from-2-3-to-3-0}

This page takes an installation of **academic_programs** 2.3 straight
to 3.0, without the step to 2.4. Version 2.4 brings the selectable content
elements, the static template, the page content and new paths of the shipped
files. Version 3.0 runs on TYPO3 13 and 14 only, renders the program page
inside the layout of the site, replaces the categories partial with the facts
of a program, carries speaking classes, renames the icons, makes the
controllers final and registers the content element **Course Finder**
itself. The page leaves out the 2.4 states that 3.0 replaces: the deprecated
file reference collection, see [Deprecation: The file reference collection goes](https://docs.typo3.org/permalink/fgtclb/academic-programs:deprecation-file-reference-collection@main),
and the content load component, which the [2.4 changelog entry on the
restructured configuration](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-site-sets-and-static-templates-restructured@main) names. Work through the
sections in order. Skip a step that does not apply to the installation.

## Before you start {#upgrade-from-2-3-to-3-0-before-you-start}

Version 3.0 runs on TYPO3 13.4 from 13.4.35 on and on TYPO3 14.3 from 14.3.7
on, with PHP 8.2 or later.

**academic_programs** 3.0 needs these packages. Upgrade them first or
in the same deployment, in this order:

-   [`fgtclb/environment-state-manager`](https://packagist.org/packages/fgtclb/environment-state-manager) 2.x, new since 2.4, which
    **academic_base** 3.0 requires. Composer installs it on its own. A
    classic installation installs **environment_state_manager** before
    it activates **academic_base** 3.0.
-   [`fgtclb/academic-base`](https://packagist.org/packages/fgtclb/academic-base) 3.0, the same release as this extension.
-   [`fgtclb/category-types`](https://packagist.org/packages/fgtclb/category-types) 3.0, the same release as this extension.

These changes have to ship in the same deployment as the update, because a
site or a request fails until they are made:

-   A site without site sets includes the page TSconfig of the components, or
    the content elements are not offered, see
    [Make the content elements selectable](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-content-elements@main).
-   A subclass or an XCLASS of one of the two program controllers stops with a
    fatal error. A registration of the content type
    `academicprograms_programfinder` in the site package collides with the one
    of this extension. Code that names the removed classes
    `FileReferenceCollection` or `\Backend\Tca\Labels` fails. See
    [Adapt your code](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-code@main).

The module paths on this page are those of TYPO3 13, where the upgrade runs.

## Update TYPO3 first {#upgrade-from-2-3-to-3-0-typo3}

Update TYPO3 to 13.4.35 or later while the site still runs 2.3, which supports
TYPO3 13.4. Version 3.0 no longer installs on TYPO3 12, and Composer and the
Extension Manager refuse it next to an older patch release of TYPO3 13.

Stay on TYPO3 13 until the upgrade is complete when the installation also has
**academic_jobs**, **academic_persons**,
**academic_persons_edit** or **academic_projects**. Their
content element wizards read the column `tt_content.list_type`, which
TYPO3 14 removes, so they only run on TYPO3 13. Move to TYPO3 14.3.7 or later
once they have run.

See [Breaking: Removed TYPO3 v12 support](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-removed-typo3-v12-support@main) and
[Important: TYPO3 13.4.35 or 14.3.7 is required](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-minimum-typo3-versions@main).

## Update the package {#upgrade-from-2-3-to-3-0-package}

```bash
composer require -W \
    'fgtclb/academic-base':'~3.0.0' \
    'fgtclb/category-types':'~3.0.0' \
    'fgtclb/academic-programs':'~3.0.0'
```

On a classic installation, install **environment_state_manager** 2.x
from the TER in **Admin Tools > Extensions** first, then update
**academic_base**, **category_types** and
**academic_programs** there, in this order. Run the commands of this
page with `typo3/sysext/core/bin/typo3` instead of
`vendor/bin/typo3`.

```bash
vendor/bin/typo3 cache:flush
```

## Update the database {#upgrade-from-2-3-to-3-0-database}

```bash
vendor/bin/typo3 extension:setup
```

Or apply the changes in **Admin Tools > Maintenance > Analyze
Database Structure**.

The command creates and changes tables and columns and drops nothing. For this
extension it adds two columns in 3.0, which TYPO3 derives from the TCA:

| Column | Change |
| --- | --- |
| `pages.application_link`, `pages.application_link_label` | Added. The link to an application and its label, on the tab **Program** of a program page. A page shows no button until an editor sets a link. See [Feature: Program pages link to an application](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790703178@main). |

An installation that added a column `application_link` of its own removes
its TCA and its [`ext_tables.sql`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/ExtTablesSql.html#file-extension-ext-tables-sql) line for it, the data stays and the
program page renders it. One that kept the link in a column of another name
copies it into the new column once, the changelog entry has the query.

The comparison also applies the changes of the index definitions TYPO3
13.4.35 and 14.3.7 bring.

## Adapt the configuration {#upgrade-from-2-3-to-3-0-configuration}

The configuration of this extension is delivered per component since 2.4: one
component per content element, the page TSconfig as a selectable entry and the
folder `Configuration/TsConfig/` spelled `Configuration/TSconfig/`.
The complete list of paths and names is in the 2.4 changelog entry the
introduction of this page links. The content load component that entry names
was removed again in 3.0, see [Replace the global content object](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-content@main).

### The upgrade check {#upgrade-from-2-3-to-3-0-upgrade-check}

The console command `academic:upgrade:check` of **academic_base**
reads the stored configuration of the installation and reports what no longer
reaches the academic extensions. For this extension it reports an XCLASS of a
controller and a stored path of 2.3 that no longer exists. Run it on the
staging copy right after the package update, and again once the steps of this
section are done:

```bash
vendor/bin/typo3 academic:upgrade:check
```

With the extension key and a site it also compares the override folders of the
site with the shipped files and reports an override of a file the extension no
longer ships, `Program/Categories.html` among them:

```bash
vendor/bin/typo3 academic:upgrade:check academic_programs --site=<site identifier>
```

Each finding, and what to do about it, is described in the [upgrade check](https://docs.typo3.org/p/fgtclb/academic-base/main/en-us/UpgradeCheck/Index.html#upgrade-check)
of **academic_base**.

### Make the content elements selectable {#upgrade-from-2-3-to-3-0-content-elements}

The page TSconfig every installation includes hides the content elements
**Course List**, **Course Data** and the new
**Course Finder**. The page TSconfig of a component brings its element
back. Enable them on every site that uses them, with one of the two mechanisms
and never with both:

-   **With site sets:** the site configuration depends on
    `fgtclb/academic-programs`. The set keeps the name it had in 2.3 and
    includes every component, the finder set
    `fgtclb/academic-programs-program-finder` among them, so a site that
    depends on it already needs no change. A site may name the component sets
    instead.
-   **Without site sets:** in the page record of every site root, field
    **Include static Page TSconfig (from extensions)** on the tab
    **Resources**, add **Academic Programs: All components
    (academic_programs)**, or the entries of the components the site uses.

Until a component is included, an existing content element of it keeps
rendering and keeps its type: **academic_base** shows the stored type
in the field **Type** followed by
**(not enabled on this page)**, and saving keeps it. The warning of the
2.4 changelog entry that saving such a record rewrites its type describes the
state before a fix that **academic_base** 2.4 carries as well, see
[its changelog entry](https://docs.typo3.org/p/fgtclb/academic-base/main/en-us/Changelog/2.4/Important-HiddenContentTypeStaysSelectable.html#important-ace-666-academic-base).
A content element that a page TSconfig of your own already turned into another
type is not repaired. Correct it by hand from its record history.

The finder opens a program list with a selection applied, see
[Feature: A program finder content element](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790367619@main) and [What the finder renders](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-finder@main). A site that registered a
finder of its own under its content type removes that registration first, see
[Adapt your code](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-code@main).

### Check the static template {#upgrade-from-2-3-to-3-0-static-template}

This step concerns sites that include the TypoScript through a
`sys_template` record.

The entry of 2.3, **Academic Programs Page Setup**, keeps its stored
value `EXT:academic_programs/Configuration/TypoScript/` and is called
**Academic Programs: Shared plugin settings and page rendering
(academic_programs)** now. It keeps working, but it no longer defines
`styles.content.getContent`, see
[Replace the global content object](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-content@main).
**Academic Programs: All components (academic_programs)** carries the
same TypoScript, and is the entry to select for a new site.

The static template entry of **academic_partners** 2.3 stored the same
value as the entry of this extension, so a template record that selected it
shows the entry of this extension now. The upgrade chapter of
**academic_partners** has a step to remove it by hand where the site
does not use this extension. Where it does, the entry stays.

### Adjust imports of shipped files {#upgrade-from-2-3-to-3-0-imports}

A site package that imports a file of this extension by path checks every
`@import`. An import of a missing file is silent, so a wrong path
shows up as missing configuration, not as an error.

-   `Configuration/TsConfig/` is `Configuration/TSconfig/` now.
    `Configuration/TsConfig/page.tsconfig` is
    `Configuration/TSconfig/Full/page.tsconfig`, and the backend layout
    moved from `Configuration/TsConfig/Page/BackendLayouts/` to
    `Configuration/TSconfig/BackendLayouts/`.
-   `Configuration/TypoScript/Content/ContentLoad.typoscript` is gone,
    without a successor, see [Replace the global content object](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-content@main).
-   [`Configuration/Sets/AcademicPrograms/constants.typoscript`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/Sets/Index.html#file-set-constants-typoscript) and
    `setup.typoscript` are gone. Import the files of
    `Configuration/TypoScript/` instead.

`academic:upgrade:check` reports an import of a missing file in a
TypoScript record as `typoscript-import` and in page TSconfig as
`tsconfig-import`.

### Replace the global content object {#upgrade-from-2-3-to-3-0-content}

Version 2.3 defined `styles.content.getContent` for every page of
the site, through [`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), and the
program page rendered it. The program page renders the content of its main
column from the variable `programContent` of its own page object
now, see [Important: The program page renders its own content](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-program-page-renders-its-own-content@main), and no academic
extension defines `styles.content.getContent` any more, see
[Breaking: The content load component of programs is removed](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-programs-content-load-set-removed@main).

-   Move a customisation of `styles.content.getContent` that was
    meant for program pages, a content slide or another column for example, to
    `page.10.variables.programContent`, inside the condition on the
    program page type, see [The content of a program page](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-page-content@main).
-   A template of the site package that renders
    `styles.content.getContent` defines the object itself:

    ```typoscript
    styles.content.getContent < styles.content.get
    styles.content.getContent.select.where = {#colPos}=0
    ```

### Move label overrides {#upgrade-from-2-3-to-3-0-label-overrides}

The templates read label overrides from the path the TYPO3 documentation
names. An override under `plugin.tx_academic_programs._LOCAL_LANG`
no longer has an effect. Move it to
`plugin.tx_academicprograms._LOCAL_LANG`, or to
`plugin.tx_academicprograms_<plugin>._LOCAL_LANG` for one plugin.
This includes the labels of the filter form. See
[Important: Label overrides are read from the documented path](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-label-overrides-use-the-documented-path@main) and
[Important: Label overrides of the filters are read from the plugin path](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1790383007@main).

### Import the route enhancer {#upgrade-from-2-3-to-3-0-route-enhancer}

`Configuration/Yaml/Routes.yaml` could not be imported up to 2.3, it was
not valid YAML, see [Important: The shipped route enhancer configuration can be imported](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1787055000@main). The enhancer of the
**Course List** lives in `Configuration/Routes/List.yaml` now,
maps the category filter and the sorting into the path, and translates the
sorting values into the language of the site. The former file imports it.

**config/sites/\<site>/config.yaml**

```yaml
imports:
  - resource: 'EXT:academic_programs/Configuration/Routes/List.yaml'
```

A site that copied the enhancer of 2.3 into its own site configuration replaces
the copy by that import. See [Important: The route enhancer moved and translates its values](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1791043405@main) and
[Feature: The route enhancer maps the filter](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1791043404@main).

The list answers a filter submission with a redirect to a URL that carries the
selection. A route enhancer the site keeps for the program list must not
declare `defaults` for the sorting, see [Important: The route enhancer declares no default sorting](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1790226103@main) and
[Feature: Program filter selections have a URL](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790226102@main).

## Adapt templates and assets {#upgrade-from-2-3-to-3-0-templates}

### Style the new markup {#upgrade-from-2-3-to-3-0-stylesheets}

The templates of this extension carry speaking classes now, such as `ace-item`,
`ace-list`, `ace-attribute`, `ace-label` and `ace-value`, in place of the card,
list group and utility classes of a theme. The extension ships no styles for
them. Move the selectors of the site stylesheet from the old classes to the new
ones, the changelog entry lists them side by side, see
[Breaking: Program templates carry speaking classes](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-programs-speaking-frontend-classes@main). [Styling](https://docs.typo3.org/permalink/fgtclb/academic-programs:styling@main) shows the
markup of every view and links the stylesheet partial the development instances
of the academic extensions use, [An example](https://docs.typo3.org/permalink/fgtclb/academic-programs:styling-example@main).

The images of the program list and the program page render as a
`<picture>` through the image partial of **academic_base**. CSS
that selects the image as a direct child of its container adjusts to the
wrapper. A plugin view whose partial root paths the site replaced completely
needs the path of **academic_base** below its own:

```typoscript
plugin.tx_academicprograms.view.partialRootPaths {
    -1 = EXT:academic_base/Resources/Private/Partials/
}
```

See [Breaking: Images render as a responsive picture](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-programs-images-render-as-picture@main).

### Replace the renamed icons {#upgrade-from-2-3-to-3-0-icons}

The icons of this extension are new drawings, registered in a way that follows
the colour scheme of the backend and the colour of the text in the frontend.

-   The identifier `academic-programs` is gone. Replace it with
    `tx-academicprograms-doktype-program` where the page type is meant and
    with `tx-academicprograms-plugin-programs` where a content element is
    meant, in TCA, page TSconfig, templates and CSS selectors.
-   The credit points icon is a frontend icon of
    `Configuration/FrontendIcons.php`. A replacement of it is registered
    in the `Configuration/FrontendIcons.php` of the site package.
-   A path to a file below `Resources/Public/Icons/CategoryTypes/` points
    at the new file of the changelog entry.

See [Breaking: Icons renamed, credit points icon is a frontend icon](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-programs-credit-points-icon-is-a-frontend-icon@main). The
category type icons in the facts render as an inline `<svg>` now, so CSS
that addressed an `<img>` addresses the `<svg>`, see
[Breaking: Record and category icons follow the colour scheme](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-programs-record-and-category-icons-follow-the-colour-scheme@main).

### Render program pages in the site layout {#upgrade-from-2-3-to-3-0-page}

The page template of the program page type renders the section `Main` of
the layout `Default` of the site package, through the partials below
`Program/Page/`. A program page shows the header, the navigation and the
footer of the site now. See
[Breaking: Program pages render inside the site layout](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-program-page-renders-inside-the-site-layout@main).

-   A site package whose layout for program pages has another name sets
    `plugin.tx_academicprograms.page.layout`, see
    [The layout of a program page](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-page-layout@main).
-   `plugin.tx_academicprograms.page.listPid` names the page the
    link back to the program list leads to. Without it the page shows no link.
-   An override of `Pages/AcademicProgram.html` made to change one part
    moves that change to the matching partial below `Program/Page/`, see
    [The parts of a program page](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-page-partials@main), and the override goes. An override that stays
    renders no application link, which the partial
    `Program/Page/CallToAction.html` renders.
-   A site package that shipped `Academicprogram.html` as the page
    template of the page type renames it to `AcademicProgram.html`. The
    extension sets `page.10.templateName` itself. See
    [Important: The page template name of the academic program page type is set explicitly](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1786968000@main).

### Render the facts {#upgrade-from-2-3-to-3-0-facts}

The partial `Program/Categories.html` is removed. The program page, the
**Course Data** content element and the card of the **Course
List** render their facts through `Program/Facts.html` and
`Program/Facts/Item.html`, from the field lists
`plugin.tx_academicprograms.facts.fields` and
`card.fields`. See
[Breaking: The partial Program/Categories.html has been removed](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-program-categories-partial-removed@main) and [The facts of a program](https://docs.typo3.org/permalink/fgtclb/academic-programs:program-facts@main).

-   Move a change of one fact to an override of `Program/Facts/Item.html`,
    and a change of the whole list to an override of `Program/Facts.html`.
-   Set the field lists where the override changed which facts are shown or
    their order.
-   An override of a template that renders
    `<f:render partial="Program/Categories" ... />` fails. Render
    `Program/Facts` there, and remove the override of
    `Program/Categories.html`.

### Compare template overrides {#upgrade-from-2-3-to-3-0-overrides}

Versions 2.4 and 3.0 change these templates and partials. A copy of one of them
in a site package keeps rendering the copy, so compare each copy with the
shipped file of 3.0 and take over the changes. The paths below are relative to
`Resources/Private/`:

| File | What changed | Entry |
| --- | --- | --- |
| `Pages/AcademicProgram.html` | Renders the layout of the site and the partials below `Program/Page/`, among them the facts and the application link, and the content from `{programContent}` in place of `styles.content.getContent`. | [Render program pages in the site layout](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-page@main), [Replace the global content object](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-content@main), [Feature: Program pages link to an application](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790703178@main) |
| `Templates/Details/Show.html`, `Partials/Program/Item.html` | Render the facts through `Program/Facts.html`. The item renders the image through `Academic/Image.html` of **academic_base**, and can show the most specific category of a type. | [Render the facts](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-facts@main), [Style the new markup](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-stylesheets@main), [Feature: Program facts can show the most specific category](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790681426@main) |
| `Templates/Program/List.html`, `Partials/Program/SortingAndFilters.html`, `Partials/Program/DemandCategories.html`, `Partials/Program/DemandSorting.html` | Carry the wrapper, the region, the submit button and the marks the module of the list reads to update the list in place, and load the module unless `settings.assets.js` switches it off. The selects have no `onchange` handler any more, and the extension allows none in the Content Security Policy. A copy that keeps the handler needs its hash in the `csp.yaml` of the site. | [Important: Overrides of the program list templates](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1790982307@main), [Important: The filter form works under a security policy](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-ace-924-academic-programs@main), [Feature: The scripts of the program list and finder can be switched off](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1791566505@main) |
| `Templates/Program/List.html`, `Templates/Details/Show.html` | Render the header of the content element while `renderContentElementHeader` is switched on. | [Feature: The plugins can render the content element header](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790440963@main) |
| `Partials/Program/SortingAndFilters.html` | Renders the new partials `Program/ActiveFilters.html` and `Program/ResultCount.html`. | [Feature: Active filter tags, a reset link and a result count](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790946476@main) |
| `Partials/Program/DemandCategories.html` | Offers the category types the content element or `plugin.tx_academicprograms.filter.categoryTypes` names, in that order, puts the ones after `filter.visibleCount` into a **More filters** section, and labels an own category type by its title. | [Feature: Choose, order and label the program filters](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790383004@main), [Feature: Integrators choose the filters of the program list](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790361244@main), [Feature: Own category types are named by their title](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1791035982@main) |
| `Partials/Program/Header.html` | Takes the class of the heading as `class` in place of `positionClass`. | [Style the new markup](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-stylesheets@main) |
| Every file above, and `Partials/Program/ItemList.html` | Speaking classes in place of the classes of a theme. The translations pass the extension name `AcademicPrograms` instead of `academic_programs`, otherwise they miss the label overrides of the configuration step. | [Style the new markup](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-stylesheets@main), [Move label overrides](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-label-overrides@main) |
| `Partials/Program/Categories.html` | Removed. | [Render the facts](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-facts@main) |
| `Backend/Partials/PageLayout/Doktype20.html` | Removed, with its registrations `templates.typo3/cms-backend.1730990129` and `templates.typo3/cms-backend.academic-programs`. It was never rendered. The page module shows the categories of a program page through **category_types**, which takes an override under `templates.fgtclb/category-types.<key>`. | [Important: The page module shows the page categories](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1789660802@main) |

The upgrade check with the extension key and a site reports an override of a
file the extension no longer ships, `Program/Categories.html` among them,
see [The upgrade check](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-upgrade-check@main).

## Adapt your code {#upgrade-from-2-3-to-3-0-code}

-   `ProgramController` and `DetailsController` are final. A
    subclass, and an XCLASS of one of them, stop with a fatal error. Remove
    them, and the `configurePlugin()` call or the XCLASS registration that
    points at them, in the same deployment as the update. Move what they did
    to a listener of the program events or of the plugin view event, see
    [Breaking: The program controllers are final](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-1791043408@main) and [For developers](https://docs.typo3.org/permalink/fgtclb/academic-programs:developers@main).
-   This extension registers the content type `academicprograms_programfinder`
    with the plugin `ProgramFinder` now. A site package or project extension
    that registered a finder under these names removes its type item, its
    FlexForm, its `configurePlugin()` call, its controller code and its
    page TSconfig, in the same deployment as the update. Stored finder records
    keep their type and render with the finder of this extension. See
    [Breaking: The content type academicprograms_programfinder is taken](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-program-finder-registered-upstream@main).
-   `\FGTCLB\AcademicPrograms\Collection\FileReferenceCollection` is
    removed. Read the file references through
    `\TYPO3\CMS\Core\Resource\FileRepository::findByRelation()`. Which
    references come back differs in hidden and workspace records, the entry
    lists how. See [Breaking: The file reference collection is removed](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-file-reference-collection-removed@main).
-   `\FGTCLB\AcademicPrograms\Backend\Tca\Labels` is removed. Remove a
    `label_userFunc` that names it, it never changed a label, see
    [Breaking: The unused TCA label class has been removed](https://docs.typo3.org/permalink/fgtclb/academic-programs:breaking-tca-labels-class-removed@main).
-   `\FGTCLB\AcademicPrograms\DataProcessing\ProgramDataProcessor` takes
    the facts builder, the data factory and the event dispatcher as
    constructor arguments. A subclass passes them on and is registered as a
    public service, or is replaced by a listener of
    `ModifyProgramDataEvent`. See [Feature: Change the program list, finder and page by event](https://docs.typo3.org/permalink/fgtclb/academic-programs:feature-1790604743@main).
-   Code that extends or replaces `ProgramDemand`, the
    `DemandFactory` or the `ProgramRepository` takes the flag
    `showHiddenRecords` into account, new since 2.4. See
    [Important: Extended ProgramDemand and demand handling](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-ace-250-academic-programs@main).
-   The FlexForm data structure of the **Course List** is one file now,
    `Configuration/FlexForms/ProgramListSettings.xml`. The files below
    `Configuration/FlexForms/Core12/` and `Core13/` are gone. Code
    of the site that names one of them by path names the new file. The field
    names are unchanged. See
    [Important: The FlexForm data structure moved](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-programs-flexform-data-structure-moved@main).

## Check the result {#upgrade-from-2-3-to-3-0-check}

-   The upgrade check exits with `0`, without and with the extension key,
    see [The upgrade check](https://docs.typo3.org/permalink/fgtclb/academic-programs:upgrade-from-2-3-to-3-0-upgrade-check@main). Run it again after each
    configuration step, and in the deployment pipeline.
-   The new content element wizard offers **Course List**,
    **Course Data** and **Course Finder** on the pages of every
    site that uses them, see
    [Important: Content elements have new titles and descriptions](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-content-element-titles-and-descriptions@main), and an existing
    element opens with its type.
-   A program page renders inside the layout of the site, with the content of
    its main column and its facts, and its page module shows the categories of
    the page.
-   Pages of the site package that render
    `styles.content.getContent` still render their content.
-   The program list, the details and the finder look as the site intends,
    with the speaking classes, and the list updates in place when a filter
    changes.
-   A list element with a hidden sorting select keeps the default sorting of
    the element when it is filtered now, see [Important: The program list keeps its sorting when a filter carries none](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-1790370061@main).
-   A list that hides a part of its form keeps the preset of that part when a
    visitor uses the rest of the form, see
    [Important: A hidden part of the form keeps the preset value](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-hidden-program-form-parts-keep-their-presets@main). A sorting
    that was hidden only to keep the default categories can be shown again.
-   A list with two default categories of one category type shows only the
    programs that carry both, as before. The description of the field says so
    now, see [Important: The description of Default categories names their rule](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-program-default-categories-description@main).
-   A list keeps its default categories of the category types a finder or its
    own filter does not offer, see
    [Important: The program list keeps default categories of other types](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-list-keeps-default-categories-of-types-not-submitted@main).
-   On PostgreSQL, programs that are equal in the chosen ordering may change
    their relative order once, they are ordered by uid now. See
    [Important: List ordering ties are broken by uid](https://docs.typo3.org/permalink/fgtclb/academic-programs:important-list-ordering-ties-are-broken-by-uid@main).
