Den Wert von Radio-Buttons ermitteln

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Antworten
Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Den Wert von Radio-Buttons ermitteln

Beitrag von Well » 15.08.2010, 17:40:52

Und mal wieder muss ich eure Zeit in Anspruch nehmen... :roll:

Ich füge bei einem Formular, sofern der Benutzer die entsprechende Berechtigung besitzt, noch 2 Radio-Elemente hinzu. Dazu verwende ich folgenden Code:

Code: Alles auswählen

private function showPriorityElements() {
	$form__modify_topic = &$this->__getForm('modify_topic');
	$form__modify_topic->addFormContent('<p><b>Priorit&auml;t: </b> Normal ');
	$form__modify_topic->addFormElement('form:radio', array('name' => 'priority', 'value' => '0', 'checked' => 'checked'));
	$form__modify_topic->addFormContent(' Wichtig ');
	$form__modify_topic->addFormElement('form:radio', array('name' => 'priority', 'value' => '1'));
	$form__modify_topic->addFormContent('</p>');		
}
Wirklich gefallen tut es mir zwar nicht, da ich so im Controller das Layout vorgebe, aber es ist die einzigste Möglichkeit die ich in der Doku gefunden habe, Formularinhalte dynamisch hinzuzufügen?!

Mein Problem ist nun aber, dass ich nach dem Absenden des Formulars auch den gerne den Wert hätte. In der Dokumentation wird kein spezifisches Vorgehen für die Radio-Elemente erwähnt, weswegen ich von folgendem Code ausgehe:

Code: Alles auswählen

protected function getPriority() {
	$loginMgr = &$this->__getServiceObject('dotnot::biz', 'LoginManager');
	$userMgr = &$this->__getServiceObject('dotnot::biz', 'UserManager');
	$user = $loginMgr->getLoggedInUser();
			
	if($userMgr->hasUserPermission($user, 'change_topic_priority')) {
		$form__modify_topic = &$this->__getForm('modify_topic');
		return $form__modify_topic->getFormElementByName('priority')->getAttribute('value');
	} else {
		return 0;
	}
}
Wenn ich mir $_REQUEST ausgeben lasse, erhalte ich folgendes:
Array ( [title] => 12345test [message] => 1234567test [do_create_topic] => Absenden [priority] => 1 [module] => forum [page] => create_topic [forum] => 1-Nachrichten )
Die Rückgabe der Methode ist aber 0. Wenn ich mir die Attribute des Elements ausgeben lasse, erhalte ich auch folgendes:
Array ( [name] => priority [value] => 0 )
Was mache ich hier schon wieder falsch? :|

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 15.08.2010, 23:05:59

Hallo Well,
Und mal wieder muss ich eure Zeit in Anspruch nehmen... :roll:
Immer gerne doch! :)
Wirklich gefallen tut es mir zwar nicht, da ich so im Controller das Layout vorgebe, aber es ist die einzigste Möglichkeit die ich in der Doku gefunden habe, Formularinhalte dynamisch hinzuzufügen?!
Da kann ich dich beruhigen: diese Vorgehensweise ist nicht schlimm, denn hierbei handelt es sich ja um View-Funktionalität, die in einem Controller abgebildet werden soll. Die Darstellung selbst ist ja weitestgehend gekapselt (Formular-Element). Solltest du die Beschriftung auch im Formular direkt definieren wollen, kannst du Templates (<form:template />) nutzen und im Controller steuern, wann es angezeigt wird (transformOnPlace()).
Was mache ich hier schon wieder falsch? :|
Ob ein Radio-Button aktiviert wurde oder nicht, kannst du mit der Methode isChecked() abfragen. In deinem Fall ist das durch

Code: Alles auswählen

   if($userMgr->hasUserPermission($user, 'change_topic_priority')) {
      $form__modify_topic = &$this->__getForm('modify_topic');
      return $form__modify_topic->getFormElementByName('priority')->isChecked();
   } else {
      return false;
   }
möglich. Der Wert wird also nur dazu genutzt, den Radio-Button zu aktivieren. Möchtest du in einem Formular mehrere Radio-Buttons nutzen, sollten diese eine Id für die Adressierung via getFormElementById() haben.
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Well » 16.08.2010, 16:43:18

Oh... Danke für die Hilfe. :)

Nova
Beiträge: 31
Registriert: 22.07.2010, 11:57:29

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Nova » 07.09.2010, 15:07:44

