====== Fragebogen-Probleme lösen ======

Der Einsteig in die Verwendung von [[:de:create:php|PHP-Code]] und [[de:create:javascript|JavaScript]] ist nicht immer trivial -- und gerade wenn man eine komplexere Aufgabestellung vor sich hat, funktioniert nicht alles auf Anhieb wie erwartet.

Um die Fehler aufzuspüren und effizient zu beheben (Fehlersuche, engl. "Debugging"), benötigen auch erfahrene Programmierer ein wenig Unterstützung vom Programm. Vor allem muss SoSci Survey (PHP-Code) oder der Internetbrowser (JavaScript) Informationen dazu liefern ...

  * ... wo der Fehler liegt, wenn gar nichts funktioniert (formale Fehler),
  * ... was im Hintergrund passiert, bevor etwas auf dem Bildschirm erscheint und
  * ... ob in Variablen das gespeichert ist, was man erwartet hätte (inhaltliche Fehler).

Formale Fehler sind am einfachsten zu finden: Wenn ein Strichpunkt am Ende eines Befehls fehlt oder eine Klammer (Syntaxfehler), dann wird der Programmcode gar nicht erst ausgeführt. SoSci Survey zeigt dann eine Fehlermeldung, bei JavaScript muss man erst einmal die Fehlerkonsole öffnen.

