treziman: checkbox vordefinieren

Hallo alle,

melde mich nach längerer Zeit mal wieder. Mein Monsterprojekt schreitet unaufhaltsam voran und ich lerne ständig dazu. Lernt man überhaupt irgendwann beim Programmieren aus?
Da ich aber nichts studiert und mir alles selber beigebracht habe, fehlen mir hin und wieder mal ein paar Kniffe. So auch jetzt, wobei ich mich frage, ob folgendes nicht eleganter zu lösen wäre oder wie ihr Profis das machen würdet.
Es geht um die checkbox, genauer um das Vordefinieren mit 'checked'. Wenn also jemand sein Profil ändern möchte, ruft er das entsprechende script auf, worin die gespeicherten Daten aus der DB in ein array geladen und angezeigt werden. Im Augenblick löse ich das wie folgt:

<?php
...
if (!empty ($wert[y]))
{
echo "Text <input type = 'checkbox' name = 'example' value = 'x' checked>";
}
else
{
echo "Text <input type = 'checkbox' name = 'example' value = 'x'>";
}
...
?>

Erläuterung:
Wenn also zuvor kein Wert eingegeben (Häkchen gesetzt) und gespeichert wurde, wird die checkbox auch nicht vordefiniert.
Eigentlich kein grosses Ding, aber wenn man 20 checkboxen hat, hat man auch 20 if - abfragen und darin 40 echo "<input...." . Natürlich kann man entweder alles grundsätzlich vordefinieren oder eben nicht. Aber dann müsste man bei jedem Aufruf ALLES wieder neu eingeben, bzw. die Häkchen setzen.

Wie würdet ihr das machen?

