Ein nerviger Bug, gerade für diejenigen, die gerade mit dem lib/div-Framework starten wollen, ist, dass das Framework bei der Auswertung der Konfiguration immer auf die Daten der FlexForm zurückgreift. Dies erscheint im ersten Augenblick auch sinnvoll – allerdings nicht mehr, wenn sich im entspechenden Feld kein Inhalt befindet.

Folgender Ausgangspunkt sei gegeben:

Man möchte dem Nutzer die Möglichkeit geben, dass er bestimmte Einstellungen sowohl im TypoScript als auch im FlexForm-Formular machen kann. Zum Beispiel die Eingabe einer Breite. Dies würde für die flexform-XML ungefähr diesen Code bedeuten:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<T3DataStructure>
	<meta>
		<langDisable>1</langDisable>
	</meta>
	<sheets>
<configurationsSheet>
			<ROOT>
				<TCEforms>
					<sheetTitle>LLL:EXT:my_extension/locallang_db.xml:configSheet</sheetTitle>
				</TCEforms>
				<type>array</type>
				<el>
<width>
						<TCEforms>
							<label>LLL:EXT:my_extension/locallang_db.xml:tx_my_extension_fedata.width</label>
							<config>
								<type>text</type>
								<cols>30</cols>
								<rows>1</rows>
							</config>
						</TCEforms>
					</width>
</el>
			</ROOT>
		</configurationsSheet>
</sheets>
</T3DataStructure>

Befindet sich in der setup.txt-Datei ebenfalls eine Konfigurationseigenschaft mit dem Namen width, so würde dieser Wert durch das lib/div-Framework immer überschrieben werden – selbst dann, wenn in der Flexform, das Feld leer gelassen würde.

plugin.tx_my_extension.configuration {
width = 800
}

Um dieses Verhalten zu umgehen muss die Funktion

public function setFlexFormConfiguration($xmlOrArray)

überschrieben werden.
Für die Extension benötigt ihr demnach eine Configurations-Klasse, die von tx_lib_configurations erbt. Dies kann so aussehen:

tx_div::load('tx_lib_configurations');
 
class tx_my_extension_configurations extends tx_lib_configurations {
	private $setupPath = 'plugin.tx_my_extension_configurations.';
}

In der default-Controller-Klasse muss eure Configurations-Klasse natürlich angegeben sein.

class tx_my_extension_controller_default extends tx_lib_controller {
	private $extKey = "my_extension";
	public $configurationsClassName = 'tx_my_extension_configurations';

Im nächsten Schritt ist die bereits oben erwähnte Funktion setFlexFormConfiguration mit foldendem Code zu überschreiben.

public function setFlexFormConfiguration($xmlOrArray) {
		$languagePointer = 'lDEF'; // we don't support languages here for now
		$valuePointer = 'vDEF'; // also hardcoded here
		if (!$xmlOrArray) {
			return false;
		}
		// Converting flexform data into array if neccessary
		if (is_array($xmlOrArray)) {
			$array = $xmlOrArray;
		} else {
			$array = t3lib_div::xml2array($xmlOrArray);
		}
		$data = $array['data'];
		//
		foreach((array) $data as $sheet => $languages) {
        	foreach((array) $languages[$languagePointer] as $key => $def) {
                // just use ff value if something was entered
                if ($def[$valuePointer] != '') {
                        $this->set($key, $def[$valuePointer]);
                }
        	}
		}
	}

Bis auf

 // just use flexform value if it's not empty
                if ($def[$valuePointer] != '') {
                        $this->set($key, $def[$valuePointer]);
                }

ist die Funktion aus der Super-Klasse tx_lib_configurations kopiert worden. Durch den obigen Code wird der FlexForm-Wert nur genommen, wenn auch etwas eingetragen wurde. Diese Logik erscheint mir sinnvoller als das Vorgehen des Frameworks vor der Korrektur.
Zu guter Letzt tragt ihr die überschriebene Funktion in euere Configurations-Klasse ein, so dass diese nun so aussehen sollte.

class tx_my_extension_configurations extends tx_lib_configurations {
	private $setupPath = 'plugin.tx_my_extension_configurations.';
 
public function setFlexFormConfiguration($xmlOrArray) {
		$languagePointer = 'lDEF'; // we don't support languages here for now
		$valuePointer = 'vDEF'; // also hardcoded here
		if (!$xmlOrArray) {
			return false;
		}
		// Converting flexform data into array if neccessary
		if (is_array($xmlOrArray)) {
			$array = $xmlOrArray;
		} else {
			$array = t3lib_div::xml2array($xmlOrArray);
		}
		$data = $array['data'];
		//
		foreach((array) $data as $sheet => $languages) {
        	foreach((array) $languages[$languagePointer] as $key => $def) {
                // just use ff value if something was entered
                if ($def[$valuePointer] != '') {
                        $this->set($key, $def[$valuePointer]);
                }
        	}
		}
	}
}

Die Extension “Flash 2 TYPO3″ ist fertig!
Lange Zeit hat es keinen Post gegeben, da ich neben der Programmierung auch noch den schriftlichen Teil der Arbeit schreiben musste. Jetzt kann ich aber doch ein wenig Stolz verkünden, dass die Extension im Alpha-Status ist und produktiv eingesetzt wird.
Kurz zu den Randdaten:
Die Extension sorgt mit Hilfe von Flexiblen Content Elementen von TYPO3 dafür, dass ihr eure gemappte XML mit den Daten der gewählten FCE’s neu generiert bekommt. Das heißt in der Schlussfolgerung, dass ihr mit Hilfe der Extension “Flash 2 TYPO3″ (mwflash2t3) eure Flash-Module und/oder Flash-Seiten verwalten könnt.

Zu finden ist die Extension im Repository unter http://typo3.org/extensions/repository/view/mwflash2t3/current/. Die Dokumentation enthält ein Schritt-für-Schritt-Tutorial, um die Funktionsweise nachzuvollziehen. Darüber hinaus ist die Extension sehr flexibel aufgebaut und kann sowohl per Flexform als auch per TypoScript konfiguriert werden.
Sie basiert im Fronten-Plugin auf lib/div und wird so hoffentlich gut in die nächsten Generationen von TYPO3 integrierbar sein.
Ein Beispiel bietet die Website http://typo3fl.webseiten.cc/. Sie ist eine Full-Flash-Site und wird über meine Extension und TYPO3 verwaltet.

Für Fragen und Antworten zur Extension steht die Kommentarfunktion zu Verfügung. Ich würde mich über Verbesserungen, gewünschte Features in der nächsten Version, Lob, Kritik und vieles mehr freuen. Ich denke, mit dieser Extension ist ein Anfang für die Zusammenarbeit und die Verwaltung von TYPO3 und Flash getan.

Hier findet ihr die Dokumenation als PDF. Mir vielen Screenshots und Tutorial. mwflash2t3-Dokumentation

Wenn ich die Programmierung aufgearbeitet habe, werde ich einige kleine Tutorials zur Extension-Programmierung hier bereit stellen. Bis dahin…