Wenn ich mich hier mal dranhängen darf... der Titel passt so schön.
die Frage bei Radiobuttons ist ja meistens nicht ob, sondern welcher der Buttons aus der Gruppe ausgewählt wurde... Der Vorteil von Radiobuttons ist ja gerade, dass man nur einen einer Gruppe auswählen kann und das dann mit der Checkbox-Behandlung zusammenzuwerfen finde ich etwas unschön, da man so manuell durch alle der Gruppe laufen muss und schauen welcher angewählt wurde.
Oder verstehe ich da etwas falsch?

Grüße,
nova

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 07.09.2010, 15:22:10

Hi Nova,
die Frage bei Radiobuttons ist ja meistens nicht ob, sondern welcher der Buttons aus der Gruppe ausgewählt wurde... Der Vorteil von Radiobuttons ist ja gerade, dass man nur einen einer Gruppe auswählen kann und das dann mit der Checkbox-Behandlung zusammenzuwerfen finde ich etwas unschön, da man so manuell durch alle der Gruppe laufen muss und schauen welcher angewählt wurde.
Oder verstehe ich da etwas falsch?
So kann man das natürlich auch sehen, jedoch interessiert dich im Code an einer bestimmten Stelle meist nur, ob eine der Optionen aktiviert wurde. Sofern man eine Gruppe nach ihrem Wert fragen möchte, könnte man dafür aber leicht ein APF-Form-Element bauen, das aus mehreren Radios besteht und sich mit einer Methode getSelectedOption() abfragen lässt. Diese starke Bindung ist jedoch meiner Ansicht nach nur bei einem Select-/Multi-Select-Feld notwendig.

Wie sieht dein Anwendungsfall dazu aus oder ist das nur eine hypothetische Überlegung?
Viele Grüße,
Christian

Nova
Beiträge: 31
Registriert: 22.07.2010, 11:57:29

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Nova » 07.09.2010, 15:34:40

Hallo,
das ist schon eine Frage aus einem Anwendungsfall, ich habe ein Formular, in dem ich bspw. abfrage, ob jemand schon Mitglied ist. Da habe ich mehrere Möglichkeiten zur Auswahl, zB ist er schon Mitglied, oder er ist noch nicht und will noch oder erst ist noch nicht und will auch nicht.
Dazu haben die Checkboxen jedes mal einen anderen Value (Fall 1 = 1, Fall 2 = 2,...) , den ich direkt in der Datenbank abspeichern will. Dazu wäre es jetzt praktisch, nur den ausgewählten Value zu kennen.
Da ich noch nicht so arg durchs Framework durchsteige, werd ich wohl den kleinen Umweg über getElementsByTagName gehen...

Da ich beim neuladen des Forumulars auch wieder aus der Datenbank das bereits eingegebene auslese und das vorher ausgewählte wieder auswählen will, wäre das glaube ich ein größerer Act mit einem neuen APF-Form-Element... mit meinem Frameworkkentnissen zumindest.

Grüße und vielen Dank,
Nova

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 07.09.2010, 23:41:11

Hallo Nova,

nur damit wir uns richtig verstehen: geht es um Checkboxen oder Radio-Buttons? Beide unterscheiden sich schon alleine aus HTML-Sicht.

In dem von dir beschriebenen Anwendungsfall würde ich eine exklusive Auswahl über ein Select-Feld realisieren, da nur eine Möglichkeit der genannten Kombinationen auch gleichzeitig zulässig ist. Das mit Checkboxen abzubilden bedeutet ja, dass du drei Status speichern musst, mit einem Select-Feld - oder gar 3 Radio-Buttons mit je einem Wert, was letztlich einem Select gleich kommt - nur einen Wert.

Somit könntest du die Zahl für deinen Status auch sehr einfach im Select-Feld wieder beim Presetting des Formulars nutzen. Das geht dann einfach per

Code: Alles auswählen

$form->getFormElementByName('status_select')->setOption2Selected(2);
Und ausgelesen ist das Feld auch eben schnell per

Code: Alles auswählen

$form->getFormElementByName('status_select')->getSelectedOption()->getAttribute('value');
Meinst du nicht, das ist eine adäquate Lösung für deinen Anwendungsfall, die keine komplizierte Logik benötigt? Aus Sicht der Usability ist das denke ich jedenfalls einfacher.
Viele Grüße,
Christian

Nova
Beiträge: 31
Registriert: 22.07.2010, 11:57:29

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Nova » 08.09.2010, 19:13:59

Hallo,
da habe ich mich vertippt, es soll Radio-Buttons heißen.
Meines Wissens nach sind Radio-Buttons tatsächlich für den selben Anwendungsfall wie Select-Felder gedacht, aber hier wird von mir leider nunmal eine Radio-Button-Gruppe gefordert, ich habe da wenig Entscheidungsfreiheit...

Es funktioniert jetzt auch, allerdings hakt, da wo ich ein Select-Feld habe, das setOption2Selected noch... liegt sicher nur an einer Kleinigkeit.