Inhaltliche Fehler sind schwieriger zu finden. Denn hier arbeitet der Code, führt aber nicht zum erwünschten Ergebnis. Dann hilft die Anzeige, was im Hintergrund passiert (s. [[#beispiel|Beispiel]]).


===== Fehlersuche im PHP-Code =====

Starten Sie den Fragebogen im Debug-Modus, indem Sie bei **Fragebogen zusammenstellen** auf den gelben Pfeil {{:button.debug.gif?nolink|Debugging des Fragebogens}} klicken. Verwenden Sie den gelben Pfeil mit vorgestelltem Strich {{:button.debug.here.gif?nolink|Debugging ab aktueller Seite}}, um den Debug-Modus ab einer bestimmten Seite zu starten.

  * Im Debug-Modus ({{:button.debug.gif?nolink|Debug-Modus}}) und im Vorschau-Modus ({{:button.run.gif?nolink|Vorschau-Modus}}) sehen Sie Warnungen (orange) und Hinweise (gelb) auf mögliche Probleme, die im normalen Fragebogen nicht angezeigt werden (z.B. wenn Sie ''value()'' auf eine Variable anwenden, die noch nicht abgefragt wurde).
  * Im Debug-Modus wird neben jeder Frage deren Kennung und Beschreibung anzeigt. Fahren Sie mit dem Mauszeiger über die Beschreibung, so können Sie in einem Eingabefeld Notizen zur Frage machen. Diese werden auch im **Fragenkatalog** angezeigt, wenn Sie eine Frage zum Bearbeiten öffnen.
  * Im Debug-Modus haben Sie oben eine zusätzliche Steuerleiste (Debug-Leiste) und Sie sehen neben den Fragen zusätzlich Informationen.

{{:de:create:scr.debug.bar.png?nolink|Debug-Leiste}}

Klicken Sie links auf //DEBUG ►//, wenn die leiste einmal im Weg sein sollte. Falls Sie lediglich eine kleine gelbe Schaltfläche //◄ DEBUG// rechts oben im Fragebogen sehen, klicken Sie darauf, um die vollständige Debug-Leiste anzuzeigen.

{{ :de:create:scr.debug.closed.png?nolink |Debug-Leiste ausgeblendet}}

**Hinweis:** Wenn Sie den Fragebogen im Debug-Modus starten, wird dafür ein Fall im Datensatz angelegt. Dieser trägt in der Variable //MODE// den Wert "debug" ([[de:results:variables]]). Verwenden Sie **Erhobene Daten** -> **Daten ansehen**, um die gespeicherten Daten einzusehen.


==== Navigation ====

Sie haben eine Filterfrage auf Seite 2, der eigentliche [:de:create:filters|Filter]] dazu steht aber auf Seite 10? Verwenden Sie die Navigation in der Debug-Leiste, um direkt zwischen den beiden Seiten zu springen.

{{:de:create:scr.debug.navigation.png?nolink|}}

  * Wenn Sie mit dem Mauszeiger über //Seite:// fahren, erscheint eine Liste aller Seite im aktuellen Fragebogen. Klicken Sie auf einen der Einträge, um direkt dorthin zu springen.
  * Alternativ können Sie in das Eingabefeld hinter //Seite:// die Seitennummer eintragen und die Eingabetaste (Return) drücken oder auf den Pfeil (►) klicken.
  * Verwenden Sie den Pfeil nach links (◄), um zur vorigen Fragebogen-Seite zurückzugekehren -- auch dann, wenn Sie im Fragebogen keinen Zurück-Knopf anbieten.
  * Verwenden Sie den Pfeil nach rechts (►), um ohne Prüfung der Vollständigkeit (Antwortpflicht/Nachhaken) zur nächsten Seite zu gelangen.

**Tipp:** Wenn Sie zu einer anderen Seite springen, werden die Angaben auf der aktuellen Fragebogen-Seite gespeichert. Sie brauchen nicht auf den "Weiter"-Knopf zu drücken.


==== Seitenablauf ====

Falls Sie mit ''[[:de:create:functions:gotopage]]'' oder ''[[:de:create:functions:setpageorder]]'' arbeiten, möchten Sie eventuell nachvollziehen, welche Seiten im Verlauf des Interviews anzeigt wurden. Fahren Sie dafür mit dem Mauszeiger über den Namen des Fragebogens.

{{:de:create:scr.debug.history.png?nolink|Informationen zum Fragebogen und Verlauf}}

Sie sehen eine Liste der bisher im Interview angezeigten Seiten. Die aktuelle Position ist fett hervorgehoben. Wenn Sie mittels ''[[:de:create:functions:setpageorder]]'' oder ''[[:de:create:functions:setnextpage]]'' festlegen, dass es nach dem Klick auf Weiter mit einer bestimmten Seite weitergehen soll, wird diese in der Liste ebenfalls (ausgegraut) angezeigt.


==== Debug-Information ====

Wann immer Sie mit PHP-Code arbeiten, liefert die Debug-Information hilfreiche Informationen. Klicken Sie rechts oben auf "Debug-Information", um sie ein- oder auszublenden.

{{ :de:create:scr.debug.information.png?nolink |Debug-Information einblenden}}

Die Debug-Information zeigt die wesentlichen Schritte, die im Hintergrund abgelaufen sind in der Zeit zwischen dem Start der aktuellen Seite (z.B. Klick auf den "Weiter"-Knopf) und der Darstellung der Seite auf dem Bildschirm. Hier wird anzeigt...

  * ... welche Antworten eingelesen und im Datensatz gespeichert wurden ("Lese Antworten von Seite ...") und
  * ... was auf der aktuellen Seite verarbeitet wurde ("Erstelle Fragebogen-Seite Nr. ...").

{{ :de:create:scr.debug.info01.png?nolink |Beispiel für Debug-Informationen}}


==== Filterfragen ====

Als Beispiel dient hier eine Fragebogen-Seite mit einem kleinem [[:de:create:filters|Filter]].

{{:de:create:scr.debug.info01source.png?nolink|Beispiel für eine Fragebogen-Seite mit Filter}}

Der Befehl ''value()'' erzeugt automatisch einen Eintrag in der Debug-Information. Sie können der [[#debug-information|Debug-Information]] entnehmen, dass der PHP-Code den Befehl ''value('AB10')'' verwendet hat und dass dieser den Wert 2 zurücklieferte.

{{ :de:create:scr.debug.info01.png?nolink |Debug-Information zur Filterfrage}}

Weiterhin sehen wir, dass die Frage "AB09" angezeigt wird, nicht aber die Frage "AB05" aus dem Filter -- denn der Wert ''2'', den ''value()'' liefert, entspricht ja nicht dem Wert ''1'', auf welchen der Filter prüft.


==== Variablen ====

Mit dem Befehl ''[[:de:create:functions:debug]]'' können Sie den Wert beliebiger Variablen im Datensatz oder im PHP-Code anzeigen. Als Beispiel dient folgende Fragebogen-Seite, die aus der offenen Texteingabe des Teilnehmers in "AB11_01" einen neuen Wert berechnet und in einem Filter verwendet.

{{:de:create:scr.debug.info02source.png?nolink|Beispiel-Fragebogenseite}}

Hier wurde zweimal der Befehl ''debug()'' eingesetzt. Der Parameter ist einmal die Kennung der offenen Texteingabe "AB11_01" und einmal die PHP-Variable ''$num'', in welcher das Ergebnis der Berechnung gespeichert wird.

Im Debug-Modus erzeugt ''debug()'' eine Ausgabe sowohl im Fragebogen als auch in der [[#debug-information|Debug-Information]]. Im normalen Interview sieht man davon nichts.

{{ :de:create:scr.debug.info02.png?nolink |}}

Beim ersten Aufruf von ''debug()'' teilt SoSci Survey zunächst pflichtbewusst mit, dass der Parameter eine String mit dem Inhalt "AB11_01" ist. Darüber hinaus wird erkannt, dass es sich dabei um die Kennung einer Variable aus dem Datensatz handelt, deshalb zeigt es automatisch den Wert aus dem Datensatz (6) an.

Beim zweiten Aufruf von ''debug()'' zeigt SoSci Survey, welcher Wert aktuell in der PHP-Variable ''$num'' gespeichert ist (6).


==== Leere Seiten ====

Wenn eine Fragebogen-Seite keine Inhalt zeigt, springt SoSci Survey automatisch weiter zur nächsten Seite. Dies passiert z.B. wenn Fragen nur in Abhängigkeit eines Filters angezeigt werden. Im folgenden Beispiel wird Frage "AB05" nur angezeigt, wenn der Teilnehmer in der Auswahl AB10 den Wert 1 auswählte.

{{:de:create:scr.debug.info03source.png?nolink|Eine Fragebogenseite, die u.U. leer bleibt}}

In der [[#debug-information|Debug-Information]] ist nicht nur ersichtlich, dass und weshalb die Frage "AB05" nicht angezeigt wird, sondern auch dass es automatisch mit der nächsten Seite Nr. 4 weitergeht.

{{ :de:create:scr.debug.info03.png?nolink |beispiel}}

Darüber hinaus ist links oben an der Seitennummer "3+4" erkennbar, dass die Seiten 3 und 4 gemeinsam angezeigt werden. Diese Anzeige erhält man auch, wenn man ''[[:de:create:functions:gotopage]]'' verwendet: Dieser Befehl springt aus einer Fragebogenseite hinaus direkt zu einer anderen.


==== Beispiel ====

Folgender PHP-Code sollte ab einem Summenwert von 25 zu einer anderen Fragebogen-Seite springen und dort (über den weiteren Fragen) einen Text anzeigen -- aber vom Text ist nichts zu sehen:

<code php>
if (valueSum('AB01') >= 25) {
  goToPage('noTV');
  text('noTV');
}
</code>

Hier helfen nun die Informationen, welche der Debugging-Modus liefert ([[#debug-information|Debug-Information]]). Diese zeigen, dass der Befehl ''[[:de:create:functions:text]]'' gar nicht ausgeführt wird, das ''goToPage()'' aber schon. Am Filter kann es also nicht liegen, dieser funktioniert.

Ein Blick in die Anleitung des Befehls ''[[:de:create:functions:gotopage]]'' verrät daraufhin, dass dieser direkt zur angegeben Seite springt und dann nichts mehr von der aktuellen Seite ausgeführt wird, in diesem Beispiel also auch nicht das ''text()''. Kennt man die Ursache, ist die Lösung einfach: Das ''text()'' muss vior das ''goTopage()''.

<code php>
if (valueSum('AB01') >= 25) {
  text('noTV');
  goToPage('noTV');
}
</code>


===== Fehlersuche in JavaScript =====

Während PHP-Code von SoSci Survey auf dem Befragungsserver ausgeführt wird, läuft [[de:create:javascript|JavaScript]] im Browser beim Teilnehmer. Entsprechend ist der Browser auch dafür verantwortlich, Fehler und Informationen anzuzeigen.

Dafür wird die Fehlerkonsole des Browsers benötigt. Diese findet man -- je nach Browser -- an unterschiedlicher Stelle ([[http://webmasters.stackexchange.com/a/77337/30902|Shortcuts (engl.)]], [[https://codex.wordpress.org/Using_Your_Browser_to_Diagnose_JavaScript_Errors#Step_3:_Diagnosis|Wordpress (engl.)]], [[http://www.stramaxon.com/2013/10/developer-tools-in-browser.html|How to Open Developer Tools (engl.)]]).

Verwenden Sie den Befehl ''console.log()'', um zusätzliche Informationen in der Fehlerkonsole anzuzeigen. So würde der folgende JavaScript-Code z.B. nach einem Element mit der HTML-ID "AB01_01" suchen -- und in der Fehlerkonsole anzeigen, was er gefunden hat.

<code html>
<script type="text/javascript">
<!--
var input = document.getElementById("AB01_01");
console.log(input);
-->
</script>
</code>

Aktuelle Browser haben zusätzlich einen "Inspektor" oder "DOM Explorer" o.ä., welcher es erlaubt, einfach auf ein Objekt der Fragebogenseite zu klicken (z.B. auf ein Eingabefeld), um zusätzliche Informationen (z.B. den HTML_Code inkl. HTML-ID) zum Objekt anzeigen zu lassen.