Wenn man eingene Plugins implementiert und dabei mit Flexforms arbeitet, kann man bei einem eingesetzen Plugin im Backend nicht erkennen, welche Einstellungen im Flexform vorgenommen wurden. Es gibt in TYPO3 einen Hook, der es ermöglicht, sich in die Backend-Ansicht einzuklinken und diese Einstellungen dort auszugeben. Und so wird das implementiert:
Als erstes muss man den Hook registrieren in ext_localconf.php der eigenen Extension. Der Name der Klasse ist egal. Unter $pluginSignature
gibt man den Namen des Plugin an, so wie man ihn registriert hat.
if (TYPO3_MODE === 'BE') { // Page module hook - show flexform settings in page module $extensionName = \TYPO3\CMS\Core\Utility\GeneralUtility::underscoredToUpperCamelCase($_EXTKEY); $pluginSignature = strtolower($extensionName) . '_pi'; $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['list_type_Info'][$pluginSignature][$_EXTKEY] = 'My\Extension\Hook\CmsLayout->getExtensionSummary'; }
Dann erstellt man die entsprechende Klasse. In meinem Fall die Klasse CmsLayout im Ordner Classes/Hook. Diese Klasse muss die Funktion getExtensionSummary
haben, die als Parameter ein Array übergeben bekommt. Die Funktion gibt einen String zurück, der dann im Backend als Plugin-Zusammenfassung ausgegeben wird.
Dabei ist zu beachten, dass der Hook für alle Plugins aufgerufen wird, d.h. man muss selbst rausfinden, ob man sich in seinem Plugin befindet oder nicht.
Bei mir hat sich mittlerweile dieser Klassenaufbau etabliert:
namespace My\Extension\Hook; class CmsLayout { public function getExtensionSummary(array $params) { $result = null; if (strpos($params['row']['list_type'], 'myextension_') !== FALSE) { $pluginName = str_replace('myextension_', '', $params['row']['list_type']); if ($params['row']['pi_flexform'] != '') { $this->flexformData = \TYPO3\CMS\Core\Utility\GeneralUtility::xml2array($params['row']['pi_flexform']); } $methodName = 'bePreview' . ucfirst(GeneralUtility::underscoredToLowerCamelCase($pluginName)); if (method_exists($this, $methodName)) { $result = $this->$methodName($params['row']); } } return $result; } protected function getFieldFromFlexform($key, $sheet = 'sDEF') { $flexform = $this->flexformData; if (isset($flexform['data'])) { $flexform = $flexform['data']; if (is_array($flexform) && is_array($flexform[$sheet]) && is_array($flexform[$sheet]['lDEF']) && is_array($flexform[$sheet]['lDEF'][$key]) && isset($flexform[$sheet]['lDEF'][$key]['vDEF']) ) { return $flexform[$sheet]['lDEF'][$key]['vDEF']; } } return NULL; } protected function bePreviewPi($row) { // whatever return ''; } }
In der Funktion getExtensionSummary
werden die Flexform-Daten geparst, falls es sich um eines meiner Plugins handelt. Dann wird die Preview-Funktion aufgerufen, falls sie existiert. Damit spare ich mir if- oder switch-Abfragen.
Hinweis 8.5.: Ich habe mitbekommen, dass sich die Flexform-Definition in der TYPO3 Version 8 geändert hat. d.h. es müssten entsprechend Anpassungen an diesem Code vorgenommen werden.
Danke für deinen Blogpost. Als Alternative zu GeneralUtility:xml2array() kann man auch die Extbase-Klasse FlexFormService nutzen. Zur Umwandlung des Strings aus der DB also:
$flexFormService = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Service\FlexFormService:class);
$settings = $flexFormService->convertFlexFormContentToArray($xmlString);