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]);
                }
        	}
		}
	}
}

Leave a Reply