• Hey zusammen,

    ich habe mal einen Lückentext erstellt. Funktioniert soweit auch alles.
    Aber ich möchte dazu noch das wenn ein richtiges Wort eingetragen wird in der Zeile Fehlende Wörter das wort durchgestrichen wird, und bei Fehlern, das input feld einen roten border bekommt.

    Beispiel:
    Ich fülle jetzt den Lückentext aus und klick absenden, und alle richtig sind sollen alle durchgestrichen werden, und bei fehlern die fehlerhaften wörter nicht durchgestrichen werden und ein roter border um fehlerhafte input felder soll erscheinen

    Wie kann man es machen?

    Anbei meine Datei:

    Gruß,
    Stef

    Einmal editiert, zuletzt von Stef (5. August 2016 um 17:22)

    • Offizieller Beitrag

    Hallo,

    Grundsätzlich solltest Du viel mehr mit Arrays arbeiten!
    Kurze Frage, bevor ich meine Zeit in die falsche Richtung investiere: Muss es statisch sein oder darf die Prüfung der einzelnen Felder auch dynamisch, sprich mit JavaScript und Ajax passieren?

    Zum Thema Arrays: Die kannst Du auch für POST-Daten verwenden.

    HTML
    <p>Ein kleines Mädchen, <input type="text" name="luecken[]" value="">, dem seine Großmutter einst eine rote Kappe geschenkt hat, wird von der <input type="text" name="luecken[]" value=""> geschickt, der in einem Haus im Wald wohnenden, bettlägerig kranken Großmutter einen Korb mit Leckereien (Kuchen und Wein) zu bringen. Die Mutter warnt Rotkäppchen eindringlich, es solle nicht vom <input type="text" name="luecken[]" value=""> abgehen. Im Wald lässt es sich auf ein Gespräch mit einem <input type="text" name="luecken[]" value=""> ein. Dieser horcht Rotkäppchen aus und macht es auf die schönen Blumen auf einer nahen Wiese aufmerksam, worauf Rotkäppchen beschließt, noch einen <input type="text" name="luecken[]" value=""> zu pflücken, der Warnung der Mutter zum Trotz. Der Wolf eilt geradewegs zur <input type="text" name="luecken[]" value=""> und frisst sie. Er legt sich in deren Nachthemd in ihr Bett und wartet auf Rotkäppchen. Bald darauf erreicht Rotkäppchen das Haus, tritt ein, und begibt sich an  <input type="text" name="luecken[]" value=""> Bett. Dort wundert sich Rotkäppchen über die  <input type="text" name="luecken[]" value=""> ihrer Großmutter, erkennt aber nicht den Wolf, bevor es ebenfalls gefressen wird.Großmutter und Rotkäppchen werden aber von einem  <input type="text" name="luecken[]" value=""> aus dem Bauch des Wolfes befreit. Der Jäger  füllt  dem Wolf  <input type="text" name="luecken[]" value=""> in den Bauch. Wegen des Gewichts der Steine kann der Wolf nicht fliehen und stirbt.


    So hat der Lückentext auch mehr Sinn, weil niemand im Quelltext die Lösung nachlesen kann!

    So eine POST-Übermittlung kannst Du dann problemlos in Kürze auf Fehler auswerten:

    Die Fehler selber kannst Du dann unten auch relativ einfach ausgeben:

    PHP
    if( isset($errors) && count($errors) > 0 ) {
    
    
        echo 'Fehler in Feldern: ' . implode( ', ', $errors );
    
    
    }


    Die korrekten Werte in die Lücken einzutragen, nach einem Reload ist auch nicht weiter aufwendig, habe ich jetzt aber mal weg gelassen, um beim Kern zu bleiben.

    Im nächsten Step gilt es dann, die Wörter aus der Liste abzustreichen und die Felder bei Fehlern rot zu umranden.
    Wenn das alles nach dem Klick auf Absenden passieren soll, benötigst Du glaube kein JavaScript/Ajax. Sollen die Werte aber beim Eintragen der Felder validiert und ausgewertet werden, benötigst Du das doch, daher warte ich zunächst mal, wie Du es gerne hättest.

  • Hey,

    ok. In deinem Beispiel wird ja nicht geprüft ob das Formular abgesendet wurde. Man braucht es oder?

    Aso wusste ich noch nicht. Ist ja ne gute Idee es so zu machen.

    zum implode: Implode verbindet ja Array-Elemente zu einem String. Brauch man denn dabei dann keine schleife mehr? Dann könnte man ja theoretisch die arrayelemente immer mit implode ausgeben oder?

    Zu dem script, hab ich dies richtig kommentiert:

    Wenn ich jetzt in den input feldern die richtigen wörter in die value speicher dann ist es doch nur für den, der es gemacht hat sichtbar, und wenn man dann alles wieder neu ladet dann ist die value wieder leer. Wo ist dann dabei das Problem?

    Wenn ich jetzt einen Lückentext erstellen würde als Test, dann würde ich natürlich die richtigen wörter nicht in value speichern sondern die erfolgten fehler zählen und dann ausgeben mit Note.

    Wenn es für dich möglich ist, würde ich gerne beide Beispiele sehen.

    Gruß,
    Stef

    Einmal editiert, zuletzt von Stef (6. August 2016 um 19:59)

    • Offizieller Beitrag
    Zitat

    In deinem Beispiel wird ja nicht geprüft ob das Formular abgesendet wurde.

    Doch, wird es! Ich frage nur nicht den Submit-Button ab, sondern ein Feld bzw. Index, den ich erwarte.

    Zitat

    Implode verbindet ja Array-Elemente zu einem String. Brauch man denn dabei dann keine schleife mehr?

    Eine Schleife basiert lediglich auf einer Iteration, was implode() selbst auch macht, somit benötigst Du für diesen Zweck keine Schleife.

    Zitat

    Dann könnte man ja theoretisch die arrayelemente immer mit implode ausgeben oder?

    Natürlich nur, wenn es darum geht, die Array-Elemente als String darzustellen.
    Schleifen sind durchaus an vielen Stellen sinnvoll und manchmal auch unumgänglich. Ich versuche nur sie weitesgehend zu vermeiden, aber das ist keine fachliche Handlungsweise, sondern eine rein persönliche.
    Ich mag Code mit lauter Schleifen nicht sonderlich, aber das ist mein Problem ;)

    Zitat

    Zu dem script, hab ich dies richtig kommentiert:

    Nicht ganz :)

    Zitat

    Wenn ich jetzt in den input feldern die richtigen wörter in die value speicher dann ist es doch nur für den, der es gemacht hat sichtbar, und wenn man dann alles wieder neu ladet dann ist die value wieder leer. Wo ist dann dabei das Problem?

    Das Problem lag nicht in den value-Attributen, sondern darin, dass Du die Felder entsprechend den Wörtern benannt hast:

    HTML
    <input type="text" name="rotkaepchen" value="">

    ...da brauche ich nicht lange, um das richtige Wort aus der Liste zu suchen ;)
    Natürlich muss dafür jemand erstmal in den Quelltext schauen, aber warum nicht gleich das Problem umgehen?!

    Zitat

    Wenn ich jetzt einen Lückentext erstellen würde als Test, dann würde ich natürlich die richtigen wörter nicht in value speichern sondern die erfolgten fehler zählen und dann ausgeben mit Note.


    Was der User eingegeben hat, kann ruhig in value wiedergegeben werden, warum nicht. Ist ja seine Eingabe und sagt erst mal nichts über die Richtigkeit aus.

    Zitat

    Wenn es für dich möglich ist, würde ich gerne beide Beispiele sehen.


    Ich habe Dir mal fürs erste Dein Script umgebaut, so dass nach Absenden alle korrekten Worte in den values stehen, alle falschen Felder wieder leer aber rot umrandet und die richtig gesetzten Worte aus der Wortliste gestrichen sind. Dadurch hat sich der Quellcode jetzt ein klein wenig verändert, aber grundsätzlich ist alles, wie zuvor:


    Der Vorteil der Array-Variante für die Input-Felder ist der, dass Du den Kernteil des PHP-Scriptes nicht erweitern/ändern musst, wenn Du mal Felder dazu nimmst oder entfernst.
    Du erweiterst einfach den Text mit weiteren Input-Feldern und trägst entsprechend die Werte an der richtigen Stelle in $matches ein. Der Rest funktioniert weiterhin ohne Anpassungen...

    Den PHP-Part habe ich hier nochmal grob dokumentiert:


    Ich denke mal, dass es das ist, was Du haben willst, daher spare ich mir den Javascript-Krams an dieser Stelle mal...

    Wenn Du Fragen hast, tu' Dir keinen Zwang an ;)

    Gruß Arne

  • Hey,

    Aso ok.

    ja, da hast du recht. Habe garnicht daran gedacht.

    Danke für das Kommentieren. Hilft mir sehr den Code zu verstehen.

    Es funktioniert alles super danke.

    Das arbeiten mit Arrays, ist für mich noch etwas neuland.

    Gruß,
    Stef