---
title: "Upgrading from 2.3 to 3.0"
manual: "Academic Jobs"
version: "3.0"
permalink: "https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0@3.0"
source: "Upgrade/From23To30.rst"
rendered: "2026-10-26T17:55:19+00:00"
---

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

This page takes an installation of **academic_jobs** 2.3 straight to
3.0, without the step to 2.4. Version 3.0 drops TYPO3 12, applies the
validation settings to the backend record editor as well and renders the job
views with speaking classes and new icons. From 2.4 it takes over the
configuration per component, the content elements that stay hidden until a site
enables them, and the upgrade wizards for the job contacts and the jobs of the
old new job form. The page leaves out the 2.4 state that 3.0 replaces: the
editor configuration `JavaScript/frontend/ckeditor.js`, see
[Breaking: The editor configuration moved](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-ckeditor-configuration-moved@3.0). 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_jobs** 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** 2.x
    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.

`ext_emconf.php` names the system extensions **rte_ckeditor**
and **fluid_styled_content** by their extension keys since 2.4. A
classic installation resolves its dependencies from that file, so both have to
be active. See [Important: Dependencies are named by their extension keys](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-1790336613@3.0).

A site package that ships its own
`Configuration/AcademicJobs/Settings.yaml` changes it in the same
deployment as the update:

-   Replace `number` with `tel` on `contactPhone`, or remove
    the field from the file so the shipped flags apply. The shipped file of
    2.3 marked the field with `number`, and so does a copy of it. The
    flags reach the backend record editor of a job now, and
    a `number` there stores `+49 30 123` as `49` when an
    editor saves the job. Move a TCA override of `required` or
    `readOnly` of a job field into the settings file, the settings win
    over it now. See [Breaking: The job validation settings reach the backend](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-job-validation-settings-reach-the-backend@3.0)
    and [Important: The new job form stores the chosen values](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-new-job-form-stores-the-chosen-values@3.0).
-   The files of all packages are merged per field now. A field the copy left
    out to make it optional keeps the flags **academic_jobs** ships.
    Name it with an empty list instead, and drop the fields the site package
    does not change. See
    [Breaking: The job validation settings are merged per field](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-job-validation-settings-merged-per-field@3.0).
-   Flags are read regardless of case, a flag outside the shared vocabulary is
    ignored, and `readonly`, `disabled` and
    `frontendreadonly` take effect. Check the flags of the file against
    [Validation settings](https://docs.typo3.org/permalink/fgtclb/academic-jobs:configuration-validations@3.0), see
    [Important: The job validation flags follow the persons vocabulary](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-validation-flags-follow-the-shared-vocabulary@3.0).

A site without the site set also includes the page TSconfig of the components
in the same deployment, or the content elements are not offered for new
content, see [Include the components](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-components@3.0).

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. The content element wizard
`academicJobs_pluginContent` of this extension reads the column
`tt_content.list_type`, which TYPO3 14 removes, so it only runs on
TYPO3 13. The same holds for the content element wizards of
**academic_persons**, **academic_persons_edit** and
**academic_projects** when the installation also has them. 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-jobs:breaking-removed-typo3-v12-support@3.0) and
[Important: TYPO3 13.4.35 or 14.3.7 is required](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-minimum-typo3-versions@3.0).

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

