At first: Always make a note of what you've changed so that you can repeat it later. This might look like Example Update Aus:sicht.

The basics

If you are upgrading from 7.6 or lower to 10.4 or 11.5, you need to upgrade to 8.x and 9.x first to get all the upgrade wizards you need. But there is an easier way with the ichhabrecht/core-upgrader extension (thanks to Nicole Cordes https://github.com/IchHabRecht/core_upgrader).

This extension will help you upgrade to 10.4 immediately. Unfortunately there is no version for 11.5 yet, so there is one more step needed to go to 11.5.

Here is the way to do it:

  1. Setup a new blank TYPO3 10.4
  2. Add to composer.json:
    composer require ichhabrecht/core-upgrader 1.3.*
  3. Install the extension:
    vendor/bin/typo3cms install:generatepackagestates
  4. Dump the old database and insert into the new one
  5. Run the extension upgrade wizard:
    vendor/bin/typo3cms coreupgrader:upgrade
  6. Run the core upgrade wizard afterwards to be save:
    vendor/bin/typo3cms upgrade:run all
  7. Change all packages in composer.json to version 11.5.* and change extension versions if needed as well and:
    composer update
    Tip: save composer.json beforehand as composer10.json to do the same on stage and live again
  8. Run the core upgrade wizard for this:
    vendor/bin/typo3cms upgrade:prepare
    vendor/bin/typo3cms upgrade:run all
  9. Clear the cache:
    vendor/bin/typo3cms cache:flush

Config extension changes

Automated updates

When the backend comes back up and the page tree loads, you can proceed with updating your template extension and other extensions. Have a look at Update code with rector. And even more optimisations: Check for PSR-12.

Sort your files

Move the TypoSript code and the backend templates from the backend to your config extension.

If you have any code in ext_tables.php, you will also need to move it to Configuration/TCA/Overrides/[tablename].php. See https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/ConfigurationFiles/Index.html for more information.

Add custom fluid templates for content elements

In the past, content elements were created using pure TypoScript. With Fluid there is now the lib.contentElement to render in Fluid files. Now we have two options: Rebuild the TypoScript code for each element in fluid, or make the TypoScript work again with some small changes.

Here I will describe the second option:

Define custom paths

lib.contentElement {
    templateRootPaths {
        10 = EXT:zwbisdrei_config/Resources/Private/Plugins/Content/Templates/
    }
    layoutRootPaths {
        10 = EXT:zwbisdrei_config/Resources/Private/Plugins/Content/Layouts/
    }
    partialRootPaths {
        10 = EXT:zwbisdrei_config/Resources/Private/Plugins/Content/Partials/
    }
}

Add template StdHeader.html

<html xmlns:f="http://typo3.org/ns/TYPO3/Fluid/ViewHelpers"
          data-namespace-typo3-fluid="true">

<f:render partial="Header/All" arguments="{_all}" />

</html>

Change from

tt_content.textpic.10 < lib.stdheader
tt_content.textpic.20 >
tt_content.textpic.20 = CASE
tt_content.textpic.20.key.field = imageorient

tt_content.textpic.20.18 = COA
tt_content.textpic.20.18 {
	# render content element
}

to

lib.stdheader < lib.contentElement
lib.stdheader.templateName = StdHeader

tt_content.textpic = COA
tt_content.textpic {
    10 < lib.stdheader
    20 = CASE
    20.key.field = imageorient
    20.18 = COA
    20.18 {
		# render content element
  	}
}

Some more fun things to do

Cleanup

For large systems it may be useful to truncate and remove tables before the update steps. This will reduce the database update time considerably.

After all that effort: Keep your installation clean.

Remove old TypoScript

These lines can be removed:

config {
	# is now defined in sites config
	doctype = html5
	doctypeSwitch = 1
	metaCharset = UTF-8
	linkVars = L
	sys_language_mode = content_fallback
	sys_language_uid = 0
    language = de
    locale_all = de_DE.utf8

	# old extensions not used anymore
	simulateStaticDocuments = 0
	tx_realurl_enable = 1
}

Problems you may have

Install tool not found (404)

Check that installToolPassword exists and is not empty in LocalConfiguration.php.

Page tree error

Fluid templates not found

Change paths from old:
layoutRootPath
templateRootPath
partialRootPath

to new:
layoutRootPaths.10
templateRootPaths.10
partialRootPaths.10

No images found

On very old installations, images such as logo, CSS and JavaScript may not yet be included in the config extension. Move these from /images or /external to Resources/Public/[Css|JavaScript|Images].

404 - no slugs

If slugs are missing from the page settings, you can use the ig_slugs extension to rebuild them:

composer req internetgalerie/ig-slug

database:updateschema failed

# Fix for error message: Data truncated for column 'media' at row 2 (tt_content)
UPDATE `tt_content` SET media=0 WHERE media IS NULL;

# Fix for error message: Data truncated for column 'image' at row 2 (tt_content)
UPDATE `tt_content` SET image=0 WHERE image IS NULL;

# Fix for error message: Data truncated for column 'media' at row 2 (pages)
UPDATE `pages` SET media=0 WHERE media IS NULL;