TYPO3 v12 Upgrade - generelle Probleme

Beispiel BackendController auf Extbase-Basis:

https://github.com/svenpet90/instagram/blob/main/Classes/Controller/TokenGeneratorController.php

TYPO3_MODE gibt es nicht mehr, heißt jetzt einfach nur noch TYPO3.

Damit ist z.B. folgende Anweisung in ext_tables.php eher kontraproduktiv:

<?php  
defined('TYPO3_MODE') || die();

Hat man das noch drin, kommt nur noch eine weiße Seite.

Im Backend in z.B. Mask Templates gehen Konstrukte wie z.B.

{data_item.tx_mask_contact -> f:format.html()}

nicht mehr, dafür aber:

{data_item.tx_mask_contact -> f:sanitize.html()}

Weitere Tipps:

typo3/cms-recordlist aus composer.json entfernen, Updates gehen sonst nur 12.4.10 🤮

https://www.clickstorm.de/blog/typo3-12-entwickler/#Neue_Pfade_mit_dem_Composer_Installer_Version_5

Umstellung auf neue Composer Struktur:

Um das eigentliche Upgrade auf TYPO3 v12 zu erleichtern, könnt ihr die Verzeichnisstruktur bereits in TYPO3 v11 umstellen. Diese Vorgehensweise habe ich gewählt und kann sie euch nur ans Herz legen.

Diese beiden Befehle sind notwendig:

composer req typo3/cms-composer-installers:^4.0@rc
composer install

4.0@rc ist die einzige verfügbare Version, die in TYPO3 v11 für die neue Struktur sorgt. Nach Ausführung werden TYPO3 und alle TYPO3-Extensions in vendor/ installiert und Symlinks für öffentliche Extension-Dateien in _public/assets/ erstellt.
Die alten Verzeichnisse im public-Verzeichnis (typo3/sysext/ und typo3conf/ext/) müsst ihr manuell entfernen.

Äußerst hilfreich ist der Blogbeitrag von Chris Müller, in dem er die notwendigen Migrationen in TypoScript, CSS, Fluid & Co. beschrieben hat: https://brot.krue.ml/migration-typo3-composer-cms-installers-version-4/

StandaloneView:

#old
$this->standaloneView->getRequest()->setControllerExtensionName($extensionname);

#new
$this->standaloneView->getRenderingContext()->setControllerName($extensionname);

Auch zu beachten: Bei f:translate muss in einem StandaloneView der komplette Pfad zum Identifier mit angegeben werden, so z.B.:

LLL:EXT:your_extension/Resources/Private/Language/yourFile.xlf:yourKey

Extbase Mapping:

in Configuration/Extbase/Persistence/Classes.php:

<?php  
  
declare(strict_types=1);  
  
return [  
    \Vendor\NewsPersonalized\Domain\Model\News::class => [  
        'tableName' => 'tx_news_domain_model_news'  
    ]  
];

Extbase-Objekt holen ohne Repository:

#In Controller
private function getCategoryByUid($uid)  
{  
    /* @var $category \TYPO3\CMS\Extbase\Domain\Model\Category */  
    $category = $this->persistenceManager->getObjectByIdentifier($uid, Category::class);  
    return $category;  
  
}

ext_icon: Ab TYPO3 v12 nur noch SVG unter Resources/Public/Icons/Extension.svg.

Ckeditor im Backend:
How to use CKEditor in a TYPO3 backend module - A TechBlog by Torben Hansen

Extending an existing extbase backend module with a custom action in TYPO3 v12+ - A TechBlog by Torben Hansen

Ganz wichtig dazu, Backend-Templates werden in v12 in Configuration/page.tsconfig überschrieben:

# Pattern: templates."composer-name"."something-unique" = "overriding-extension-composer-name":"entry-path"  
templates.derhansen/sf_event_mgt.30 = derhansen/sf_event_mgt_vendor:Resources/Private

f:format.html in Mails oder Backend durch f:transform.html ersetzen

Entfessle deine Kraft: Update auf TYPO3 v12.4 LTS - clickstorm

CategoryRepository existiert nicht mehr: Deprecation: #94654 - Generic Extbase domain classes — TYPO3 Core Changelog main documentation

Extbase repository, constraints können nicht mehr als array übergeben werden, so geht es:

if (count($constraints) > 0) {  
    $query->matching(  
        $query->logicalAnd(  
            ...array_values([  
                $query->logicalAnd(...array_values($constraints)),  
                $query->logicalOr(...array_values($constraintsOr))  
            ])  
        ),  
    );  
}  
else {  
    $query->matching(  
        $query->logicalOr(...array_values($constraintsOr))  
    );  
}

Wie kann ich in einem ViewHelper oder Controller den absoluten Pfad eines Asset-Directory bekommen?

use TYPO3\CMS\Core\Utility\GeneralUtility;  
use TYPO3\CMS\Core\Utility\PathUtility;

$iconFolder = PathUtility::getAbsoluteWebPathgetFileAbsFileName('EXT:myext/Resources/Public/Images');

Ab v12 scheint für Autoloading eine Services.yaml Pflicht zu sein?

In extensionfolder/Configuration/Services.yaml:

services:  
  _defaults:  
    autowire: true  
    autoconfigure: true  
    public: false  
  
  VendorNamespace\ExtensionNamespace\:  
    resource: '../Classes/*'

switchableControllerActions aus Flexform haben keine Auswirkung mehr, Workaround oder auf verschiedene Plugins aufteilen:

TYPO3 12: switchableControllerActions wurden entfernt ° 99° Labor

Achtung: Über ExpressionsLanguage.php registrierte Conditions stören unter Umständen die Solr-Indizierung, CLI geht dann nicht, keine Connections vorhanden!!!

[BUG] Site exception in indexing task since update TYPO3 11.5.38 to 11.5.40 · Issue #4191 · TYPO3-Solr/ext-solr

Vorsicht bei Conditions auf locale, unter 12.4 nicht mehr lauffähig!

Lieber so etwas:

[siteLanguage("twoLetterIsoCode") === "en"]

Einige tiefergehende Probleme sind im Blog von Torben Hansen beschrieben:

Archive - A TechBlog by Torben Hansen

Extending an existing extbase backend module with a custom action in TYPO3 v12+ - A TechBlog by Torben Hansen

Sorting by UIDs with MySQL FIELD function in TYPO3 13.4+ using Doctrine DBAL 4 - A TechBlog by Torben Hansen

The pitfalls of reusing TYPO3 QueryBuilder: Analyzing a performance bottleneck - A TechBlog by Torben Hansen

How to use CKEditor in a TYPO3 backend module - A TechBlog by Torben Hansen

The significance of the PHP exif module in TYPO3 and why it should always be enabled - A TechBlog by Torben Hansen

Upgrade auf CKEditor 5 ist hier gut beschrieben:

Notizen zum Upgrade auf TYPO3 v12 | Sebastian Klein