```bash
composer require -W \
    'fgtclb/academic-base':'~3.0.0' \
    'fgtclb/academic-jobs':'~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** and **academic_jobs** 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**.

For this extension the comparison adds and changes:

-   `company_name`, `sector`, `required_degree` and
    `contractual_relationship` of `tx_academicjobs_domain_model_job`
    become nullable. No data is converted, see [Important: Four job columns are nullable now](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-1785882500@3.0).
-   `l10n_source` is added to the same table, where a translation records
    the record it was made from. Existing rows get `0`, see
    [Important: The job table records its translation source](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-463-academic-jobs@3.0).

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

> [!WARNING]
> Do not remove the old job contact table and field yet. Version 2.1 dropped
> `tx_academicjobs_domain_model_contact` and the field `contact` of
> the job table, and the analyzer offers both in its remove section, first
> to rename them to `zzz_deleted_tx_academicjobs_domain_model_contact`
> and `zzz_deleted_contact`, then to drop them. Renaming is harmless.
> Dropping them deletes the contacts the wizard of the next section still
> has to copy, see [Important: The job contact wizard finds the renamed old schema](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-contact-wizard-finds-renamed-table@3.0).
> `extension:setup` removes nothing, it applies additions and changes
> only.

## Run the upgrade wizards {#upgrade-from-2-3-to-3-0-wizards}

The wizards need the database changes of the previous section. Run them on
TYPO3 13, in this order, in **Admin Tools > Upgrade > Upgrade Wizard**
or on the command line.

1.  `academicJobs_contactRelation`, **Migrate job contact records
    from relation to fields directly in the job record**. It copies the contact
    record of a job into the contact fields of the job. Up to 2.3 it left out
    every job that was hidden, scheduled or expired while it ran, which
    includes every job submitted through the frontend form and not yet
    approved. It now reads every job and leaves a job alone that has a contact
    of its own. An installation that already ran it has it recorded as done
    and marks it undone first. For a wizard that was never recorded as done,
    the command reports an error, which is harmless. Then run the wizard:

    ```bash
    vendor/bin/typo3 upgrade:mark:undone academicJobs_contactRelation
    vendor/bin/typo3 upgrade:run academicJobs_contactRelation
    ```

    Read [Important: The job contact wizard migrates invisible jobs](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-contact-wizard-migrates-invisible-jobs@3.0) before
    running it: a job whose contact fields an editor emptied on purpose gets
    its old contact back.
1.  `academicJobs_repairNewJobFormValues`, **Repair the jobs stored
    by the old new job form of academic jobs**. It moves the start date and the
    application deadline the old form stored with the time of day of the
    submission to whole days, and lists the jobs that kept an unchosen
    **Employment Type** or **Job Type** for an editor. It
    writes the database directly, in the time zone of the process that runs
    it, and a wrong zone moves the dates in a way that cannot be taken back.
    Check the time zone its description names first. If it is not the zone
    the form ran in, set
    `$GLOBALS['TYPO3_CONF_VARS']['SYS']['phpTimeZone']`, or run the
    wizard from the upgrade module, which runs in the web server like the form
    did:

    ```bash
    vendor/bin/typo3 upgrade:list
    vendor/bin/typo3 upgrade:run academicJobs_repairNewJobFormValues
    vendor/bin/typo3 cache:flush
    ```

    Keep the list of jobs it prints, it is shown once. Correct those jobs in
    the backend. See [Important: A wizard repairs the jobs of the old new job form](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-repair-wizard-for-jobs-of-the-old-form@3.0).
1.  `academicJobs_pluginContent`, **Migrate plugin list element
    from academic_jobs to normal content elements**. It turns every content
    element that is still stored as **Insert plugin** with one of the
    plugins `academicjobs_newjobform`, `academicjobs_list` or
    `academicjobs_detail` into a content element of the type of the same name.
    Such elements are left from version 1.x. The wizard reads
    `tt_content.list_type`, which TYPO3 14 removes, so run it before the
    core moves to TYPO3 14, by its name:

    ```bash
    vendor/bin/typo3 upgrade:run academicJobs_pluginContent
    ```

    Once the column is gone, the wizard finds nothing to do, and the elements
    it would have migrated keep a type nothing renders. TypoScript, page
    TSconfig or SQL of a site package that names one of the plugins through
    `list_type` matches on `CType` instead. See
    [Breaking: Extbase plugins require CType on TYPO3 v14](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-plugins-require-ctype-on-typo3-v14@3.0).

A wizard that TYPO3 recorded as done is offered again once it is marked
undone. TYPO3 13 marks a wizard undone with
`vendor/bin/typo3 upgrade:mark:undone <identifier>`.

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

The TypoScript and the page TSconfig are delivered per content element since
2.4, and the three content elements are hidden in the whole installation until
the page TSconfig of their component is included. See
[Breaking: Site sets and static templates have been restructured](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-site-sets-and-static-templates-restructured@3.0).

### 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 the static
templates, page TSconfig imports and site sets that no longer reach an academic
extension. 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 template overrides of
the site with the templates this extension ships:

```bash
vendor/bin/typo3 academic:upgrade:check academic_jobs --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**.

