[Frage] checked="" muss sein

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    15. 01. 2014, 18:49

    Hallo,
    ich bin auf eine merkwürdige Sache gestoßen.

    Das folgende ist Teil eines Partials für eine new/editAction.
    Dabei kann mit den Radiobuttons der Typ bestimmt werden (ValueObjects).

    1. <f:for each="{types}" as="type" >
    2. <f:if condition="{myobject.myType} == {type}" >
    3. <f:then><f:form.radio property="myType" value="{type.uid}" checked="checked" />{type.name}</f:then>
    4. <f:else><f:form.radio property="myType" value="{type.uid}" />{type.name}</f:else>
    5. </f:if>
    6. <br />
    7. </f:for>

    Wenn noch kein Typ bestimmt wurde, steht bei keinem der Radiobutton checked dabei... gut so.
    Wenn allerdings schon ein Typ bestimmt ist, erhalte ich checked beim gecheckten sowieso [b]aber auch beim ersten Element[/b].

    Wenn ich aber den else-Zweig um checked="" erweitere, passts. Dann habe ich auch kein checked-Attribut im <input type="radio"...> wo keins hin soll.

    Es hat eine Weile gedauert, das (durch probieren) herauszufinden, nachdem ich schon eine Weile gesucht und nichts gefunden hatte. Ich kann auch nicht sagen, ob das ein Bug oder eine so vorgesehene Verpflichtung an Programmierer ist, sauber zu coden.
    Auf jeden Fall hab ich mir gedacht, ich kunde hier mal meine Erkenntnis.

    Wenn doch jemand etwas dazu sagen kann, nur zu! Ein Forum ist für alle da :)

    Gruß
    Harald

    (edit)P.S.: Das wollte ich eigentlich nicht als Frage markieren.

  • Hilfreichster Beitrag

  • 1 x
    64 Beiträge
    4 Hilfreiche Beiträge
    21. 01. 2014, 08:52 - Hilfreichster Beitrag

    Hallo,

    ich bin damals bei der Suche nach einem ähnlichen Problem bzgl. dem Checken von Radio-Buttons / Checkboxen auf folgende Lösung gestoßen:

    1. <f:form.radio name="register_action" value="register" checked="{0: register_action}=={0: 'register'}" /> Anmelden<br />
    2. <f:form.radio name="register_action" value="unregister" checked="{0: register_action}=={0: 'unregister'}" /> Abmelden

    Durch die Abfrage innerhalb von "checked" wird festgelegt, ob das Feld gechecked ist oder nicht. Der umständliche Vergleich in der Abfrage kommt daher, dass ein String-Vergleich so noch nicht möglich ist/war. Deshalb werden die Werte in ein Array gewandelt, damit die Werte verglichen werden können. (Die Quelle dieser Lösung habe ich leider nicht mehr im Kopf). Bei mir funktioniert es zumindest :)

    Im Ergebnis sieht der HTML-Code dann so aus:

    1. <input type="radio" name="tx_newsletter_pi1registration[register_action]" value="register" checked="checked" /> Anmelden<br />
    2. <input type="radio" name="tx_newsletter_pi1registration[register_action]" value="unregister" /> Abmelden

    Die Lösung ist vielleicht etwas angenehmer, als das input-Feld zweimal zu schreiben (in einer if- und einer else-Anweisung).

    Für dich müsste die Schleife dann also in etwa wie folgt aussehen (nicht getestet):

    1. <f:for each="{types}" as="type" >
    2. <f:form.radio property="myType" value="{type.uid}" checked="{myobject.myType} == {type}" />{type.name}<br />
    3. </f:for>


  • 1
  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    15. 01. 2014, 20:35

    Ist denn in deinem Fluid Template um die Radio Buttons herum auch eine <form>?

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    15. 01. 2014, 23:28

    Ja klar doch!
    Hab mich hier nur aufs nötigste beschränkt.
    Ja, ich hab eine <form> um dieses Partial drumrum, mit nem hübschen commit-button unten dran.
    Hab die Radiobuttons auch in einer <table>, weil ich mehr anzeige, als nur Name und den Knubbel.
    Macht aber keinen Unterschied... habs mit table und ohne getestet.

    Das eigenartige ist eben, daß (in der HTML-Ausgabe) checked="checked" auch beim ersten Wert steht, wenn nur irgendein Wert gesetzt ist. Sichtbar ist aber nur der letzte gecheckede Wert (neu überschreibt alt).
    Die Lösung hab ich ja auch schon:
    Mit checked="" im fluid-else-Zweig passiert das nicht mehr.
    Dann erscheint in der entsprechenden Ausgabe gar kein checked.
    Also so hats früher ausgesehen (Nr.3 = "extra" ist gesetzt)

    1. <input type="radio" name="tx_myext[myobject][myType]" value="1" checked="checked" />normal<br />
    2. <input type="radio" name="tx_myext[myobject][myType]" value="2" />doppelt<br />
    3. <input type="radio" name="tx_myext[myobject][myType]" value="3" checked="checked" />extra<br />

    Jetzt ist eben nur noch eins (hier die 3) checked.

  • 1 x
    64 Beiträge
    4 Hilfreiche Beiträge
    21. 01. 2014, 08:52

    Hallo,

    ich bin damals bei der Suche nach einem ähnlichen Problem bzgl. dem Checken von Radio-Buttons / Checkboxen auf folgende Lösung gestoßen:

    1. <f:form.radio name="register_action" value="register" checked="{0: register_action}=={0: 'register'}" /> Anmelden<br />
    2. <f:form.radio name="register_action" value="unregister" checked="{0: register_action}=={0: 'unregister'}" /> Abmelden

    Durch die Abfrage innerhalb von "checked" wird festgelegt, ob das Feld gechecked ist oder nicht. Der umständliche Vergleich in der Abfrage kommt daher, dass ein String-Vergleich so noch nicht möglich ist/war. Deshalb werden die Werte in ein Array gewandelt, damit die Werte verglichen werden können. (Die Quelle dieser Lösung habe ich leider nicht mehr im Kopf). Bei mir funktioniert es zumindest :)

    Im Ergebnis sieht der HTML-Code dann so aus:

    1. <input type="radio" name="tx_newsletter_pi1registration[register_action]" value="register" checked="checked" /> Anmelden<br />
    2. <input type="radio" name="tx_newsletter_pi1registration[register_action]" value="unregister" /> Abmelden

    Die Lösung ist vielleicht etwas angenehmer, als das input-Feld zweimal zu schreiben (in einer if- und einer else-Anweisung).

    Für dich müsste die Schleife dann also in etwa wie folgt aussehen (nicht getestet):

    1. <f:for each="{types}" as="type" >
    2. <f:form.radio property="myType" value="{type.uid}" checked="{myobject.myType} == {type}" />{type.name}<br />
    3. </f:for>

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    21. 01. 2014, 13:13

    Cool, 8-)

    also das mit [b]checked="{myobject.myType} == {type}"[/b] funktioniert:
    Es steht checked="checked" wenn true, und nichts wenn false.
    Oder anders gesagt: [b]checked="[i]<Boolscher Ausdruck>[/i]"[/b] wird korrekt und wie gewünscht ungewandelt. Das bedeutet, ich kann auch checked="1" bzw "0" schreiben, oder auch "true"/"false" (hab ich getestet).

    Imho benötige ich aber trotzdem je einen separaten if+else Zweig, weil ich beim gesetzten Wert noch etwas mehr zu tun habe, als nur den Knubbel zu setzen.
    Da muss ich mal schauen, ob ich das noch besser hinbiegen kann. Der Code wird gleich übersichtlicher :) if und else sind weg und ich hab quasi nur den then-Zweig.

    Es bleibt die Erkenntnis, daß für jeden einzelnen radio-input ein checked-Attribut definiert sein muss, denn sonst wird der erste einfach mal so gesetzt.

  • 1