====== Filterfragen (PHP-Filter) ======

Wenn die Antwort des Teilnehmer auf eine Frage Auswirkungen auf den weiteren Verlauf des Interviews haben soll, handelt es sich um eine Filterfrage. Sie können Filter entweder direkt in der Frage definieren (//[[:de:create:simple-filters|Frage-Filter]]//, einfache Variante) oder unter **Fragebogen zusammenstellen** (//PHP-Filter//).

PHP-Filter erlauben deutlich anspruchsvollere Filter als Frage-Filter, erfordern aber den Umgang mit ein wenig PHP-Programmcode. Die meisten Nutzer von SoSci Survey haben vorher noch nie mit einer Programmiersprache gearbeitet. Zum Erstellen von Filterfragen werden Sie in diesem Kapitel einige grundlegende Kenntnisse zur Programmierung mit PHP erlernen. __Keine Angst:__ Aller Anfang ist schwer, aber die Programmierung von Filtern ist absolut machbar und der Lohn der Mühe ist eine steile Lernkurve. Für eventuelle Frustrationen entschädigt meist ein freudiges Aha-Erlebnis.

**Wichtig:** Zum Verständnis dieses Kapitels wird dringend das Kapitel [[php|Einführung in PHP-Code]] empfohlen.

**Wichtig:** Wenn ein Filter nicht wie gewünscht funktioniert, lesen Sie bitte [[filter-solving|Problemlösung bei Filterfragen]]


**Tipp:** Werden die Teilnehmer in Kontroll- und Experimentalgruppe geteilt ([[:de:create:questions:random]], [[:de:create:randomization]]) und sehen unterschiedliche Fragebogen-Seiten, dann ist es i.d.R. sinnvoll mit ''[[:de:create:functions:setpageorder]]'' anstatt ''[[:de:create:functions:gotopage]]'' zu arbeiten: Je früher SoSci Survey im Fragebogen-Verlauf Bescheid weiß, dass Seiten übersprungen werden, desto akkurater kann der Fortschrittsbalken angepasst werden.


===== Praxis-Beispiel: Ja-Nein-Filter =====

Bevor Filter und deren Funktion ausführlich erklärt werden, hier zunächst die Lösung für jene die wenig Zeit haben. Ein Ja-Nein-Filter ist vermutlich der häufigste Einsatz für Filter.


**Beispiel 1:** Antwortet ein Teilnehmer mit "ja", soll eine zusätzliche Frage angezeigt werden.

**Beispiel 2:** Antwortet ein Teilnehmer mit "nein", werden mehrere Seiten übersprungen.


==== Vorbereitung ====

Folgende Informationen benötigen Sie für den Einbau des Filters:

  * Die Kennung der Variable, in der die Ja-Nein-Antwort gespeichert wird,
  * die Antwortcodes der Frage und
  * die Kennung der Frage, welche bei einem "ja" angezeigt werden soll (Beispiel 1)
  * die Seite, wo es bei einem "nein" weiter geht (Beispiel 2)

Die Kennung der Variable finden Sie in der **Variablen-Übersicht**. Dort steht etwa folgendes:

  [PT01] Dropdown-Auswahl
  Fernseh-Besitz
  
  PT01 Fernseh-Besitz
     1 = ja
     2 = nein
    -9 = Keine Antwort

Die Variable heißt also PT01, der Antwortcode für "ja" ist 1 und der Code für "nein" ist 2. Im Idealfall haben Sie für die Filterfrage festgelegt, dass der Teilnehmer diese beantworten muss (Karteireiter //Prüfung der Antwort//). Dann kann der Code -9 nämlich nicht mehr vorkommen.

**Hinweis:** Sollten dort mehrere Variablen stehen, z.B. ''PT01_01'' und ''PT01_02'', so überprüfen Sie den Typ der Frage. Es ist wichtig, dass Sie für eine einfache Auswahl den Fragetyp "Auswahl" oder "Dropdown-Auswahl" verwenden -- __nicht__ aber "Mehrfachauswahl", wenn Sie keine solche erlauben möchten.


==== PHP-Code einfügen ====

Der Filter wird nun als //PHP-Code// beim **Fragebogen zusammenstellen** eingegeben. Und zwar an der Stelle wo der Filter aktiv werden soll (also wo die zweite Frage angezeigt wird bzw. wo gesprungen wird). Dazu zieht man mit der Maus einfach ein //PHP-Code// von rechts in die Fragebogen-Seite hinein ([[::de:create:php|Einführung in PHP-Code]]).

**Wichtig:** Ein PHP-Filter kann __niemals__ auf derselben Seite stehen, auf der die Filterfrage steht (also jene Frage, auf deren Antwort Sie sich beziehen, im Beispiel ''PT01''). SoSci Survey verarbeitet den Fragebogen immer seitenweise, um den Teilnehmer eine komplette Fragebogen-Seite anzuzeigen. In dem Moment, wo die Seite mit der Filterfrage verarbeitet wird, kann der Teilnehmer diese Frage noch gar nicht beantwortet haben -- und entsprechend kann ein Filter noch nicht auf die Antwort reagieren (''[[:de:create:functions:value|value()]]'').


===== Häufige Anwendungsfälle =====

Wenn Sie mit der PHP-Funktion ''[[:de:create:functions:value]]'' umgehen können, lassen sich damit gleich eine Reihe von Filtern implementieren.


==== Eine Frage anzeigen oder nicht ====

Folgender PHP-Code überprüft mittels ''[[:de:create:functions:value|value()]]'', ob für die Variable ''PT01'' der Antwortcode ''1'' gespeichert wurde. Falls dem so ist, wird mittels ''[[:de:create:functions:question|question()]]'' die Frage ''AB01'' angezeigt.

Beachten Sie das doppelte Gleichheitszeichen (''=='') hinter dem ''value()''-Befehl.

<code php>
if (value('PT01') == 1) {
  question('AB01');
}
</code>

**Tipp:** Dieser Filter lässt sich auch ganz ohne PHP-Code als [[:de:create:simple-filters|Frage-Filter]] realisieren.

**Tipp:** Wenn Sie sich ein wenig Tipparbeit sparen möchten, dann ziehen Sie die Frage, die angezeigt werden soll, einfach von rechts in den PHP-Code hinein. Anschließend können Sie noch die Anzeigeoptionen der Frage anpassen. Nachdem Sie mit dem grünen Häkchen bestätigt haben, wird der PHP-Code für die Frage unten im //PHP-Code// Element angehängt. Dann müssen Sie den Code nur noch an die richtige Stelle (also zwischen die geschweiften Klammern) verschieben.

**Tipp:** Zwischen die geschweiften Klammern ''{'' und ''}'' können Sie auch mehrere ''question()''-Befehle schreiben.


==== Unterschiedhliche Fragen anzeigen ====

Abhängig von einer früheren Antwort (oder einer Gruppenzuordnung, z.B. durch [[:de:create:randomization|Randomisierung]]) soll Frage A oder Frage B abgezeigt werden?

Im folgenden Beispiel wird abhängig von der Antwort auf eine Auswahlfrage (AF01) entweder die Frage FF01 oder FF02 angezeigt.

<code php>
if (value('AF01') == 2) {
  question('FF01');
} else {
  question('FF02');
}
</code>

**Wichtig:** Die Frage FF01 und FF02 __dürfen nicht__ auf die Seite gezogen werden. Sonst werden sie doppelt angezeigt: Einmal durch den ''question()'' Befehl und einmal dadurch, dass sie auf die Seite gezogen wurden.

Wenn die Frage FF01 für mehrere Antworten in AF01 angezeigt werden soll, dann kommt der [[:de:create:filter-boolean|logische Operator]] ''or'' zum Einsatz.

<code php>
if ((value('AF01') == 2) or (value('AF01') == 4)) {
  question('FF01');
} else {
  question('FF02');
}
</code>

Es kann auch aus mehr als 2 Fragen ausgewählt werden.

<code php>
if (value('AF01') == 1) {
  question('FF01');
} elseif ((value('AF01') == 2) or (value('AF01') == 4)) {
  question('FF02');
} else {
  question('FF03');
}
</code>


==== Inhalte variieren ====

Anstatt von Fragen können auch Inhalte, z.B. Stimuli variiert werden. Mehr dazu auch im Kapitel [[:de:create:randomization]]. Im folgenden Beispiel wird -- abhängig vom Code in Variable AF01 -- entweder der Textbaustein mit der Kennung "stimulus1" oder "stimulus2" angezeigt.

<code php>
if ((value('AF01') == 2) or (value('AF01') == 4)) {
  text('stimulus1');
} else {
  text('stimulus2');
}
</code>


==== Seiten überpringen ====

Beim **Fragebogen zusammenstellen** wählen Sie nun die Seite, bei der es bei einem "nein" weitergehen soll. Für diese Seite tragen Sie eine //Kennung// ein, z.B. "keinTV" ([[#eine_kennung_fuer_eine_seite_im_fragebogen_vergeben|Eine Kennung für eine Seite vergeben]]).

Anschließend gehen Sie auf die Seite, wo Sie das //PHP-Code// Element für den Filter platziert haben (s. oben). Schreiben Sie Folgendes hinein:

<code php>
if (value('PT01') == 2) {
  goToPage('keinTV');
}
</code>

Dieser Code prüft mittels ''[[:de:create:functions:value|value()]]'', ob in der Variable ''PT01'' der Wert ''2'' gespeichert wurde. Wenn dem so ist, springt die Verarbeitung mitels ''[[:de:create:functions:gotopage|goToPage()]]'' direkt zu jener Seite mit der Kennung "keinTV". Nachfolgende Inhalte der aktuellen Seite werden ignoriert.

**Tipp:** Lesen Sie auch den Rest des Kapitels. Es lohnt sich.


===== Das Schlüsselwort IF =====

Filter werden in Ihrem Fragebogen durch WENN-DANN-SONST-Beziehungen in einem Element //PHP-Code// programmiert. In der Programmiersprache PHP heißen die entsprechenden Schlüsselwörter **if** (WENN-DANN) und **else** (SONST).

Hinter **if** steht in Klammern eine so genannte Bedingung. Wenn die Bedingung erfüllt ist, dann wird der Befehl (der wiederum hinter der Bedingung steht) ausgeführt:

''**if (**Bedingung**)** Befehl''

Zusätzlich kann man durch ein **else** auch noch angeben, was zu tun ist, wenn die Bedingung nicht erfüllt ist:

''**if (**Bedingung**)** Befehl1 **else** Befehl2''

Um das Ganze übersichtlicher zu machen (und um mehrere Befehle zu erlauben) werden die Befehle in geschweifte Klammern (''{'' und ''}'') geschrieben. Die Einrückung erleichtert die Lesbarkeit.

  if (Bedingung) {
    Befehl 1
  } else {
    Befehl 2
  }
===== Fragen im Fragebogen anzeigen oder nicht =====

Zu einem Filter gehören immer zwei Dinge: Eine Ursache und eine Auswirkung auf den Verlauf des Fragebogens.

  * Die Ursache ist normalerweise eine Antwort des Befragten.
  * Die häufigste Auswirkung ist es, dass eine Frage oder ein ganzer Block von Fragen in Abhängigkeit von der Antwort angezeigt werden oder nicht.

Für das folgende Beispiel nehmen wir an, dass auf Seite 2 im Fragebogen gefragt wurde, wie hoch das monatliche Einkommen sei. Zur Auswahl standen mehrere Kategorien: 1=Kein Einkommen, 2=bis 500 EUR, u.s.w. Diese Frage ist im Folgenden die Filterfrage.

Nun ist es wichtig zu wissen, dass SoSci Survey - während Seite 2 erstellt wird - noch keine Ahnung hat, was der Befragte antworten wird. Die Seite wird zunächst komplett erstellt, dann beim Befragten angezeigt. Dieser wählt eine Option und klickt auf "Weiter". Erst mit dem Klick auf "Weiter" wird die Antwort zur Seite 2 an den Befragungsserver übermittelt und gespeichert. Direkt im Anschluss erstellt der Server Seite 3 und übermittelt diese zum Ausfüllen an den Teilnehmern.

{{fig.filters.principle.png?nolink|Prinzipielle Funktion von Filtern durch Springen}}

Das Wesentliche dabei: Eine Antwort von Seite 2 ist dem Server erst auf Seite 3 bekannt. Daher darf der Filter zur Frage frühestens auf Seite 3 erstellt werden.

Was aber nun, wenn die Fragen auf Seite 3 nur angezeigt werden sollen, wenn die erste Option ausgewählt wurde? Dann muss man ein wenig um die Ecke denken: Dazu leitet der Filter alle Befragten, die __nicht__ die erste Option gewählt haben, direkt zur Seite 4 weiter.

Nach diesem Prinzip funktionieren die meisten Filter in SoSci Survey: Man überspringt einzelne Fragen oder ganze Seiten. Unter Umständen müssen dafür gleich mehrere Filter hintereinander gehängt werden:

Zeigt man z.B. auf Seite 10 eine Mehrfachauswahl mit 5 Automarken und möchte zu den bekannten Marken jeweils 4 Fragen (über 2 Seiten) stellen, dann braucht man 5 Filter. Der erste Filter prüft auf Seite 11, ob das erste Item der Mehrfachauswahl angeklickt wurde. Falls nicht, springt er direkt weiter zu Seite 13 (Seiten 11 und 12 enthalten die Fragen zur ersten Marke). Auf Seite 13 steht der nächste Filter. Falls die zweite Marke (also das zweite Item) nicht angeklickt wurde, geht es direkt weiter zu Seite 15.

Falls die dritte Marke angekreuzt wurde, dann reagiert der Filter auf Seite 15 nicht. Es werden ganz normal die Fragen der Seite angezeigt und SoSci Survey wartet darauf, dass der Befragte auf "Weiter" klickt. Dann wird Seite 16 mit den beiden Fragen angezeigt. Erst auf Seite 17 ist der nächste Filter: Entweder er leitet den Teilnehmer direkt weiter zu Seite 19 oder eben nicht...

{{fig.filters.jump.png?nolink|Überspringen von Fragen durch Filter}}


===== Bedingungen =====

Eine Bedingung steht immer in runden Klammern. Sie kann erfüllt sein oder nicht.

Eine Bedingung kann verschiedene Formen annehmen. Die wichtigsten Form ist der Vergleich zwischen zwei Werten (z.B. zwei Zahlen):

  * ''=='' (zwei Ist-gleich-Zeichen) überprüft, ob zwei Werte gleich sind,
  * ''!='' (Ausrufezeichen und Gleichheitszeichen) überprüft, ob zwei Werte ungleich sind,
  * ''>'' (größer als) überprüft, ob der erste Wert größer ist als der zweite,
  * ''<'' (kleiner als) prüft entsprechend, ob der erste Wert kleiner ist als der zweite.

**Vorsicht:** Um die Gleichheit zu überprüfen muss unbedingt ein doppeltes Gleichheitszeichen (''=='') verwendet werden! Ein einfaches Gleichheitszeichen (''='') würde versuchen, einer Variablen einen Wert zuzuweisen.

**Tipp:** Wenn Sie prüfen möchten, ob eine Variable z.B. den Wert 1 __oder__ 2 hat, lesen Sie bitte [[filter-boolean|Mehrere Bedingungen verknüpfen]].


===== Seiten überspringen =====

Noch einmal zurück zum einfachen Beispiel: Auf Seite 1 des Fragebogens wird die Frage AB01 gestellt (eine Auswahl zum Einkommen). Ziel ist es, dass die Fragen EK01 und EK02 nur dann gestellt werden, wenn der Befragte bei der Frage AB01 die erste Option auswählt.

Im Umkehrschluss heißt das: Wenn der Befragte eine Antwortoption größer als 2 (Einkommen bis 500 EUR) wählt, dann wird Seite 3 übersprungen.

Das folgende Beispiel beschreibt einen Fragebogen mit 3 Seiten. Auf Seite 2 wird geprüft, ob die Person mehr als 500 EUR Einkommen angegeben hat. Wenn nicht, dann wird der Rest der Seite übersprungen und es geht direkt auf Seite 3 weiter.

**Tipp:** Wie man PHP-Code im Fragebogen einfügt beschreibt das Kapitel [[php|Einführung in PHP-Code]]. Die Kurzfassung: Für Filter braucht man PHP-Code. Dafür zieht man ein Element //PHP-Code// (über der Auswahlliste mit Fragen) in die Seite hinein.

**Tipp:** Die Fragen muss man natürlich nicht als PHP-Befehle einfügen, man kann sie beim Zusammenstellen des Fragebogens einfach aus der Auswahl in die Seite ziehen ([[php#bequemer_programmieren_fragen_und_texte|Bequemer programmieren]]).

==== Eine Kennung für eine Seite im Fragebogen vergeben ====

Für die dritte Seite muss man als Kennung "tvkonsum" angeben, nur so kann man mit ''[[:de:create:functions:gotopage|goToPage()]]'' direkt zur Seite 3 springen.

Die Kennung kann man beim Zusammenstellen des Fragebogens festlegen, wenn man die Seite angeklickt hat: Einfach oben links auf der Seite eintragen.

{{scr.filters.page_ident.png?nolink|Eine Seiten-Kennung zuweisen}}

==== Umsetzung mit möglichst wenig PHP-Code ====

{{scr.filters.simple.page1.png?nolink|Seite 1}}

{{scr.filters.simple.page2.png?nolink|Seite 2}}

{{scr.filters.simple.page3.png?nolink|Seite 3}}

==== Umsetzung mit möglichst viel PHP-Code ====

Normalerweise wird man PHP-Code im Fragebogen nur dort verwenden, wo man ihn braucht –- so wie oben. Weil sich die Inhalte von Fragebogen-Seite aber so schön kurz im PHP-Code darstellen lassen, werden Sie in der Anleitung auch häufiger die folgende Form finden. Inhaltlich ist die Funktion zur obigen Umsetzung mit wenig PHP-Code identisch.

**Seite 1**
<code php>
question('AB01');  // Auswahl monatliches Einkommen
</code>

**Seite 2**
<code php>
if (value('AB01') > 2) {
  goToPage('tvkonsum');  // Springt direkt weiter zur Seite 3
}
question('EK01');  // Studienfinanzierung
question('EK02');  // Nebeneinkünfte
</code>

**Seite 3 mit der Kennung "tvkonsum"**
<code php>
// Seite 3 muss die Kennung "tvkonsum" haben
question('TK01');  // Tägliche Fernsehdauer
question('TK02');  // Lieblingssender
</code>

**Wichtig:** Fragen können in die Fragebogen-Seite gezogen oder mittels des Befehls ''question()'' im PHP-Code eingebunden werden. Das gleichzeitige Einbinden als Frage-Elemente und im PHP-Code sorgt dafür, dass die Frage doppelt angezeigt wird und Sie entsprechende Fehlermeldungen erhalten. 

==== Tipps zur Funktion value() ====

  * Es gibt zwei einfache Möglichkeiten um herauszufinden, welcher Wert für eine Antwort gespeichert wird. Einmal die **Variablen-Übersicht** und zum zweiten den Debug-Modus beim Testen eines Fragebogens ([[questionnaire|Fragebogen zusammenstellen]]).
  * Die Funktion ''[[:de:create:functions:value|value()]]'' liefert die Antwort eines Befragten zurück. Allerdings funktioniert das erst, wenn der Befragte die Antwort mit einem Klick auf "Weiter" abgeschickt hat -- also erst auf der nächsten Seite.
  * Alle Funktionen, die speziell von SoSci Survey bereitgestellt werden, sind unter [[functions|PHP-Funktionen]] aufgelistet und werden dort erklärt.

===== Anweisungs-Blöcke =====

Im Beispiel folgt auf die IF-Bedingung eine geschweifte Klammer (''{''). Geschweifte Klammern dienen in PHP dazu, mehrere Funktionen/Befehle (z.B. mehrere Fragen) zusammenzufassen. Es ist generell sinnvoll, die Anweisung(en) hinter eine IF-Konstruktion in geschweifte Klammern zu setzen - wenn man keine Klammern verwendet und weitere Befehle einfügt, dann sucht man oft sehr lange nach dem Fehler.

**Tipp:** Nutzen Sie für jeden Anweisungsblock geschweifte Klammern und rücken Sie den PHP-Code wie im Beispiel mit Leerzeichen ein (die Eingabefelder haben mit Tabulatoren leider noch Probleme). So verlieren Sie auch bei komplexeren Filtern nicht den Überblick und vermeiden Fehler.

**Beispiel für Seite 2**
<code php>
if (value('AB01') <= 2) {
  question('AB02');  // Studienfinanzierung
  question('AB03');  // Nebeneinkünfte
} else {
  question('AB04');  // Arbeitszeit pro Woche
  question('AB05');  // Anstellungsverhältnis
  question('AB06');  // Befristung
}
question('AB07');  // Diese Frage sehen wieder alle
</code>

===== Schritt für Schritt =====

Dieser Abschnitt erklärt nun Schritt für Schritt die Programmierung eines kleinen Filters.

==== Die Filterfrage ====

Zurück zur Anwendung von Wenn-Dann-Bedingungen als Filterfragen: Jede Frage kann prinzipiell zur Filterfrage werden. Und zwar immer dann, wenn die Antwort auf die Frage in einer Bedingung verwendet wird. Zunächst muss also eine normale Frage gestellt werden.

  - Legen Sie im **Fragenkatalog** eine neue Rubrik an, //Kennung// "TF", //Beschreibung// "Test für Filter"
  - In der Rubrik legen Sie eine //neue Frage// an, //Beschreibung// "Filter-Auswahl", //Typ// "Auswahl"
  - Tragen Sie Folgendes in die Frage TF01 ein:
    - //Fragetext// "Haben Sie zu Hause einen Internet-Anschluss?",
    - //Die Frage muss vollständig beantwortet werden// "Ja".
    - Dann bitte auf //Speichern// klicken und
    - bei der //Schnell-Eingabe für Items// zwei Items eintragen: "Ja" und "Nein". 

{{scr.filters.question_yes_no.png?nolink|Eine Auswahl als Filterfrage}}

Werfen Sie nun einen Blick in die **Variablen-Übersicht**. Dort finden Sie folgenden Eintrag

{{scr.filters.varlist.select.png?nolink|Auswahl in der Variablen-Übersicht}}

Die Kennung für die Frage lautet TF01. Bei der Frage handelt es sich um eine Auswahl, deshalb werden die Antworten direkt unter der Kennung TF01 gespeichert und nicht -- wie z.B. bei einer Skala -- in den einzelnen Items. Die Variablen-Übersicht verrät auch, welche Werte TF01 annehmen kann: ''1'' für die Antwort "Ja" und ''2'' für die Antwort "Nein". Außerdem ist noch ''-9'' (die Frage wurde nicht beantwortet) möglich. Tatsächlich sollte das aber nicht vorkommen, weil wir ja eingestellt haben, dass die Frage beantwortet werden muss. Details dazu beschreibt das Kapitel [[:de:results:values|Kodierung und Rückgabewerte]].

Erstellen Sie nun unter **Fragebogen zusammenstellen** einen neuen Fragebogen, //Kennung// "filter1", //Beschreibung// "Meine erste Filterfrage".

**Tipp:** Für die Filterfrage wurde die Option **Die Frage muss vollständig beantwortet werden** aktiviert. Mit dieser Option sollte man generell sehr sparsam umgehen -- bei Filtern es aber sinnvoll, auf eine Antwort zu bestehen: Denn hier muss man ja auf Basis der Antwort etwas entscheiden.

==== Filter zur Auswahl ====

Um die Frage TF01 nun als Filterfrage zu verwenden, benötigt man den Befehl ''[[:de:create:functions:value|value()]]''. Damit wird abgefragt, welche Antwort im Fragebogen ausgewählt wurde. Konkret würde ''%%value('TF01')%%'' also 1 oder 2 liefern (sie muss ja beantwortet werden). Voraussetzung ist, dass die Frage bereits gestellt und die Antwort mit dem Klick auf //Weiter// abgeschickt und gespeichert wurde.

Wenn die Frage TF01 auf Seite 1 des Fragebogens gestellt wird, so würde ein PHP-Code auf Seite 2 beispielsweise aussehen wie folgt:

<code php>
if (value('TF01') == 1) {
  question('IN01');  // Art des Internetanschluss: Analog, ISDN, DSL, etc.
  question('IN02');  // Geschäftliche Nutzung des Anschlusses zu Hause?
  question('IN03');  // Internet-Anbieter / Serviceprovider
}
question('AB01'); // Beschäftigungsverhältnis
</code>

Die Bedingung überprüft, ob die Antwort gleich 1 war, ob also "Ja" ausgewählt wurde. Falls diese Bedingung erfüllt ist, werden auf Seite 2 drei Fragen zur heimischen Internet-Nutzung gestellt (IN01 bis IN03).

Alle Befragten -- egal ob sie einen Internetanschluss zu Hause haben oder nicht -- erhalten außerdem die Frage AB01. Personen ohne Anschluss sehen auf Seite 2 also nur diese eine Frage -- Personen mit Anschluss insgesamt 4 Fragen.

==== Verwendung von else ====

Durch Verwendung von ''else'' könnte zusätzlich z.B. gefragt werden, warum man zu Hause keinen Anschluss hat:

<code php>
if (value('TF01') == 1) {
  question('IN01');  // Art des Internetanschluss: Analog, ISDN, DSL, etc.
  question('IN02');  // Geschäftliche Nutzung des Anschlusses zu Hause?
  question('IN03');  // Internet-Anbieter / Serviceprovider
} else {
  question('IN04');  // Warum kein Interanschluss zu Hause?
}
question('AB01'); // Beschäftigungsverhältnis |

===== Seiten überspringen =====

Verwendet man keinen ''else''-Teil, so kann es vorkommen, dass der Befragte eine leere Seite zu Gesicht bekommt. Falls der Befragte auf Seite 1 mit "nein" antwortet, würden ihm im folgenden Beispiel auf Seite 2 keine Fragen, sondern nur eine leere Seite angezeigt:

<code php>
if (value('TF_01') == 1) {
  question('IN_01');  // Art des Internetanschluss: Analog, ISDN, DSL, etc.
  question('IN_02');  // Geschäftliche Nutzung des Anschlusses zu Hause?
  question('IN_03');  // Internet-Anbieter / Serviceprovider
}
</code>

In diesem und vielen anderen Fällen verwendet man besser den Befehl ''[[:de:create:functions:gotopage|goToPage()]]''. Dieser Befehl springt direkt weiter zur angegeben Seite im Fragebogen. Im obigen Beispiel ist Seite 2 nur für Personen mit Internetanschluss zu Hause relevant. Alle anderen sollten direkt zu Seite 3 springen.

Damit der ''goToPage()''-Befehl funktioniert, muss man dem Sprungziel (also der Seite, zu der man springen will) eine Kennung geben. Im folgenden Beispiel hat Seite 3 die Kennung ''%%"nutzung"%%''. Zur folgenden Seite kann man auch mit der Kennung ''%%"next"%%'' springen.

Die folgenden Beispiele haben dasselbe Ergebnis, denn nach dem ''goToPage()'' wird auf der Seite nichts mehr ausgeführt. Der ''goToPage()''-Befehl verlässt die alte Seite und kommt nicht wieder.

** Möglichkeit 1: Weiterspringen, wenn nichts zu fragen ist **
<code php>
if (value('TF_01') == 1) {
  question('IN_01');  // Art des Internetanschluss: Analog, ISDN, DSL, etc.
  question('IN_02');  // Geschäftliche Nutzung des Anschlusses zu Hause?
  question('IN_03');  // Internet-Anbieter / Serviceprovider
} else {
  goToPage('nutzung');  // Gleich weiter zu Seite 3 mit Kennung "nutzung"
}
</code>

** Möglichkeit 2: Überspringen der irrelevanten Fragen **
<code php>
if (value('TF01') != 1) {  // Man könnte hier auch prüfen: value() == 2
  goToPage('nutzung');  // Gleich weiter zu Seite 3 mit Kennung "nutzung"
}
question('IN_01');  // Art des Internetanschluss: Analog, ISDN, DSL, etc.
question('IN_02');  // Geschäftliche Nutzung des Anschlusses zu Hause?
question('IN_03');  // Internet-Anbieter / Serviceprovider
</code>

So wie im zweiten Beispiel beschrieben, können natürlich auch mehrere Seiten übersprungen werden.

**Tipp:** Nach Abfrage einiger Eckdaten sehen Sie, dass ein Teilnehmer nicht zur Zielgruppe der Befragung gehört? [[#screenoutungeeignete_teilnehmer_filtern|Screenout: Ungeeignete Teilnehmer filtern]]

**Tipp:** Seit SoSci Survey Version 2.2.02 werden leere Seiten standardmäßig übersprungen. Sie müssen sich um die Problematik leerer Seiten also oftmals keine Gedanken mehr machen.

===== Die richtige Kennung =====

Im Beispiel haben Sie eine Auswahl verwendet. Eine einfache Auswahl speichert nur einen einzigen Wert (nämlich die ausgewählte Option), der mit ''value()'' anhand der Frage-Kennung (z.B. TF01) abgefragt wird.

Falls Sie Skalen, Texteingaben oder eine Mehrfachauswahl verwenden, müssen Sie aber die Kennung des entsprechenden Items (z.B. TF02_02) und nicht die Kennung der Frage verwenden.

{{scr.filters.multiselect.png?nolink|Beispiel für eine Mehrfachauswahl TF02l}}

Diese Mehrfachauswahl mit der Kennung TF02 hat 4 Items. Das Item mit der Kennung 3 (TF02_03) erfragt, ob der Befragte einen DSL-Zugang hat. Die richtige Kennung finden Sie immer in der **Variablen-Übersicht**.

{{scr.filters.varlist.checkbox.png?nolink|Variablen einer Mehrfachauswahl}}

Die folgende Anzeige erhält man im Debug-Modus, wenn man auf Seite 1 (auf der Frage TF02 angezeigt wird) auf //Weiter// klickt. Im Beispiel war das erste und das dritte Item angekreuzt.

{{scr.filters.debug.png?nolink|Debug-Information beim Testen des Fragebogens}}

In einer Mehrfachauswahl kann jedes Item den Wert 1 (nicht ausgewählt) oder 2 (ausgewählt) annehmen. Möchte man nun auf Seite 2 filtern, ob der Befragte einen DSL-Anschluss hat, so sieht der PHP-Code aus wie folgt:

** Filter für eine Mehrfachauswahl **
<code php>
if (value('TF02_03') == 2) {  // Wurde Item 2 angekreuzt?
  question('IN10');  // Geschwindigkeit des Anschlusses
  question('IN11');  // Nutzung von Videokonferenzen
} else {
  question('IN09');  // Zuhause einen anderen Anschluss?
}
</code>

Ein großer Nachteil der Mehrfachauswahl ist, dass man nicht überprüfen kann, ob sie der Befragte beantwortet hat. Schließlich kann auch kein Kreuzchen eine korrekte Antwort sein.

Das Problem kann man umgehen, wenn man statt einer Mehrfachauswahl eine 2-stufige Skala verwendet. Beschriftet man das Minimum mit "nein" und das Maximum mit "ja" (in der Abbildung ist die //Richtung der Skala// absteigend, die //Ausrichtung der Beschriftung// mittig), so erhält man für jedes Item denselben Wert wie in der Mehrfachauswahl (1=nein, 2=ja).

{{scr.filters.example_scale.png?nolink|Variablen in einer Skala}}

Im Kapitel [[filter-itemcount|Mindestens ein Item]] werden einige Tricks erklärt, wie man mit Skalen in Filtern umgehen kann.

===== Screenout: Ungeeignete Teilnehmer filtern =====

Falls sich Ihr Fragebogen nur an eine bestimmte Zielgruppe richtet, möchten Sie ungeeignete Teilnehmer vielleicht nach einigen Screening-Fragen frühzeitig verabschieden. Stellen Sie dazu die Screening-Fragen auf den ersten Seiten im Fragebogen und verwenden Sie anschließend einen gewöhnlichen Filter.

  * Mit dem Befehl ''[[:de:create:functions:gotopage#interview_beenden|goToPage('end')]]'' können Sie einen Teilnehmer direkt zum Ende des Fragebogens schicken. Das interview wird dabei als "abgeschlossen" markiert und der Teilnehmer sieht die Verabschiedung der letzten Seite.
  * Mit einer Kombination der Befehle ''[[:de:create:functions:text|text()]]'' und ''[[:de:create:functions:buttonhide|buttonHide()]]'' können Sie eine individuelle Verabschiedung anzeigen. Das Interview wird dabei __nicht__ als "abgeschlossen" markiert. Den Verabschiedungstext speichern Sie als Textbaustein unter **Textbausteine und Beschriftung**.

<code php>
// Screenout mit individuellem Text
if (value('AB01') > 3) {
  text('screenout');  // Verabschiedung anzeigen
  buttonHide();  // Weiter-Knopf ausblenden
  pageStop();  // Falls unter dem Filter noch Inhalte auf der Seite folgen
}
</code>

**Tipp:** Sie können durch Wiederholung des Filters unterschiedliche Variablen überprüfen. Mittels bool'scher Operatoren können Sie in einem Filter aber auch mehrere Variablen zugleich prüfen ([[filter-boolean|Mehrere Bedingungen verknüpfen]]).

===== Tipps zu Filtern =====

Filter sind ein enorm flexibles Werkzeug. Sie können bei Bedarf sogar verschachtelt werden oder komplexe Bedingungen prüfen. Mehr dazu in weiteren Kapiteln (s. unten).

Leider funktionieren Filter gerade am Anfang nicht immer so, wie man es gerne hätte. Wenn es nicht klappt, dann gibt es einige einfache Möglichkeiten, dem Fehler auf die Spur zu kommen:

  * Sehen Sie in der **Variablen-Übersicht** nach, ob die Kennung der Variable stimmt.
  * Der Filter darf nicht (!) auf derselben Seite stehen wie die Filterfrage. Sonst wird der Filter schon ausgeführt, bevor der Teilnehmer seine Antwort abgeschickt hat.
  * Starten Sie den Fragebogen regelmäßig im Debug-Modus. Dann verrät SoSci Survey nach jedem Klick auf //Weiter//, welcher Wert unter welcher Kennung gespeichert wurde.
  * Der Debug-Modus ist im Übrigen auch sehr hilfreich, wenn leere Seiten erscheinen oder ''goToPage()''-Befehle scheinbar unsinnige Ergebnisse liefern. Für jeden Sprung mit ''goToPage()'' erscheint in der Debug-Information eine Zeile "Erstelle Seite X".
  * Lassen Sie sich doch einfach von SoSci Survey sagen, was gerade für ein Item/eine Frage gespeichert ist.
    * Sie können sowohl den Wert anzeigen lassen, den value() zurückliefert\\ ''debug('TF02_03');''
    * wie auch die Frage beantworten lassen, ob eine Bedingung zutrifft (true) oder nicht (false):\\ ''debug(value('TF02_02') == 2);''. 
  * Das Springen zu Seiten mit ''goToPage()'' ist nur sinnvoll, wenn man dadurch Fragen auslässt. Falls Fragen alternativ gestellt werden, ist es besser, diese direkt in den IF-Block einzubinden.
  * Der Befehl ''goToPage()'' springt unmittelbar zur angegeben Seite (nicht erst nach dem Klick auf //Weiter//) und hängt die neue Seite an die aktuelle Seite an, falls dort schon Fragen angezeigt wurden.
  * Wenn man mit ''goToPage()'' zu einer anderen Seite gesprungen ist und diese Seite beantwortet wurde, dann geht es __ab dort__ ganz normal weiter.

===== Komplexere Filter =====

Mit den obigen Grundlagen lassen sich bereits die meisten Filter programmieren. Allerdings nicht alle. Die folgenden Kapitel stellen Lösungen für komplexere Filter vor:

  * [[filter-texts|Nach Texteingaben filtern]]
  * [[filter-boolean|Mehrere Bedingungen verknüpfen]] - Logische Operatoren
  * [[filter-elseif|Bedingungen mit mehr als 2 Möglichkeiten]] - 1, 2 oder 3
  * [[filter-itemcount|Mindestens ein Item ausgewählt?]] - Schleifen
  * [[filter-items|Items in eine anderen Frage übernehmen]] - Arrays