Danke trotzdem für die Hilfe.

Nova

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 08.09.2010, 22:04:24

Hi Nova,

dass Select-Felder identisch mit Radio-Buttons zu behandeln sind ist mir fremd. Wenn das fachlich so vom Kunden gefordert ist, musst du das natürlich so machen - klar. Dort kannst du aber auch entsprechend die einzelnen Status abfragen.
Es funktioniert jetzt auch, allerdings hakt, da wo ich ein Select-Feld habe, das setOption2Selected noch... liegt sicher nur an einer Kleinigkeit.
An sich sollte es egal sein, ob du an Hand des Werts oder des Anzeige-Namens selektierst. Falls es nicht funktioniert, poste mal den Code, dann können wir dir sicher helfen. :)
Viele Grüße,
Christian

Nova
Beiträge: 31
Registriert: 22.07.2010, 11:57:29

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Nova » 10.09.2010, 02:32:14

Hallo,
ich meinte eher, dass Select-Felder, zumindest wenn sie nicht multipel anwählbar sind, für die gleichen Anwendungsfälle einsetzbar sind wie Radiobuttons.

Das setOption2Selected, sehr schöne Funktion übrigens, funktioniert jetzt, ich hatte einen Tippfehler im UPDATE-SQL-Befehl.

Mein Code für die Radio-Buttons ist jetzt folgender, ist vermutlich nicht sehr performant, da er bei jedem Radiobutton durch alle Form-Children durchgeht... $this ist hier eine HIlfsklasse, deren Membervariable form &$this->__getForm(NAME); aus dem Controller ist.

Code: Alles auswählen

            foreach($this->form->get('Children') as $child){            
              if($child->getAttribute('name') == strtolower($name)) {
                if (get_class($child) == 'form_taglib_radio') {
                  if ($child->isChecked()) {
                    $sql .= ",`$name` = '". $child->getAttribute("value")."'";
                    break;
                  }
                }
              }
Es funktioniert jetzt aber hier so weit alles, jetzt bin ich erstmal zufrieden. Ich melde mich sicher bald wieder, denn jetzt kommt die Validierung dran...
Grüße,
nova

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 10.09.2010, 09:26:32

Hallo Nova,

da die get()-Methode in 1.12 nur noch aus Kompatibilitäts-Gründen enthalten ist, würde ich folgende Verbesserung vorschlagen (auch, weil das für dich schon einiges an Arbeit erledigt):

Code: Alles auswählen

foreach($this->form->getFormElementsByTagName('form:radio') as $child){           
	if($child->getAttribute('name') == strtolower($name)) {
		if ($child->isChecked()) {
			$sql .= ",`$name` = '". $child->getAttribute("value")."'";
		  break;
		}
	}
}
Alternativ könntest du auch ein getFormElementByName() in einer Schleife aufrufen und dann nur noch nach isChecked() fragen. Ich denke jedoch, dass die Lösung passt.
Mein Code für die Radio-Buttons ist jetzt folgender, ist vermutlich nicht sehr performant,
Hast du mal den Benchmark-Report angesehen oder hast du nur das Gefühl, dass das langsam sein könnte? Der Code an sich ist schon vernünftig.
Viele Grüße,
Christian

Nova
Beiträge: 31
Registriert: 22.07.2010, 11:57:29

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von Nova » 12.09.2010, 16:57:54

Hallo,
ich habe gerade versucht, das mit dem getFormElementByName() zu machen, weil dann ja viel weniger Schleifendurchläufe vonnöten sind, allerdings liefert die Funktion nur das erste Kind zurück. Normalerweise ist ja der Name auch eindeutig, aber bei Radiobuttons leider nicht.
Bei

Code: Alles auswählen

foreach ($this->form->getFormElementByName($name) as $child)
wird also der Schleifeninhalt nicht ausgeführt. Das Template sieht so aus:

Code: Alles auswählen

<tr><td><form:radio name="mitglied_1" value="1"/></td></tr> 
<tr><td><form:radio name="mitglied_1" value="2"/></td></tr>
[...]
Aber das wäre ja nur das Sahnehäubchen, weil bisher in der Schleife einige unnötige Elemente abgeprüft werden, deswegen ist es für mich nicht ganz zufriedenstellend. Im Benchmark ist die Zeit natürlich völlig im Rahmen.

Grüße,
nova

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: Den Wert von Radio-Buttons ermitteln

Beitrag von dr.e. » 12.09.2010, 18:33:48

Hallo Nova,

korrekt. Das hatte ich bei meinem Post nicht beachtet. Sofern du das also per getFormElementsByTagName() lösen konntest, passt das schon.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast