0 votes
in SoSci Survey (dt.) by s295460 (160 points)
edited by SoSci Survey

Liebe alle,

ich habe eine Frage zur Pflichtfeld-Deklaration von dynamisch generierten Fragen.
Der aktuelle Code generiert u.a. auf Basis der Datenbank Variablen je nach Zusammensetzung einer Familie, z. B.:

$key = caseSerial();
$info = false;
if ($key) {
    $info = dbGet($key);
}

$anzkinder = 0;
if ($info && isset($info[9])) {
    $anzkinder = (int)$info[9];
}
$anzkinder = max(2, min(5, $anzkinder));

$variante = (int) value('BA01');

$anzeltern = 0;
if ($variante === 1) {
    $anzeltern = (int) value('EF02'); 
} elseif ($variante === 2) {
    $anzeltern = (int) value('EF01'); 
}
$anzeltern = max(1, min(5, $anzeltern));

$et = 5;
if ($variante != 1) {
    $index = ($et - 1) * 4 + ($anzkinder - 1);
    $itemID = 'EG' . str_pad($index, 2, '0', STR_PAD_LEFT);
    question($itemID);
}

Ich habe versucht, auf der nächsten Fragebogenseite (unsichtbare Seite, hier liegt nur der Code, um Pflichtfelder zu deklarieren) das jeweilige dynamisch generierte Item als Pflichtfrage zu deklarieren und die Seite bei fehlender Eingabe zu wiederholen:

$key = caseSerial();
$info = false;
if ($key) {
    $info = dbGet($key);
}

$anzkinder = 0;
if ($info && isset($info[9])) {
    $anzkinder = (int)$info[9];
}
$anzkinder = max(2, min(5, $anzkinder));

$variante = (int) value('BA01');

$anzeltern = 0;
if ($variante === 1) {
    $anzeltern = (int) value('EF02'); 
} elseif ($variante === 2) {
    $anzeltern = (int) value('EF01'); 
}
$anzeltern = max(1, min(5, $anzeltern));

$et = 5;
if ($variante != 1) {
    $index = ($et - 1) * 4 + ($anzkinder - 1);
    $itemID = 'EG' . str_pad($index, 2, '0', STR_PAD_LEFT);
    question($itemID);
}


if ($itemID && (value($itemID) == '-9' || value($itemID) == '' || value($itemID) == 'NA')) {
    markFail($itemID);
    repeatPage('TX68');
}

Leider funktioniert das nicht ganz wie erwartet. Anders als an anderen Punkten im Fragebogen wird die Seite (33) nicht mit meiner Fehlermeldung 'TX68' wiederholt. Der Fragebogen springt stattdessen zur nächsten sichtbaren Seite (35) und zeigt das unbearbeitete Item der letzten Seite (33) oben auf der neuen Seite (35) ohne Fehlermeldung. Wenn ich das Item weiterhin nicht bearbeite, gibt es natürlich auch keine weitere Fehlermeldung o.ä., d.h. es ist praktisch kein Pflichtfeld.
Wenn ich die Zeile "question($itemID);" entferne (denn in meinen anderen Pflichtfeld-Deklarationen habe ich aufgrund von möglichen Überschreibungen nach Möglichkeit auch nicht damit gearbeitet), springt der Fragebogen nur zur nächsten sichtbaren Seite (35) und es gäbe gar keine Möglichkeit, das Item noch zu bearbeiten.
Auch ein expliziter Aufruf wie "repeatPage('A405', 'TX68')" bzw. "repeatPage('A405')" zeigt keinen Effekt.

Meine Frage ist nun, wo mein Fehler liegt und ob es vielleicht einen anderen Ansatz gibt, um dynamisch generierte Fragen in PHP korrekt als Pflichtfeld zu deklarieren?

Vielen Dank und liebe Grüße!

by SoSci Survey (357k points)
Zwei Rückfragen dazu:

1) Haben Sie einmal probiert, einfach die Fragen ganz regulär als Pflichtfragen zu definieren?

2) Könnte es sein, dass Sie diesen Teil

if ($itemID && (value($itemID) == '-9' || value($itemID) == '' || value($itemID) == 'NA')) {
    markFail($itemID);
    repeatPage('TX68');
}

eigentlich an die Stelle setzen möchten, wo aktuell noch

question($itemID);

steht?
by s295460 (160 points)
Vielen Dank für die schnelle Rückmeldung!
Zu den Rückfragen:
1) Ja, aber da diese Fragen nicht in jedem Fall auf der Seite angezeigt werden, kommt es so zu Problemen beim Absenden der Seite.
2) Ich hoffe, dass ich das richtig verstanden habe. Ich habe den folgenden Code ausgetestet, mit der If-Clause verschachtelt statt der Fragenanzeige:

if ($variante != 1 && $anzkinder >= 2) {
    $index = ($anzeltern - 1) * 4 + ($anzkinder - 2) + 1;
    $itemID = 'EG' . str_pad($index, 2, '0', STR_PAD_LEFT);

    if ($itemID && (value($itemID) == '-9' || value($itemID) == '' || value($itemID) == 'NA')) {        markFail($itemID);
        repeatPage('TX68');
    }
}

Leider führt das zu denselben Problemen wie vorher.

Noch einmal vielen Dank!

1 Answer

0 votes
by SoSci Survey (357k points)

1) Ja, aber da diese Fragen nicht in jedem Fall auf der Seite angezeigt werden, kommt es so zu Problemen beim Absenden der Seite.

Auf Basis der obigen Informationen würde ich vermuten, dass die Anzeige der Fragen auschließlich durch den PHP-Code gesteuert wird. Unstimmigkeiten mit Pflichtfragen müssten Sie m.E. nur befürchten, wenn die Fragen dynamisch mittels JavaScript-Code (also im Browser, nicht serverseitig mittels PHP-Code) ausgeblendet würde.

Falls Sie den Code dennoch weiter debuggen möchten, dann posten Sie bitte zusätzlich noch die vollständige Debug-Information für die Seite.

Meines Erachtens ist Ihre Code aber ohnehin noch nicht ganz optimal, und das betrifft wahrschienlich auch schon die vorige Seite. Und zwar für die Auswertung. Die Antworten landen - je nach der Anzahl der Eltern und Kinder in ganz unterschiedlichen Fragen/Variablen. Ich würde dringend (!) empfehlen, dass Sie zunächst überlegen, wie die Auswertung genau erfolgen soll und welche Datenstruktur Sie dafür benötigen. Sonst sitzen Sie am Ende vor den Daten und müssen stundenlang umstrukturieren.

by s295460 (160 points)
Vielen, vielen Dank für Ihre Einschätzung und die Hinweise! Ich nehme das gerne so auf und werde überlegen, wie wir am besten vorgehen.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...