At first: Always make notes of what you've changed so you can repeat it at any time. This could look like Example Update Aus:sicht.

Basics

When updating fom 7.6 or even lower to 10.4 or 11.5 you have to update to 8.x and 9.x first to fetch all of upgrade wizards needed. But there is an easier way to do with the extension ichhabrecht/core-upgrader (thanks to Nicole Cordes https://github.com/IchHabRecht/core_upgrader).

This extension helps to upgrade to 10.4 right away. 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 go:

  1. Setup a new blank TYPO3 10.4
  2. Add to composer.json:
    composer require ichhabrecht/core-upgrader 1.3.*
  3. Install extension:
    vendor/bin/typo3cms install:generatepackagestates
  4. Dump the old database and insert into the new one
  5. Run the extensions upgrade wizard:
    vendor/bin/typo3cms coreupgrader:upgrade
  6. Run 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 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 up again and the page tree loads you can go on with updating your template extension and further extensions. For this have a look at: Update code with rector. And even more optimisation: Check for PSR-12.

Sort your files

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

If you have some code in ext_tables.php you also have to move to Configuration/TCA/Overrides/[tablename].php. For more information have a look at https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/ConfigurationFiles/Index.html.

Add custom fluid templates for content elements

In the past, content elements were built with pure TypoScript. With fluid there ist now the lib.contentElement to render in fluid files. Now we have two options: Rebuild the TypoScript code for each element in fluid or get the TypoScript working again with some little changes.

Here I describe the second variant:

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"
      f:schemaLocation="https://fluidtypo3.org/schemas/vhs-master.xsd"
      xmlns="http://www.w3.org/1999/xhtml"
      lang="en"
      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 nice things to do

Cleaning

For big systems it could be usefull to truncate and remove table before the updating steps. This reduces the database updating time quite a lot.

After all this 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 if installToolPassword is present and 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

Images are not found

In very old installations sometimes images like logo, CSS and JavaScript is not included in config extension yet. Move this from /images or /external to Resources/Public/[Css|JavaScript|Images].

404 - no slugs

If slugs are missing in page settings you can use the ig_slugs extension to rebuild:

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;