Gruss
Thorsten

  1. Hi,

    <?php
    ...
    if (!empty ($wert[y]))
    {
    echo "Text <input type = 'checkbox' name = 'example' value = 'x' checked>";
    }
    else
    {
    echo "Text <input type = 'checkbox' name = 'example' value = 'x'>";
    }

    Wie würdet ihr das machen?

    So in etwa:
    echo '<label>Text <input type="checkbox" name="example" value="x"'.(!empty($wert['y']) ? ' checked' : '').'></label>';

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo Chris,

      So in etwa:
      echo '<label>Text <input type="checkbox" name="example" value="x"'.(!empty($wert['y']) ? ' checked' : '').'></label>';

      Super, danke! Als Einzeiler. Das ist das, was mir leider fehlt: die Schreibweise wenn man html und php verbindet. Ich versuche mal, ob ich es erklären kann:

      <label> + </label> muss, glaub ich, nicht unbedingt sein, oder?
      '.(!empty($wert['y']) ? ' checked' : '').' Warum in Hochkomma und wofür sind die Punkte?
      Und wenn ich es richtig verstehe:
      !empty($wert['y']) = wenn nicht leer Variable dann
      ? = hänge an
      'checked'
      : = sonst
      '' = leer

      Ist das ungefähr richtig?

      Gruss
      Thorsten

      1. Hi,

        echo '<label>Text <input type="checkbox" name="example" value="x"'.(!empty($wert['y']) ? ' checked' : '').'></label>';

        <label> + </label> muss, glaub ich, nicht unbedingt sein, oder?

        Doch, wenn es sinnvolles und nutzerfreundliches HTML sein soll.

        '.(!empty($wert['y']) ? ' checked' : '').' Warum in Hochkomma und wofür sind die Punkte?

        Hochkommata sind Stringbegrenzer, und der Punkt ist der Verkettungsoperator. Das sind aber wirklich Grundlagen ...

        Und wenn ich es richtig verstehe:
        !empty($wert['y']) = wenn nicht leer Variable dann
        ? = hänge an
        'checked'
        : = sonst
        '' = leer

        http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. Hi.

        Ergänzend zu ChrisBs Antwort:

        '.(!empty($wert['y']) ? ' checked' : '').'

        Das ist sehr irreführend zitiert (so dass Du es schwer hattest, es genau zu verstehen). Schaus Dir mal so an:

        echo 'ein String' . (!empty($wert['y']) ? ' checked' : '') . 'ein anderer String';

        Hier stehen also drei(!) Strings, die zusammen (genauer: der String, der durch ihre Verkettung entsteht) das Argument von 'echo' liefern.

        Alle weiteren Stichwörter hast Du bereits bekommen.

        Viele Grüße,
        der Bademeister

    2. @@ChrisB:

      nuqneH

      So in etwa:
      echo '<label>Text <input type="checkbox" name="example" value="x"'.(!empty($wert['y']) ? ' checked' : '').'></label>';

      Ich werfe in die Runde:
      <label for="example">Text</label> <input type="checkbox" id="example" name="example" value="x" <?php [code lang=php]if !empty($wert['y']) echo 'checked'; ?>>[/code]

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
      1. @@Gunnar Bittersmann:

        nuqneH

        […] if !empty($wert['y']) echo 'checked'; […]


        Da ist mir doch glatt eine Klammer verloren gegangen :-

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
      2. Hello,

        Ich werfe in die Runde:
        <label for="example">Text</label> <input type="checkbox" id="example" name="example" value="x" <?php [code lang=php]if !empty($wert['y']) echo 'checked'; ?>>[/code]

        Ich dachte immer, dass das Attribut idiotischerweise      checked="checked"    heißen würde?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. @@Tom:

          nuqneH

          Ich dachte immer, dass das Attribut idiotischerweise      checked="checked"    heißen würde?

          „Sehen Sie einen http://de.selfhtml.org/html/xhtml/unterschiede.htm#leere_attribute@title=Unterschied?“
          „Nein, ich sehe keinen, gibt es denn einen?“
          „Das ist der Beweis. Lackrrr wäscht so weiß, weißer geht’s nicht.“

          [Frau Surbier dreht sich um, man sieht ihre gelbe Binde mit den 3 schwarzen Punkten.]

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
  2. Hi,

    du hast ja schon ein paar gute Antworten bekommen. Ich würde da auf jeden Fall die Variante vorziehen, wo du am meisten pures HTML und am wenigsten PHP hast.

    Ich hab früher auch sehr viele solcher Ausgaben über echo gemacht und vorher, so wie du, auch so riesige if-else Teile. Aber du merkst ja selbst, dass das unübersichtlich wird. Genauso ist es, wenn du HTML über echo oder sowas ausgeben lässt.

    Du musst erstens immer mit den (doppelten) Anführungszeichen aufpassen und hast 2. kein Syntaxhighlighting für das HTML...

    Wenn also zuvor kein Wert eingegeben (Häkchen gesetzt) und gespeichert wurde, wird die checkbox auch nicht vordefiniert.
    Eigentlich kein grosses Ding, aber wenn man 20 checkboxen hat, hat man auch 20 if - abfragen und darin 40 echo "<input...." . Natürlich kann man entweder alles grundsätzlich vordefinieren oder eben nicht. Aber dann müsste man bei jedem Aufruf ALLES wieder neu eingeben, bzw. die Häkchen setzen.

    Jetzt das was ich eigentlich will:
    Für deine Checkboxen hast du ja die Lösung schon. Wenn du aber mal Selects hast, gebe ich dir noch einen Tipp.

    lege eine Funktion an (z.B. sel_blabla($value) ). Du kannst dann in jeder OPTION des Selects diese Funktion ausgeben lassen. (z.B: <option value='3' <?=sel_blabla(3);?> >Drei</option>)

    In der Funktion kannst du dann prüfen, ob der Datenbankwert von diesem Select gleich der $value ist und dann ein selected='selected' zurückgeben.

    Finde ich noch ein bisschen übersichtilcher, weils kürzer ist.

    Wenn du nicht nur $value sondern auch die Referenzvariable (also z.B. das Datenbank-Ergebnis) an die Funktion übergibst kannst du sie auch auf alle selects anwenden.

    Gruß
    Alex

    1. Hallo,

      erst nochmal danke an alle!

      Die Bedeutung der Zeichen an sich ist mir schon bekannt. Z.B. der '.' als Verkettungsoperator (echo $a.$b). Es ist eben nur die Schreibweise, wenn ich html und php mische (mischen muss). Ich habe nirgends etwas gefunden, wo genau dies gut erklärt wird und es Beispiele gibt. Entweder man beschäftigt sich mit reinem php oder mit reinem html.

      Sicher kann ich auch trennen, habe aber dann wahrscheinlich hunderte '<?php' und '?>' im script, was die Übersicht nicht gerade fördert.

      Danke auch für den Tip mit <select> und Funktionsaufruf. Darauf komme ich mit Sicherheit zurück, vor allem bei vielen selects.

      Einzig der Sinn und Zweck von <label> </label> ist mir unklar. Ich habe darüber nachgelesen, aber so, wie ich es verstehe, ist es wahrscheinlich falsch. Zum einen soll es als Gestaltungsmittel dienen und z.B. Tabellen ersetzen, zum anderen wird damit ein Bezug zwischen Beschriftung und, in meinem Fall, der checkbox hergestellt. Ich habe mit <label> </label> jetzt noch nicht experimentiert, mache dies aber mal.

      Gruss
      Thorsten

      1. Hallo,

        erst nochmal danke an alle!

        Man hilft doch gerne ;)

        Die Bedeutung der Zeichen an sich ist mir schon bekannt. Z.B. der '.' als Verkettungsoperator (echo $a.$b). Es ist eben nur die Schreibweise, wenn ich html und php mische (mischen muss). Ich habe nirgends etwas gefunden, wo genau dies gut erklärt wird und es Beispiele gibt. Entweder man beschäftigt sich mit reinem php oder mit reinem html.

        Was musst du denn noch konkret wissen?
        Wichtig ist eigentlich nur, dass du __.__ und  __'__ und __"__ mit der jeweiligen Bedeutung kennst. Also wenn du __'__ zum Begrenzen der Strings nimmst wird der Inhalt nicht interpretiert von PHP. Wenn du __"__ nimmst, kannst du auch Variablen ausgeben lassen. (z.B. $var = 'hallo'; echo "er sagte: $var"; --> gibt __Er sagte hallo__ aus.)

        Sicher kann ich auch trennen, habe aber dann wahrscheinlich hunderte '<?php' und '?>' im script, was die Übersicht nicht gerade fördert.

        »»
        Glaube mir da einfach: Vermeide HTML in Strings/Echos. Du hast sonst nur Stress damit. Wenn zu z.B. mit if irgendwas überprüfst machst du nach der geschweiften Klammer PHP aus __?>__ und machst in HTML weiter. Du findest dich da nachher viel besser zurecht - geht mir jedenfalls so.

        Ich nutze übrigens nicht __<?php__ sondern __<?__. Hatte damit noch nie Probleme. ...Naja, bis auf bei einer XML-Datei, weil die mit __<?__ losgeht, das Zeichen da aber nichts mit PHP zu tun hat sondern mit XML. Da habe ich das dann eben als String ausgegeben und gut wars.

        Wenn man den Server wechselt, kann das zu Problemen führen, wenn es am neuen Server nicht unterstützt ist. Ich glaube sonst gibts da keine Einwände dagegen.

        Ich merke es gerade wieder: Mach dir ruhig die Gedanken, wie du es am besten machst. Wenn du einfach so drauf losarbeitest musst du am Ende viel mehr tun, wenn du mal was überarbeitest. (Habe es mir auch mit learning by doing beigebracht...)

        Einzig der Sinn und Zweck von <label> </label> ist mir unklar. Ich habe darüber nachgelesen, aber so, wie ich es verstehe, ist es wahrscheinlich falsch. Zum einen soll es als Gestaltungsmittel dienen und z.B. Tabellen ersetzen, zum anderen wird damit ein Bezug zwischen Beschriftung und, in meinem Fall, der checkbox hergestellt. Ich habe mit <label> </label> jetzt noch nicht experimentiert, mache dies aber mal.

        Click mal den Text neben deinen Checkboxen an. Da wirs nichts passieren. Wenn du aber ein Label benutzt, dann kannst du die Checkbox über den Text steuern. Also du kannst überall in Checkbox und im Label klicken und der Status der Checkbox ändert sich. Das ist viel Benutzterfreundlicher, weil man dann nicht so genau zielen muss mit der Maus.

        Bei Leuten mit Sehbehinderung hat es auch den Vorteil, dass der Screenreader so besser die tatsächliche Beschriftung zuordnen kann und dem User erklären kann, was die Checkbox bewirkt.

        Gruß
        Alex

        1. Hallo Alex,

          Was musst du denn noch konkret wissen?
          Wichtig ist eigentlich nur, dass du __.__ und  __'__ und __"__ mit der jeweiligen Bedeutung kennst. Also wenn du __'__ zum Begrenzen der Strings nimmst wird der Inhalt nicht interpretiert von PHP. Wenn du __"__ nimmst, kannst du auch Variablen ausgeben lassen. (z.B. $var = 'hallo'; echo "er sagte: $var"; --> gibt __Er sagte hallo__ aus.)

          Dank Deiner Ausführungen blicke ich jetzt schon wieder tiefer durch! Super!

          Glaube mir da einfach: Vermeide HTML in Strings/Echos. Du hast sonst nur Stress damit. Wenn zu z.B. mit if irgendwas überprüfst machst du nach der geschweiften Klammer PHP aus __?>__ und machst in HTML weiter. Du findest dich da nachher viel besser zurecht - geht mir jedenfalls so.

          Also ich komme ganz gut damit zurecht, wenn ich alles in echos packe. Situationsbedingt ist es manchmal von Vorteil, wenn man php beendet/unterbricht. Das stimmt allerdings.

          Aber jetzt, folgendes:

          Click mal den Text neben deinen Checkboxen an. Da wirs nichts passieren. Wenn du aber ein Label benutzt, dann kannst du die Checkbox über den Text steuern. Also du kannst überall in Checkbox und im Label klicken und der Status der Checkbox ändert sich. Das ist viel Benutzterfreundlicher, weil man dann nicht so genau zielen muss mit der Maus.

          Bei Leuten mit Sehbehinderung hat es auch den Vorteil, dass der Screenreader so besser die tatsächliche Beschriftung zuordnen kann und dem User erklären kann, was die Checkbox bewirkt.

          DAS, genau DAS ist eine Erklärung, die wirklich jeder verstehen MUSS! So müsste es immer sein. Da braucht man nicht lange im Net surfen und nach Antworten suchen. Wird im Net sowieso nirgends so erklärt. Einzig die Schreibweise muss man sich eben aneignen. Ist aber kein Problem. Jetzt werde ich auch <label>s einbauen.

          Grosses Lob und vielen Dank, Alex!

          Gruss
          Thorsten

          1. @@treziman:

            nuqneH

            Wird im Net sowieso nirgends so erklärt

            Doch.

            Schon in der HTML-Spezifikation steht im Abschnitt 17.9.1 Das Element LABEL: „Bekommt ein LABEL-Element den Fokus, reicht es den Fokus weiter an sein entsprechendes Steuerelement.“

            In SELFHTML steht unter <http://de.selfhtml.org/html/formulare/strukturieren.htm#label@title=Label für Elemente>: „Beim Klick auf den Inhalt eines Labels (im Beispiel Vorname, Zuname, Auswahl) wird in aktuellen Browsern das Formularelement fokussiert bzw. ausgewählt, auf das sich das Label bezieht. Diese Funktion erleichtert unter anderem die Auswahl von Checkboxen.“

            Qapla'

            --
            Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
            (Mark Twain)
            1. Hallo Sebastian,

              Doch.

              Nein. Es wird wohl erklärt, auch so, wie Du schreibst. Habs selbst gelesen. Ich bin aber ehrlich und sage, dass ich mir unter der Funktionsweise auch nach lesen der Erklärung, nichts drunter vorstellen konnte. Kann jeder von mir halten, was er will.
              So wie Alex es aber erklärt hat, wird sich wohl jeder etwas drunter vorstellen können, auch ohne probieren. So meine ich es.

              Ich musste öfter im Net von Forum zu Forum wandeln und Antworten auf meine Fragen suchen. Meistens stand in mehreren Foren dasselbe. Auch Beispiele, die man aber erst wenigstens kopieren und im Testskript einfügen und laufen lassen musste, um die Wirkung zu sehen. In der Erklärung zu <label> steht aber ausserdem sinngemäss: "...hat keine sichtbare Wirkung...". Dann fragt man sich, wofür ist das? Vor allem, wenn man noch nie davon gehört hat, so wie ich. Also fragt man nach und ich freue mich dann echt, wenn es verständlich erklärt wird.
              Ihr seid hier Profis, oder wenigstens Semiprofis, die sich ihr Wissen über lange Zeit durch viel Übung beigebracht haben. Wer hier aber Fragen stellt, ist wahrscheinlich, sagen wir mal, unerfahren und erwartet sicher verständliche Hilfe.
              Man kennt das aus der Medizin. Ärzte untereinander sprechen von "Fraktur". Patient zum Arzt von "Bruch". Der Arzt kennt beide Begriffe, der Patient nicht unbedingt. Am einfachsten ist es also, wenn der Arzt zum Patienten sagt: "Sie haben sich das Bein gebrochen."

              Gruss
              Thorsten

  3. Moin,

    Wie würdet ihr das machen?

    Mit einer kleinen Matrix. Beispiel in Perl:

      
    # Matrix  
    my $chk = {  
    	eins => ['checked','',''],  
    	zwei => ['','checked',''],  
    	drei => ['','','checked'],  
    };  
      
      
    my $was = 'zwei';  
    print qq(  
    	<input type="checkbox" name="foo" value="eins" $chk->{$was}->[0]>  
    	<input type="checkbox" name="foo" value="zwei" $chk->{$was}->[1]>  
    	<input type="checkbox" name="foo" value="drei" $chk->{$was}->[2]>  
    );  
    
    

    Wenn $was == 2 ist (Box 'zwei' gewählt), siehst Du:

      
    	<input type="checkbox" name="foo" value="eins" >  
    	<input type="checkbox" name="foo" value="zwei" checked>  
    	<input type="checkbox" name="foo" value="drei" >  
    
    

    Hotti

    1. Hallo,

      Wenn $was == 2 ist (Box 'zwei' gewählt), siehst Du:

      <input type="checkbox" name="foo" value="eins" >
      <input type="checkbox" name="foo" value="zwei" checked>
      <input type="checkbox" name="foo" value="drei" >

        
      Deine Matrix-Methode scheint mir eher ein Fall für Radiobuttons zu sein? Was ist, wenn sowohl 'eins' als auch 'zwei' gewählt wurden?  
        
      Viele Grüße,  
      Sebastian
      
      1. hi,

        Deine Matrix-Methode scheint mir eher ein Fall für Radiobuttons zu sein?

        Code so wie dargestellt: Ja, da hast Du recht ;)

        Was ist, wenn sowohl 'eins' als auch 'zwei' gewählt wurden?

        Musst den Code nur ein bischen umbauen, dann geht das auch mit einem Array.

        Schönen Sonntag,
        Hotti

  4. Hi!

    Lernt man überhaupt irgendwann beim Programmieren aus?

    Kann ich mir nicht vorstellen.

    Da ich aber nichts studiert und mir alles selber beigebracht habe, fehlen mir hin und wieder mal ein paar Kniffe. So auch jetzt, wobei ich mich frage, ob folgendes nicht eleganter zu lösen wäre oder wie ihr Profis das machen würdet.

    Reichen dir auch Amateurantworten?

    Eigentlich kein grosses Ding, aber wenn man 20 checkboxen hat, hat man auch 20 if - abfragen und darin 40 echo "<input...." . Natürlich kann man entweder alles grundsätzlich vordefinieren oder eben nicht. Aber dann müsste man bei jedem Aufruf ALLES wieder neu eingeben, bzw. die Häkchen setzen.

    Es gibt Schleifen und Funktionen und die "Trennung von Zuständigkeiten". Gerade für solche Dinge wie Formulareingabefelder, die man öfter mal anhand vorhandener Daten generieren muss, bietet es sich an, generische Funktionen zu erstellen. Über feste und optionale Parameter übergibt man aus dem Programmfluss die (rohen) Daten. Die Funktion kümmert sich um den Zusammenbau eines Elements (inklusive kontextgerechter Behandlung der auszugebenden Werte). Hat man mehrere Elemente zu generieren, so holt man die Daten sinnvollerweise aus einer Datenhaltung und kann entweder in der Abfrageschleife oder beim Iterieren über ein Werte-Array die Funktion aufrufen.

    Dann ist es auch recht einfach, ein fehlendes/vergessenes Element, wie beispielsweise <label> hinzuzufügen. Man muss dies nämlich nur an einer Stelle und nicht an n Stellen tun. Und die Trennung von Zuständigkeiten ist in der Form im Spiel, dass du dir überlegst, wo es Aufgaben gibt, die man immer wieder braucht, und die man deswegen an einen Spezialisten auslagert und somit sein Programm von Wiederholungen befreit. Auch wenn eine Aufgabe nur einmal erledigt werden muss, lohnt es sich mitunter sie in eine Funktion auszulagern, denn auch das verschlankt das Hauptprogramm und sorgt für Übersichtlichkeit.

    Lo!

    1. Hallo dedlfix,

      Reichen dir auch Amateurantworten?

      Die verstehe ich vielleicht sogar schneller (lach).

      Prinzipiell versuche ich immer, mir die Arbeit so einfach wie möglich zu machen. Z.B generiere ich ein Formularfeld, passe es dann meinen Bedürfnissen an und lade es mit include.

      Wenn ich jetzt auf meine Arbeit der letzten 2 Monate zurückblicke, hätte ich sicher das ein oder andere eleganter lösen können. Meistens hätte dies aber Zeit gekostet, die ich zum Suchen nach anderen Lösungen oder so verbraucht hätte. Andererseits zahlt sich genau diese Zeit auch häufig aus. So musste ich mal feststellen, ob ein String nur aus Buchstaben und Zahlen besteht. Beim Suchen stiess ich auf 'ctype', was ich noch nicht kannte und mir aber Tipparbeit erspart hat. Oder, am Anfang, als ich mit divs, frames und iframes herumprobierte. Frames waren ungeeignet und divs kann man nicht mit Namen ansprechen. Die Lösung aller diesbezüglichen Probleme sieht eine Kombination von divs und iframes. Auch wieder beim intensiven Suchen fand ich ein Beispiel für die Möglichkeit:
      <form action='example.php' method='post' target='iframe'>
      Bis dahin wusste ich nicht, dass man das target - Attribut in ein Form - tag packen kann. Und schon lief alles.

      Für mich als Nicht-Profi (Amateur würde auch nicht ganz stimmen) sind immer Beispiele hilfreich. So wie hier auch von ChrisB. Damit kann ich echt was anfangen und bin auf die Spur gebracht. Den Rest bastel ich mir dann zusammen. Oder auch von Dir, dedlfix, die Einweisung in mysql. Hat mir echt geholfen. Inzwischen arbeite ich einwandfrei auch mit mysql_fetch_row und mysql_fetch_array , wo ich mich als mysql-Anfänger reingearbeitet habe.

      In diesem Sinne nochmals Dank an alle hier im Forum!

      Gruss
      Thorsten