### Include the components {#upgrade-from-2-3-to-3-0-components}

-   **Site set.** A site that depends on the set `fgtclb/academic-jobs` needs
    no change. The set keeps its name and brings the page TSconfig of all
    three content elements along.
-   **Static template.** The stored entry of 2.3 keeps working as
    **Academic Jobs: Shared plugin settings (academic_jobs)**. Replace
    it with **Academic Jobs: All components (academic_jobs)**, or with
    the entries of the content elements the site uses, in the field
    **Include TypoScript sets** on the tab
    **Advanced Options** of the template record.
-   **Page TSconfig.** A site without the site set adds
    **Academic Jobs: All components (academic_jobs)** in the field
    **Include static Page TSconfig (from extensions)** on the tab
    **Resources** of its root page, see [Include static page TSconfig](https://docs.typo3.org/permalink/fgtclb/academic-jobs:static-pagetsconfig@3.0).
    Without it the content elements are not offered for new content.
-   Use one of the two mechanisms per site, see
    [Do not combine both](https://docs.typo3.org/permalink/fgtclb/academic-jobs:one-mechanism-per-site@3.0).

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.

### Adjust your own configuration {#upgrade-from-2-3-to-3-0-own-configuration}

-   The page TSconfig directory is `Configuration/TSconfig/` now, and its
    files were reorganised. Take the new path of every `@import`
    from the table of the changelog entry linked above, see also
    [Important: The page TSconfig directory is now spelled TSconfig](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-1787141400@3.0). An import of a missing file fails silently.
-   A site whose content element layout renders no header sets
    `plugin.tx_academicjobs.renderContentElementHeader = 1`, also
    available as a site setting. The plugins no longer render the header
    themselves, see [Important: The job plugins leave the content element header to the layout](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-1790323400@3.0).
-   Label overrides move from `plugin.tx_academic_jobs._LOCAL_LANG`
    to `plugin.tx_academicjobs._LOCAL_LANG`, see
    [Important: Label overrides are read from the documented path](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-label-overrides-use-the-documented-path@3.0).
-   An empty
    `plugin.tx_academicjobs.jobAvatarImage.validation.mimeType.allowedMimeTypes`
    accepts every media type. List the accepted types to keep restricting the
    logo, see [Important: An empty mime type list accepts every upload](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-267-academic-jobs@3.0).
-   The job detail page answers `404` without a job. Hide it in menus, a menu
    link carries no job. The label
    `tx_academicjobs.fe.alert.job_not_found.body` it showed before is
    removed, so an override of it has no effect any more. See
    [Important: The job detail answers "not found" without a job](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-detail-answers-not-found-without-a-job@3.0).
-   The job detail page sets the page title. A site whose own page title
    provider has to win orders it before `academicJobs`, see
    [Important: The job detail sets the page title](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-detail-sets-the-page-title@3.0).
-   A site that imports `Configuration/Routes/Detail.yaml` needs no
    change. A site that copied the route enhancer into its own configuration
    sets `defaultController: 'Job::show'` in the copy, see
    [Route enhancers](https://docs.typo3.org/permalink/fgtclb/academic-jobs:configuration-route-enhancers@3.0).
-   The notification mail about a new job is rendered from the Fluid mail
    template `JobCreated`, with a default message in the language of the page.
    A site that set `plugin.tx_academicjobs.email.template` keeps
    its own text in the mail. See [Feature: The notification mail about a new job is a Fluid template](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-1790666339@3.0) and
    [The notification mail about a submitted job](https://docs.typo3.org/permalink/fgtclb/academic-jobs:configuration-general-notification-mail@3.0).
-   A site that loads its own editor, or none, switches the two scripts of the
    job form off with `plugin.tx_academicjobs.assets.js = 0`, see
    [Feature: The scripts of the new job form can be switched off](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-1791566501@3.0).

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

### Classes and styles {#upgrade-from-2-3-to-3-0-classes}

The templates render speaking classes now, shared by all academic extensions,
and no classes of the theme they were developed with. The extension ships no
stylesheet, so a site that relied on the card and list group classes of a
Bootstrap theme styles the new classes itself. Move the selectors of the site
stylesheet to the classes in the table of
[Breaking: Job templates carry speaking classes](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-jobs-speaking-frontend-classes@3.0). The chapter [Styling](https://docs.typo3.org/permalink/fgtclb/academic-jobs:styling@3.0)
describes the markup, and [An example](https://docs.typo3.org/permalink/fgtclb/academic-jobs:styling-example@3.0) names the stylesheet of the
development instances as a starting point. The new job form renders the form
partials of **academic_base**, whose classes are described in its
[changelog](https://docs.typo3.org/p/fgtclb/academic-base/main/en-us/Changelog/3.0/Breaking-SpeakingFrontendClasses.html#breaking-base-speaking-frontend-classes).

### The job image {#upgrade-from-2-3-to-3-0-images}

The job image is a `<picture>` with WebP sources now. CSS that selects
the image as a direct child of the card no longer matches. The job views and
the new job form render partials of **academic_base**, so a site that
replaced the partial root paths of the plugin completely adds the path of
**academic_base** below its own:

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

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

### The editor configuration {#upgrade-from-2-3-to-3-0-rich-text}

The editor configuration of the new job form is an ES module now:

| Old path | New path |
| --- | --- |
| `EXT:academic_jobs/Resources/Public/JavaScript/CKEditor.js` | `EXT:academic_jobs/Resources/Public/JavaScript/frontend/rich-text.js`, loaded as the module `@fgtclb/academic-jobs/frontend/rich-text.js` |

An override of `Templates/Job/New.html` loads it with
`<f:asset.module identifier="@fgtclb/academic-jobs/frontend/rich-text.js" />`.
`<f:asset.script>` does not execute a module. See
[Breaking: The editor configuration is an ES module](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-ckeditor-configuration-is-a-module@3.0).

### Icons {#upgrade-from-2-3-to-3-0-icons}

Every icon of the extension has a new identifier. The icons of the job
properties and of the contact block are registered for the frontend icon
registry of **academic_base** in
`Configuration/FrontendIcons.php` and rendered with `ab:icon`, the
icons of the content elements and of the job record stay backend icons in
[`Configuration/Icons.php`](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/FileStructure/Configuration/Icons.html#file-extension-configuration-icons-php). The old identifiers and the icon files of the
extension are removed. Replace the identifiers in templates, TCA, page TSconfig
and PHP code, register a replacement icon under its new identifier in the
matching file of a site package that depends on **academic_jobs**, and
adapt a stylesheet that selected the icon as an `<img>`. See
[Breaking: The job icons are renamed and moved to the frontend icons](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-jobs-job-icons-moved-to-the-frontend-icon-registry@3.0),
[Important: The job contact block shows its own icons](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-contact-block-shows-its-own-icons@3.0) and
[Replace the icon of a job property](https://docs.typo3.org/permalink/fgtclb/academic-jobs:templates-override-icons@3.0).

### 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 |
| --- | --- | --- |
| `Templates/Job/List.html`, `Templates/Job/Show.html`, `Templates/Job/New.html` | The header renders only with `settings.renderContentElementHeader`, and the templates carry speaking classes. | [Important: The job plugins leave the content element header to the layout](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-1790323400@3.0), [Classes and styles](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-classes@3.0) |
| `Templates/Job/List.html` | The list renders one page of the paginator while the pagination is enabled. A project that paginated the list itself removes its own switch. | [Feature: The job list can be paginated](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-1790660966@3.0) |
| `Templates/Job/Show.html` | The contact box renders only for a job with contact data. | [Important: The job headings and the contact box are corrected](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-316-academic-jobs@3.0) |
| `Templates/Job/New.html` | Loads the editor configuration as a module, only while `settings.assets.js` is set, and renders the new partial `Partials/Job/Forms/AdditionalFields.html`. | [The editor configuration](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-rich-text@3.0), [Feature: The scripts of the new job form can be switched off](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-1791566501@3.0), [Feature: Additional fields partial in new job form](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-new-job-form-additional-fields-partial@3.0) |
| `Templates/Job/New.html` | Renders the confirmation for a visitor who returns to the form, with `<f:flashMessages queueIdentifier="academic_jobs.new_job_form.confirmation" />`. A copy without this line shows no confirmation. | [Important: The job form returns to its page with the confirmation](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-form-returns-to-its-page@3.0), [Keep the confirmation in a copy of the form template](https://docs.typo3.org/permalink/fgtclb/academic-jobs:templates-override-new-job-form-confirmation@3.0) |
| `Partials/Job/Item.html` | The heading level is corrected, the flags and the link row are new, a hidden job is not linked, the image renders through the image partial of **academic_base**, and a list of properties maps each property to the name of its icon. | [Important: The job headings and the contact box are corrected](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-316-academic-jobs@3.0), [Important: Job views label flags and render the link](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-596-academic-jobs@3.0), [Important: The job detail answers "not found" without a job](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-detail-answers-not-found-without-a-job@3.0), [The job image](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-images@3.0), [Icons](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-icons@3.0) |
| `Partials/Job/Information.html` | The flags and the link row are new, and a list of properties maps each property to the name of its icon. | [Important: Job views label flags and render the link](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-596-academic-jobs@3.0) |
| `Partials/Job/Contact.html` | The heading level is corrected, the phone link is dialable, and the block renders its own phone and e-mail icons. | [Important: The job headings and the contact box are corrected](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-ace-316-academic-jobs@3.0), [Important: The job contact phone link is dialable](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-contact-phone-link-is-dialable@3.0), [Important: The job contact block shows its own icons](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-contact-block-shows-its-own-icons@3.0) |
| `Partials/Job/Header.html`, `Partials/Job/SectionHeader.html` | They take the class of the heading as `class` instead of `positionClass`. | [Classes and styles](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-classes@3.0) |
| `Partials/Job/Properties/Job.html` | A **Please choose** option for the two selects, the two job flags as checkboxes, and a select reads `disabled` from its element. | [Important: New job form offers an unchosen option](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-new-job-form-offers-an-unchosen-option@3.0), [Important: New job form offers the job flags](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-new-job-form-offers-the-job-flags@3.0), [Important: The new job form renders the shared form partials](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-new-job-form-fields-render-shared-partials@3.0) |
| `Partials/Job/Forms/*.html` | They render the shared form partials of **academic_base**, which mark rejected fields and show their message. The ViewHelpers `j:validation.requiredFromValidation` and `j:validation.fieldTypeFromValidation` are removed, a copy that calls them fails. It reads the validation with `validationEnsure` of **academic_base**. | [Important: The new job form marks rejected fields](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-new-job-form-marks-rejected-fields@3.0), [Adapt your code](https://docs.typo3.org/permalink/fgtclb/academic-jobs:upgrade-from-2-3-to-3-0-code@3.0), [Change the fields of the new job form](https://docs.typo3.org/permalink/fgtclb/academic-jobs:templates-override-form-fields@3.0) |

Every template and partial also passes the extension name
`AcademicJobs` to its translations, see
[Important: Label overrides are read from the documented path](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-label-overrides-use-the-documented-path@3.0).

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

-   A class that extends
    `\FGTCLB\AcademicJobs\Domain\Repository\JobRepository` and overrides
    `findByJobType()` adds the parameter
    `bool $includeHidden = false`. One that declares `findAllJobs()`
    or `findUidsWithHiddenDefaultRecord()` renames it. See
    [Breaking: Extended JobRepository method signatures](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-ace-250-academic-jobs@3.0).
-   A listener of `\FGTCLB\AcademicJobs\Event\AfterSaveJobEvent` that
    sets a redirect page of `0` or below now sends the visitor back to the
    form page, which shows the form and the confirmation, see
    [Important: A redirect page of 0 or below from a listener means none](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-redirect-page-zero-from-a-listener-means-none@3.0).
-   Code that reads the answer to a submitted job gets an empty `303` now,
    and a page that renders the messages of the form no longer gets the error
    message of Extbase after a rejected submission, see
    [Important: The job form returns to its page with the confirmation](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-form-returns-to-its-page@3.0).
-   A listener of
    `\FGTCLB\AcademicBase\Event\ModifyTcaSelectFieldItemsEvent` that
    changes the job types of the job record changes the option
    **Job Type** of the job list as well now. One meant for the record
    alone returns early when `flexParentDatabaseRow` is set, see
    [Important: Job list offers the job types of listeners](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-list-offers-the-job-types-of-listeners@3.0).
-   A listener of
    `\FGTCLB\AcademicJobs\Event\ModifyJobControllerNewActionViewEvent` is
    no longer called. It listens to
    `\FGTCLB\AcademicBase\Event\ModifyPluginViewEvent` instead and returns
    early for every other plugin, see
    [Breaking: The view event of the new job form is gone](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-removed-job-new-action-view-event@3.0),
    [Feature: The plugins dispatch the plugin view event](https://docs.typo3.org/permalink/fgtclb/academic-jobs:feature-plugin-view-event@3.0) and
    [ModifyPluginViewEvent](https://docs.typo3.org/permalink/fgtclb/academic-jobs:developers-event-modify-plugin-view-event@3.0).
-   PHP code that uses
    `\FGTCLB\AcademicJobs\Loader\AcademicJobsSettingsLoader`,
    `\FGTCLB\AcademicJobs\Registry\AcademicJobsSettingsRegistry` or the
    exceptions of `\FGTCLB\AcademicJobs\Exception` uses the settings
    classes of **academic_base**, see
    [Breaking: The validation settings classes of jobs were removed](https://docs.typo3.org/permalink/fgtclb/academic-jobs:breaking-job-validation-settings-classes-removed@3.0).
-   Code that names
    `\FGTCLB\AcademicJobs\SaveForm\FlashMessageCreationMode` imports
    `\FGTCLB\AcademicBase\Form\FlashMessageCreationMode`. The old name
    keeps working until version 4.0, see
    [Deprecation: FlashMessageCreationMode moved to EXT:academic_base](https://docs.typo3.org/permalink/fgtclb/academic-jobs:deprecation-flash-message-creation-mode-moved@3.0).
-   The FlexForm files moved from `Configuration/Flexforms/Core12/` and
    `Configuration/Flexforms/Core13/` to one file each in
    `Configuration/FlexForms/`. Own TCA that names a data structure of
    this extension by its path takes over the new one, see
    [Important: The FlexForm files moved to Configuration/FlexForms/](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-job-flexform-files-moved@3.0).

## 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-jobs:upgrade-from-2-3-to-3-0-upgrade-check@3.0).
-   The content elements **Job Form**, **Job List** and
    **Job Details**, as they are called now, are offered for new
    content on the pages that should have them, and existing ones keep their
    type. See [Important: Content elements have new titles and descriptions](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-content-element-titles-and-descriptions@3.0).
-   Jobs that were hidden, scheduled or expired when the contact wizard first
    ran show their contact.
-   The jobs the repair wizard listed carry a chosen employment type and job
    type.
-   The header of the job content elements appears once.
-   A job submitted through a form without a redirect page returns the
    visitor to the form, which shows the confirmation.
-   Saving a job in the backend keeps its contact phone number, and a job
    without a company name or a description can only be saved there once both
    are filled in, unless the settings make them optional.
-   A job submitted through the form reaches the editors. A notification mail
    that cannot be sent is logged instead of failing the form, so check the
    log after a change of the mail configuration, see
    [Important: A notification mail that cannot be sent no longer fails the form](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-failing-job-mail-is-logged@3.0).
-   Jobs submitted with 2.3 may share one logo file. The query in
    [Important: An uploaded job logo no longer replaces an existing file](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-uploaded-job-logo-keeps-existing-files@3.0) finds them. A logo
    uploaded now is stored with a random suffix to its file name, and a form
    shown again with errors asks for the logo once more, see
    [Important: Job image upload uses native Extbase upload handling](https://docs.typo3.org/permalink/fgtclb/academic-jobs:important-migrated-job-image-upload-to-native-extbase-file-upload-handling@3.0).
