Zum Inhalt springen

form.select Werte werden nicht gespeichert?

Erstellt am 8. Dezember 2010 · 8 Antworten · letzte Antwort am 21. Januar 2011

Tags: Fluid, ViewHelper, Frage

typonewbe ·

Hallo,

ich arbeite gerade an einer Extension auf Basis von Extbase/FLuid.

Genau gesagt eine Geräteverwaltung.

Ich habe dafür eine Tabelle Device und eine Tabelle Devicetype
in der Tabelle Devicetype werden die unterschiedlichen Gerätetypen gespeichert (Drucker, Scanner, Plotter, etc.)

Jetzt möchte ich das im Edit View des Devices die Devicetypes als Selectbox angezeigt werden. Dies habe ich geschafft leider passiert beim Update des Devices etwas merkwürdiges wärend alle anderen Werte gespeichert werden passiert bei dem Devicetype garnix ich bekomme die Message das das Device geupdatet wurde das wars.
Wenn ich mir den Devicetype ansehe steht der selbe Wert wie vorher drin.

Eventuell kann mir einer von euch sagen wo mein Denkfehler liegt.

Daher Poste ich hier die Betrefenden Stellen mal.

Edit und Update Action des DeviceControllers

public function updateAction(Tx_MyExt_Domain_Model_Device $device) {
		$this->deviceRepository->update($device);
		$this->flashMessageContainer->add('Your Device was updated.');
		$this->redirect('index');
	}

public function editAction(Tx_MyExt_Domain_Model_Device $device) {
		$devicetypes = $this->devicetypeRepository->findAll();
		$this->view->assign('devicetypes', $devicetypes);
		$this->view->assign('device', $device);
	}

Der EditView des Devices

<f:form method="post" action="update" name="device" object="{device}">
<f:for each="{device.devicetype}" as="devicetype" >		
	<f:form.select property="devicetype" options="{devicetypes}" optionLabelField="name" optionValueField="uid" value="{devicetype.uid}" size="1" />
</f:for>
</f:form>

soweit alles gut es wird folgender htmlcode generiert

<form method="post" name="device" action="index.php?id=5&tx_myext_pi1[action]=update&tx_myext_pi1[controller]=Device&cHash=abcdee1b5478c149">
<select size="1" name="tx_myext_pi1[device][devicetype]">
<option value="1">Scanner</option>
<option value="2" selected="selected">Drucker</option>
</select>
...
</form>

Nach meiner Theorie sollte beim Absenden des Formulares der Value übergeben werden was er laut Http LiveHeaders auch tut, allerdings wird der Wert nicht gespeichert.

Meine Vermutung da im Device Model der devicetype als PersistensObject definiert, aber eine Zahl übergeben wird. Nur weiß ich gerade nicht wie ich statt der Zahl das Object bekomme bzw. übergebe.

Ausschnitt DeviceModel

/**
* devicetype
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Devicetype> $devicetype
*/
protected $devicetype;


/**
* Setter for devicetype
*
* @param Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Devicetype> $devicetype
* @return void
*/
public function setDevicetype(Tx_Extbase_Persistence_ObjectStorage $devicetype) {
	$this->devicetype = $devicetype;
}

/**
* Getter for Devicetype
*
* @return Tx_Extbase_Persistence_ObjectStorage<Tx_MyExt_Domain_Model_Devicetype> devicetype
*/
public function getDevicetype() {
	return $this->devicetype;
}

Eventuell hat ja jemand von euch eine Idee.

Danke schon mal im Voraus

Gruß typonewbe

rlp_immigrant ·

Hi,

ich habe deine Anforderung nicht genau verstanden:

typonewbe schrieb

Jetzt möchte ich das im Edit View des Devices die Devicetypes als Selectbox angezeigt werden.

Also für jede Device eine eigene Ansicht in der es eine Selectbox mit den verschiedenen Devicetypen gibt?

Wenn das deine Anforderung ist, dann hast du einen Fehler im Edit View

typonewbe schrieb

Der EditView des Devices

<f:form method="post" action="update" name="device" object="{device}">
<f:for each="{device.devicetype}" as="devicetype" >		
	<f:form.select property="devicetype" options="{devicetypes}" optionLabelField="name" optionValueField="uid" value="{devicetype.uid}" size="1" />
</f:for>
</f:form>

Den For View Helper brauchst du nicht.

<f:form method="post" action="update" name="device" object="{device}">
	
<f:form.select property="devicetype" options="{devicetypes}" optionLabelField="name" optionValueField="uid"  multiple="multiple" />

</f:form>

Das müsste nach meinem Verständnis so in etwa funktionieren. Ist aber ungetestet.
Ich habe muliple gesetzt da du im Model den devicetype als storageObject definiert hast. Wenn nur einen Devicetyp zuweisbar sein soll, solltest du auch dein Modell anpassen.

Ich hoffe es hilft...

Grüße
Alex

typonewbe ·

Hallo rlp_immigrant,

vielen Dank für deine Antwort.

