TYPO3 12: switchableControllerActions wurden entfernt

Wieder ein Beitrag, für den uns die TYPO3 Core Entwickler hassen werden.

Jeder, der ein Update von TYPO3 auf die Version 12 machen möchte, stößt auf ein Problem mit Extensions, die im FlexForm die „schönen“ switchableControllerActions verwendet haben.

Kurz zur Erinnerung:
Statt für jede Darstellung ein eigenes Plugin in der eigenen TYPO3 Extension zu registieren, konnte man über die `<switchableControllerActions>` im FlexForm einfach zwischen verschiedenen Actions in einem Controller wechseln:

<switchableControllerActions> 
  <TCEforms>
    <label>Was soll dargestellt werden?</label>
    <config>
      <type>select</type>
      <renderType>selectSingle</renderType>
      <items>
        <numIndex index="0">
          <numIndex index="0">Boxen</numIndex>
          <numIndex index="1">Main->boxen</numIndex>
        </numIndex>
        <numIndex index="1">
          <numIndex index="0">Kacheln</numIndex>
          <numIndex index="1">Main->tiles</numIndex>
        </numIndex>
      </items>
    </config>
  </TCEforms> 
</switchableControllerActions> 

Aus Core-Entwickler-Sicht war das schon immer „unsauber“ und wiedersprach vielen Paradigmen. Aus Normalsterblicher-Entwicklersicht war das einfach nur praktisch. Es sparte ziemlich viel Code – vor allem aber schaffte es deutlich mehr Übersicht im Backend. Dort hatte der Redakteur dann beispielsweise einfach ein einzelnes „News-Plugin“, das zwischen verschiedenen Ansichten (Listen-Darstellung, Detail-Ansicht etc.) umgeschaltet werden konnte, statt für jede Ansicht ein neues Plugin auswählen und platzieren zu müssen.

Leider haben wir fast alle unsere Extensions bisher mit `switchableControllerActions` umgesetzt. Einfach weil das praktisch war. Und irgendwann auch mal die Empfehlung des TYPO3 Core-Teams. Das Update einer Webseite mit über 1.000 Seiten und dem Einsatz vieler PlugIns wird so zu einem Albtraum: Im Backend muss jedes Plugin neu angepackt oder ersetzt werden.

Workaround

Mit einem kleinen Trick ist es möglich, die `switchableControllerActions` zu migrieren – ohne die Fleißarbeit im Backend machen zu müssen.

Dazu wird zunächst die ext_localconf.php der Extension angepasst und alle Actions auf ein und dieselbe Methode switchable` gelenkt:

\nn\t3::Registry()->configurePlugin( 'Vendor\Myextname', 'pluginname', 
   [\Vendor\Myextname\Controller\MainController::class => 'switchable'],
   [\Vendor\Myextname\Controller\MainController::class => 'switchable']
);

Im Controller selbst wird dann einfach noch eine switchableAction eingefügt, die sich um die Weiterleitung auf die im FlexForm ausgewählt Methode kümmert:

<?php
namespace Vender\Myextname\Controller;

use TYPO3\CMS\Extbase\Http\ForwardResponse;

class MainController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
  public function switchableAction() 
  {
    // Wert für 'switchableControllerActions' aus flexForm holen
    $cObjData = \nn\t3::Tsfe()->cObjData( $this->request );
    $ffData = \nn\t3::FlexForm()->parse($cObjData['pi_flexform']);

    // ... und an passende Action weiterleiten
    $action = preg_replace('/[^>]*>(.*)/', '\1', $ffData['switchableControllerActions']);
    $methodName = "{$action}Action";

    if (!method_exists($this, $methodName)) {
      return $this->htmlResponse("PayloadController->{$methodName}() exisitert nicht.");
    }

    return new ForwardResponse( $action );
  }
  
  // ... hier sind die bisherigen Actions
}

„Echte“ Migration

Wer sauber und konform arbeiten möchte sollte sich zu diesem Thema auch mal diesen Blog-Beitrag bzw. das Script anschauen:

https://gist.github.com/derhansen/4524495ccfef9335c96d6d535bad7324