Zum Inhalt springen

Manuell Funktion zum Generieren von Objekten aus Formulardaten aufrufen?

Erstellt am 11. Oktober 2011 · 4 Antworten · letzte Antwort am 12. Oktober 2011

Tags: Frage

mad_eye ·

Hallo,

wenn ich in einem Fluid Formular ein Objekt hinterlege, das anhand der Formulardaten generiert werden soll, wandelt Extbase beim abschicken die Formularwerte ja ganz automatisch in ein solches Objekt um. Aus bestimmten Gründen gebe ich kein konkretes Objekt an, sondern lasse die eingetragenen Formular-Werte als Array an die annehmende Action weitergeben. Die Frage ist nun: Gibt es eine Möglichkeit, auch manuell auf die Funktion zuzugreifen, die sonst automatisch aus dem Array ein Objekt macht? Weiß jemand den Namen der Funktion die hier benötigt wird oder ist das ganze nicht so einfach?

Ich habe auch versucht, selbst anhand des Arrays ein Objekt anzulegen, was auch soweit ganz gut funktioniert, es sei denn das Objekt besitzt ein oder mehrere Attribute, die ihrerseits Objekte eines Models sein müssen. Dann funktioniert der folgende Code nicht mehr, weil das Formular keine ganzen Objekte, sondern nur uid-Werte übergibt. Wenn es eine Funktion gibt, die anhand der uid-Werte schon automatisch die korrekten Objekte ermittelt sofern das nötig sein sollte, wäre das eine deutliche Arbeitserleichterung.

<?php
	/**
	 * Creates a new User 
	 *
	 * @param array $formValues
	 * @dontvalidate $formValues
	 * @return void
	 */
	public function createAction($formValues) {

		$newUser = new Tx_myExtension_Domain_Model_User();

		foreach($formValues as $key=>$value) {
			$method = 'set'.ucfirst($key);
			if (method_exists($newUser,$method)===true) {
				call_user_func(array($newUser, $method), $value);
			}
		}

	}
?>

Hat irgendjemand eine Idee?

Viele Grüße

freshman17 ·

Für das Mappen ist diese Klasse zuständig:

Tx_Extbase_Persistence_Mapper_DataMapper

schaue dir dort folgende Methode an:

public function map($className, array $rows)
mad_eye ·

Danke für die Antwort. Allerdings wirft TYPO3 immer einen fatal Error wenn ich die map-Funktion mit dem Formular-Array als Argument übergebe. Darüber hinaus scheint die Funktion beispielsweise nicht aufgerufen werden wenn ich das ganze mit einer Blog-Extension teste, bei der die Annehmende Action ein konkretes Objekt erwartet. Ich denke die map-Funktion ist dazu da, aus Db-Query-Results die entsprechenden Objekte zu basteln, um aus den Formulardaten ein Objekt zu machen scheint eine andere Funktion eingesetzt zu werden. Aber wie wird aus den Formulardaten ein Objekt wenn ich z.B. folgende Action habe:

<?php
public function createAction(Tx_Simpleblog_Domain_Model_Blog $blog) {
 ...
}
?>

Irgendeine Funktion muss es doch geben die aus den POST-Daten des Formulars ein Objekt der Klasse Tx_Simpleblog_Domain_Model_Blog macht?

freshman17 ·

dann musst du debuggen, angefangen im

Tx_Extbase_MVC_Controller_AbstractController

in der Eigenschaft

/**
 * @var Tx_Extbase_Property_Mapper
 */
protected $propertyMapper;

.
Wäre nett wenn du dann deine Lösung posten würdest 😉

freshman17 ·

aber mal eine andere Frage, was passiert wenn du deine Action so deklarierst:

/**
 * Creates a new User 
 *
 * @param Tx_myExtension_Domain_Model_User $formValues
 * @dontvalidate $formValues
 * @return void
 */
public function createAction(Tx_myExtension_Domain_Model_User $formValues)

Das Framework sollte doch schon von alleine versuchen den Mappingprozess zu starten. Falls es nicht klappen sollte dann liegt es am Format der POST/GET-Daten ggf. sollte dieses angepasst werden.