Michael P. Mit config.contentObjectExceptionHandler = 0
wird zwar der blockierende Fehlerbildschirm unterdrückt aber nicht die eigentliche Ursache des Problems behoben.
Die Warnung "Undefined array key" ist typisch für PHP 8. Diese tritt immer dann ein, wenn auf einen Array-Schlüsel zugegriffen wird, der nie definiert wurde.
Beispiel:
# Definition eines Arrays mit den Schlüsseln "hello" und "world"
$array = ['hello' => 'abc', 'world' => 'xyz'];
# Warning: Undefined array key "test" → Der Schlüssel "test" existiert nicht
echo $array['test'];
Sehen wir uns nun den betroffenen Code-Abschnitt (Zeile 1174-1177) im TYPO3 Core (v11.5.33) an:
if (!is_array($this->mconf['NO.'] ?? null) && $this->mconf['NO']) {
// Setting a blank array if NO=1 and there are no properties.
$this->mconf['NO.'] = [];
}
Die PHP Warnung nimm Bezug auf den Schlüssel "NO" (ohne Punkt). Dementsprechend löst in Zeile 1174 der Abschnitt $this->mconf['NO']
den Fehler aus. Es stellt sich also die Frage weshalb das Array $this->mconf
in deinem Fall den Schlüssel "NO" nicht enthält. Ich habe versucht das Problem in TypoScript nachzustellen und konnte es nur dann auslösen, wenn der "TMENU"-Block komplett ohne "NO"-Item definiert wurde.
page.1 = COA
page.1 {
10 = HMENU
10.special = directory
10.special.value = 1
10.1 = TMENU
10.1 {
wrap = |
expAll = 1
expAll.value = 1
}
}
→ Fehler wird ausgelöst
Wenn ich NO = 1
ergänze greift der Fehler nichtmehr:
page.1 = COA
page.1 {
10 = HMENU
10.special = directory
10.special.value = 1
10.1 = TMENU
10.1 {
wrap = |
expAll = 1
expAll.value = 1
NO = 1
}
}
Wenn ich den NO
-Block ohne NO = 1
ergänze greift der Fehler ebenfalls nicht:
page.1 = COA
page.1 {
10 = HMENU
10.special = directory
10.special.value = 1
10.1 = TMENU
10.1 {
wrap = |
expAll = 1
expAll.value = 1
NO {
stdWrap.htmlSpecialChars = 0
allWrap = <li>|</li>
}
}
}
Der Array-Schlüssel "NO" ist also immer dann vorhanden, wenn eine der beiden Schreibweisen verwendet wurde.
Nun stellt sich die Frage weshalb der Array-Schlüssel "NO" in deinem Fall nicht existiert, obwohl du einen NO
-Block und sogar NO = 1
im TypoScript verwendest.
Ich vermute, dass dein Fokus aktuell auf dem falschen TMENU
liegt. In deinem o. g. Code fehlte zwar eine schließende Klammer aber ansonsten funktioniert er bei mir 1:1 ohne PHP Warnung. Gibt es denn noch andere TMENU
-Definitionen in deinem TypoScript in welchen ggfls. eine Angabe von NO
gänzlich fehlt?
Da du keinen numerischen Wert sondern MENUMAIN
nutzt erinnert mich dein Code an die alte Marker-basierte Schreibweise, die es in TYPO3 11.5 nichtmehr gibt. Hier fehlt mir noch der TypoScript-Kontext. Steht das so in einem lib
-Objekt oder handelt es sich wirklich noch um ein Marker-Template? Für meinen Test habe ich jedenfalls dein Menü direkt im PAGE
-Objekt unter einem numerischen Key platziert.
Wenn du der Sache weiter auf den Grund gehen magst empfielt es sich ggfls. auch mal eine Debug-Ausgabe im betroffenen Core-File zu machen. also direkt in der Zeile vor 1174 folgendes hinein schreiben:
if(!array_key_exists('NO', $this->mconf)){
\TYPO3\CMS\Core\Utility\DebugUtility::debug($this->mconf);
}
Damit sagst du, dass die Menükonfiguration ausgegeben werden soll, wenn der Array-Schlüssel "NO" nicht existiert. Evtl. siehst du dann anhand des übrigen Konfigurations-Kontextes welches deiner Menüs die Fehlerquelle ist.
Am Ende könnte man auch darüber nachdenken ob der Core gepatcht werden, also ein Issue auf Forge geschrieben werden sollte. Schließlich ist es ja denkbar, dass in TypoScript mal jegliche Angabe von NO
fehlt. Ich wäre der Meinung, dass so ein Fall vom Core ohne Warnung abgefangen werden sollte. Mit den folgenden Zeilen im Core vor der Bedingung wäre das ja leicht machbar:
if(!array_key_exists('NO', $this->mconf)){
$this->mconf['NO'] = 1;
}
Also wenn der Schlüsel nicht existiert, dann setze ihn. Schon hätte man ein funktionierendes Menü ohne jegliche Angabe von NO
.
Ich hoffe ich konnte dir mit den Infos schon mal weiter helfen.