Das mit dem multiple="multiple" hat geholfen, wenn ich das setze kann ich den Devicetype selectieren und er wird korrekt gespeichert, allerdings wie du richtig vermutet hast soll die Selectbox nicht multiple sein den es soll nur ein Wert auswählbar sein.

Genau an dieser Stelle habe ich Verständnisschwierigkeiten warum funktioniert das multiple aber sobald ich daraus wieder ein Single mache wird weder der schon eingestellte Wert als selected markiert noch lässt sich der Ausgewählte Devicetype speichern.

Da ich mich auch erst in Extbase einarbeite habe ich die Extension natürlich über den Extbase Kickstarter erstellt.

Und dieser hat für den Devicetype im Device Model objectStorage festgelegt.

Ich verstehe nur nicht woran da das Problem liegen soll zumal es ja egal sein sollte ob ich nun 1 Object oder 10 auswähle und speichere.

Wie sollte ich den deiner Meinung nach das Model ändern in ein integer in der dann nur die uid gespeichert wird?

Witzigerweise ist ja im sql File die Spalte devicetype ein int(11) daher wird ja so oder so nur die uid gespeichert.

Hmm glaub da muss ich noch etwas lesen.

Danke nochmal.

Gruß typonewbe

rlp_immigrant ·
typonewbe schrieb

Das mit dem multiple="multiple" hat geholfen, wenn ich das setze kann ich den Devicetype selectieren und er wird korrekt gespeichert, allerdings wie du richtig vermutet hast soll die Selectbox nicht multiple sein den es soll nur ein Wert auswählbar sein.

Bist du dir sicher dass es genauso, nur ohne multiple nicht geht? Ich meine ich hätte das schon mal genauso umgesetzt und hätte eher gedacht das es am for Viewhelper lag. Andererseits macht es ja schon etwas Sinn. Im Model hast du den Devicetype als Objectstorage definiert. Somit können mehrere Objekte als Devicetype gespeichert werden, also eine 1:N Beziehung. Wenn es aber nur einen Devicetype geben soll brauchst du eine 1:1 Beziehung.
Da man eine 1:1 Beziehung aber auch in einem 1:N Modell darstellen kann, müsste es auch ohne Multiple gehen.

Grüße
Alex

typonewbe ·

Hi,

jepp ohne multiple geht gar nichts.

Muss mal sehen vielleicht ist es am besten ich speichere das $device Objekt irgendwohin bevor ich

$this->deviceRepository->update($device);

ausführe.

Aktuell sieht mein Edit View so aus:

<f:form method="post" action="update" name="device" object="{device}" arguments="{devicetype : devicetype}">
<f:form.select property="devicetype" options="{devicetypes}" optionLabelField="name" optionValueField="uid"  multiple="multiple" />
</f:form>

Wie gesagt ohne multiple geht es leider nicht mehr.

Ich werde mir morgen mal den ViewHelper Select ansehen eventuell gibt der aufschlüsse darüber. Dann werd ich das Objekt mal in eine Datei schreiben und sehen was da so drin steht.

Gruß walze26

rlp_immigrant ·

Schmeiß mal bitte das Attribut Arguments im Form ViewHelper raus. Du brauchst ja keine zusätzlichen Argumente. Ich denke dass könnte es sein

Grüße
Alex

typonewbe ·

Hi,

ne wars leider nicht. Hast erstmal recht wurde nicht benötigt.

Vermutung:
Bei multiple so

<select name="tx_myext_pi1[device][devicetype][]">

Bei Single so

<select name="tx_myext_pi1[device][devicetype]">

Einmal ist es ein array einmal normaler value und ich gehe stark davon aus, dass hier das Problem liegt.
Da im normalen select schon das selected="selected" nicht gesetzt wird haperts wohl schon an der Übergabe an den select viewhelper.

Das wird mein nächster Ansatzpunkt sein.

Danke für deine Hilfe.

Gruß typonewbe

freshman17 ·

Hi,

schau dir die Extension sjr_offers genauer an. Vergleiche jeweils deine Dateien (und die dazugehörige TCA-Konfiguration) mit folgenden:

tabels.sql
Tx_SjrOffers_Domain_Model_Organization
Tx_SjrOffers_Domain_Model_Offer
tca.php
Hier wird eine 1:n Beziehung zwischen Organisation und Offers mittels Tx_Extbase_Persistence_ObjectStorage realisiert, sprich genau das was du suchst.

Hoffe das hilft

Gruß

typonewbe ·

Hallo freshman17,

Ja die Extension hab ich mir angesehen. Leider wird in der selectbox ein multiple="multiple" gesetzt und somit funktioniert der Spass ja auch. Das Problem ist wenn eine Variable vom Typ ObjectStorage ist, dann werden Daten nur gespeichert wenn ein Array übergeben wird

<select name="tx_myext_pi1[device][devicetype][]">

Eine normale Selectbox besitzt aber keine [] so wie oben und somit funktioniert das ganze nicht.
Ich habe es jetzt so gelöst, dass ich für diesen Fall einen eigenen ViewHelper geschrieben habe, der dieses [] setzt auch wenn die Selectbox nicht multiple ist und schon klappt das ganze.

Gruß typonewbe