====== loopToPage() ======

''int **loopToPage**(string //Seitenkennung//, int //Wiederholungen//)''

Die Funktion ''loopToPage()'' sorgt dafür, dass die Seiten von der aktuellen Seite zur Seite mit der Kennung //Seitenkennung// mehrfach angezeigt werden und zwar so häufig, wie in //Wiederholungen// angegeben.

Die Funktion gibt an, wie häufig die Seiten bereits wiederholt wurden. Beim ersten Durchlauf also 0, beim zweiten Durchlauf 1 u.s.w.

**Wichtig:** Die Funktion ''loopToPage()'' kann nicht parallel mit ''loopPage()'', ''setNextPage()'' oder ''setPageOrder()'' verwendet werden.

  * //Seitenkennung// Die Kennung der letzten Seite der Abfolge von Seiten, die wiederholt werden sollen ([[:de:glossary#seitenkennung|Seitenkennung]]).
  * //Wiederholungen// Die Anzahl, wie oft die Abfolge der Seiten wiederholt werden soll.

**Hinweis:** Verwenden Sie die Funktion ''loopIndex()'', um innerhalb der Wiederholungen zu ermitteln, welche Wiederholung gerade läuft.

**Hinweis:** Die Funktion ''loopToPage()'' erlaubt die Wiederholung von gleichartigen "Frageblöcken", wobei die Fragen entsprechend oft im Fragenkatalog angelegt werden müssen. Wenn mehrere Fragen mehrfach wiederholt werden sollen, kann eine [[:de:create:multilevel]] die bessere Lösung darstellen.

===== Beispiel: Seite mit unterschiedlichen Fragen wiederholen =====

Sie möchten im Fragebogen die Seiten 5 bis 8 insgesamt 3-mal wiederholen. Dabei sollen jeweils andere Fragen angezeigt werden.

  * Geben Sie der Seite 8 die Kennung "loopend" (Sie können die Kennung frei wählen)
  * Platzieren Sie auf Seite 5 den folgenden PHP-Code ([[:de:create:php]])

<code php>
loopToPage('loopend', 3);
</code>

Nun möchten Sie, dass im ersten Durchgang die Fragen ''A001'' bis ''A005'' angezeigt werden. Im zweiten Durchgang sollten die Fragen ''A101'' bis ''A105'' angezeigt werden und im dritten Durchgang die Fragen ''A201'' bis ''A205'' (die Fragen wurden in Rubrik ''A0'' angelegt und anschließend wurde die Rubrik 2-mal kopiert, indem sie als Datei heruntergeladen und dann importiert wurde).

Platzieren Sie auf Seite 5 folgenden PHP-Code. Er erstellt ein Array, welches die Liste der zu zeigenden Fragen enthält und macht das Array mittels ''registerVariable()'' für die folgenden Seiten verfügbar.

<code php>
$fragen = arrray(
  0 => array('A001', 'A002', 'A003', 'A004', 'A005'),
  1 => array('A101', 'A102', 'A103', 'A104', 'A105'),
  2 => array('A201', 'A202', 'A203', 'A204', 'A205')
);
registerVariable($fragen);
</code>

Um nun die ersten beiden Fragen auf der ersten Seite (Nr. 5) anzuzeigen, ergänzen Sie den Code von ''loopPage()'' wie folgt:

<code php>
$i = loopToPage('loopend', 3);
// Nun den Teil aus $fragen abrufen, der für die jeweilige Runde relevant ist
$set = $fragen[$i];
// Die ersten beiden Fragen davon anzeigen
question($set[0]);
question($set[1]);
</code>

Um dann auf Seiten 6 die nächste Frage anzuzeigen, platzieren Sie auf Seite 6 folgenden PHP-Code. Der Befehl ''loopPage()'' verrät, in welcher Runde die Seite angezeigt wird. Der restliche Code ist äquivalent zum obigen.

<code php>
$i = loopIndex();
$set = $fragen[$i];
// Die nächste Frage (Index 2) anzeigen
question($set[2]);
</code>

Den obigen Code wiederholen Sie auf Seite 7 und 8. Tauschen Sie dabei die ''2'' in der letzten Zeile durch ''3'' bzw. ''4'' aus.


===== Beispiel: Variable Anzahl an Wiederholungen =====

Sie möchten, wie in Beispiel 1, die Seiten 5 bis 8 wiederholen und haben Seite 8 dafür die Kennung "loopend" gegeben. Vorab haben Sie auf 3 mit einer Frage vom Typ "offene Nennungen" (''ON01'') bis zu 10 Markennennungen abgefragt -- und für jede Nennung des Teilnehmers sollen nun die Seiten wiederholt werden.

Im Fragenkatalog haben Sie die Rubrik ''A0'' mit den entsprechenden Fragen 9-mal, kopiert (Rubriken ''A1'' bis ''A9''). Entsprechend werden die Fragen auf Seite 5 erstmal wie folgt definiert (s. Beispiel 1):


<code php>
$fragen = arrray(
  0 => array('A001', 'A002', 'A003', 'A004', 'A005'),
  1 => array('A101', 'A102', 'A103', 'A104', 'A105'),
  2 => array('A201', 'A202', 'A203', 'A204', 'A205'),
  3 => array('A301', 'A302', 'A303', 'A304', 'A305'),
  4 => array('A401', 'A402', 'A403', 'A404', 'A405'),
  5 => array('A501', 'A502', 'A503', 'A504', 'A505'),
  6 => array('A601', 'A602', 'A603', 'A604', 'A605'),
  7 => array('A701', 'A702', 'A703', 'A704', 'A705'),
  8 => array('A801', 'A802', 'A803', 'A804', 'A805'),
  9 => array('A901', 'A902', 'A903', 'A904', 'A905')
);
registerVariable($fragen);
</code>

Mit eine FOR-Schleife lässt sich dasselbe Ergebnis auch eleganter erzielen. Alternativ können Sie also folgenden PHP-Code verwenden:

<code php>
$fragen = array();
// Alle 10 Wiederholungen anlegen (Index 0 bis 9)
for ($i=0; $i<=9; $i++) {
  $rubrik = 'A'.$i;  // A0 bis A9
  $fragen[$i] = array();
  // Die Fragen 01 bis 05 in die jeweilige Teil-Liste schreiben
  for ($f=1; $f<=5; $f++) {
    $fragen[$i][$f-1] = $rubrik.sprintf('%02d', $f);
  }
}
</code>

Nun muss auf Seite 5 geklärt werden, welche Felder der "offenen Nennungen" der Teilnehmer überhaupt ausgefüllt hat. Diese Liste wird mit ''registerVariable()'' für nachfolgende Seiten verfügbar gemacht. Zugleich wird mittels ''count()'' die Länge der Liste ermittelt, denn diese entspricht der Anzahl der Wiederholungen. Mit ''loopToPage()'' wird dann die Wiederholung der Seiten vorbereitet.

<code php>
$items = getItems('ON01', 'valid');
registerVariable($items);
$i = loopToPage('loopend', count($items));
</code>

Jetzt muss aus ''$items'' und der Nummer der Wiederholung noch das korrekte Set (also die Teilliste) aus der Liste ''$fragen'' ermittelt werden. Aus dieser Teil-Liste können dann z.B. die ersten beiden Fragen auf Seite 5 angezeigt werden:

<code php>
$id = $items[$i];  // Das $i wurde durch loopToPage() ermittelt, s. oben
$set = $fragen[$id];
// Wie in Beispiel 1
question($set[0]);
question($set[1]);
</code>

Hier noch einmal der komplette PHP-Code für Seite 5:

<code php>
$fragen = arrray(
  0 => array('A001', 'A002', 'A003', 'A004', 'A005'),
  1 => array('A101', 'A102', 'A103', 'A104', 'A105'),
  2 => array('A201', 'A202', 'A203', 'A204', 'A205'),
  3 => array('A301', 'A302', 'A303', 'A304', 'A305'),
  4 => array('A401', 'A402', 'A403', 'A404', 'A405'),
  5 => array('A501', 'A502', 'A503', 'A504', 'A505'),
  6 => array('A601', 'A602', 'A603', 'A604', 'A605'),
  7 => array('A701', 'A702', 'A703', 'A704', 'A705'),
  8 => array('A801', 'A802', 'A803', 'A804', 'A805'),
  9 => array('A901', 'A902', 'A903', 'A904', 'A905')
);
registerVariable($fragen);

$items = getItems('ON01', 'valid');
registerVariable($items);
$i = loopToPage('loopend', count($items));

$id = $items[$i];
$set = $fragen[$id];
question($set[0]);
question($set[1]);
</code>

Auf den Seite 5 bis 8 wird nur der untere Teil mit leichten Modifikationen wiederholt:

<code php>
$i = loopIndex();
$id = $items[$i];
$set = $fragen[$id];
question($set[2]);  // Index 2 zeigt Frage 3, denn die Zählung des Index beginnt bei 0
</code>


===== Beispiel: Frageblöcke wiederholen =====

Ein Block mit 5 Fragen (über 3 Seiten "blockStart" bis "blockEnd") soll für jedes Geschwister eines Teilnehmers wiederholt werden. Anschließend geht es mit der Seite "demografie" weiter.

**Hinweis:** Dieses Beispiel ist dem ersten vergleichbar, geht aber davon aus, dass Sie für jede Wiederholung eine gleichartige Rubrik im Fragebogen vorliegen haben (beim ersten Beispiel können die Fragen einer Wiederholung aus unterschiedlichen Rubriken oder alle aus derselben stammen).

Als Vorbereitung wurden die 5 Fragen in Rubrik "G1" angelegt und die Rubrik wurde 4-mal kopiert ("G2" bis "G5"), um Fälle bis zu 5 Geschwistern abbilden zu können. Darüber hinaus wurde in Frage GS01 abgefragt, wie viele Geschwister eine Person hat (1=ein Geschwister, 5=Fünf oder mehr Geschwister, -1=keine Geschwister).

Auf der ersten Seite des "Fragenblocks" ("blockStart") wird zunächst die Anzahl der Geschwister ermittelt und dementsprechend ''loopToPage()'' aufgerufen.

<code php>
$anzahl = (int)value('GS01');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
// Frageblock wiederholen
loopToPage('blockEnd', $anzahl);
// Definition der Rubriken
$rubriken = array('G1', 'G2', 'G3', 'G4', 'G5');
registerVariable($rubriken);
</code>

Auf der ersten Seite werden nun die Fragen ''01'' und ''02'' aus der jeweiligen Rubrik angezeigt.

<code php>
$i = loopIndex();
$rubrik = $rubriken[$i];

question(id($rubrik, 1));  // Fragt G101, G201, G301, ...
question(id($rubrik, 2));  // Fragt G102, G202, G302, ...
</code>

Solch ein Code findet sich entsprechend auf Seite 2 des Blocks, welcher die Frage ''03'' aus der Rubrik zeigt.

<code php>
$i = loopIndex();
$rubrik = $rubriken[$i];

question(id($rubrik, 3));  // Fragt G103, G203, G303, ...
</code>

Und auf der dritten und letzten Seite schreiben wir es für die Fragen ''04'' und ''05'' etwas kompakter:

<code php>
$rubrik = $rubriken[loopIndex()];

question(id($rubrik, 4));
question(id($rubrik, 5));
</code>