0 votes
in SoSci Survey (dt.) by s250258 (110 points)

Liebes SoSci-Survey Team.

Im Rahmen einer Studie rund um die Mediennutzung von Teilnehmenden, bin ich darauf angewiesen, dass der Fragebogen 'dynamisch' arbeitet. Konkret bedeutet das folgendes:

Im ersten Teil des Fragebogens frage ich Motivationen ab, die Teilnehmende u.U. haben, um Medien zu nutzen.

Anschliessend frage ich ab, welche Medienträger sie am häufigsten benutzen. Hierzu biete ich ihnen auch ein offenes Textfeld an, in dem sie freiwillig ein bestimmtes Medium ergänzen dürfe.

Im dritten und letzten Teil möchte ich wissen, welche dieser Medienträger sie für welche Motivationen verwenden. In dieser Frage wird ihnen auch das Medium angeboten, welches sie auf der vorherigen Seite freiwillig eingetragen haben.

Um nur die Motivationen anzuzeigen, die die Teilnehmenden als relevant für sich empfinden, habe ich den folgenden PHP-Code vorbereitet (beispielhaft, anhand Seite MN16 des Fragebogens), der auch super funktioniert:

$items = getItems('MN09', 'min', 4); // Eine Liste der Items abfragen, die in MN09 min. den Antwortcode 4 bekommen haben
question('MN16', $items); // Ausfrage MN16 nur diese Items anzeigen

Nun müsste ich jedoch auch die Antwortoptionen, also die verschiedenen Medienträger, die sie zur Verfügung haben, dynamisch gestalten. D.h. konkret von der vorherigen Seite alle Items die mehr als den Antwortcode 1 erhalten haben als Optionen anbieten. Die entsprechende Seite habe ich als geschlossener Lückentext gestaltet, d.h. die Optionen müssten als 'Bubbles' angezeigt werden. Ich habe Mühe damit, einen Code hierfür zu schreiben, da ich nicht verstehe, wie ich diese Optionen referenzieren kann (im Unterschied zu einer Variable, die ja immer mit einer Referenz versehen ist).

Zu guter Letzt habe ich auch Mühe damit, die Antwort im offenen Textfeld auf der nächsten Seite zu 'replacen'. Wenn die Teilnehmenden etwas eingeben, ist es kein Problem. Wenn es aber ein 'empty string' ist, dann erscheint die 'Bubble'/das 'Feld' der Option trotzdem, aber einfach leer. Das sieht rein ästhetisch nicht besonders hübsch aus. :-) Ich habe es z.B. so versucht, was aber nicht funktioniert:

// read participant's answer
$media = value('MN24_01');

// check if the participant entered something
if (empty($media)) {

// if nothing was entered, replace placeholder with an empty string
replace('%other%', '');

} else {

// if something was entered, replace placeholder with their answer
replace('%other%', $media);

}

Das wäre der Link zu einem Pre-Test des Fragebogens ab S. (Die Motivationen müssen ausgefüllt werden, damit die anderen Seiten anschliessend erscheinen): https://www.soscisurvey.de/wbmu/?act=SwYTxfWWIbbNo1pyjIrTGWqH

Ich habe auch Screenshots beigelegt.

Besten Dank und freundliche Grüsse

1 Answer

0 votes
by SoSci Survey (341k points)

Verstehe ich Ihre ziemlich lange Frage korrekt, dass Sie Items (Medien) aus unterschiedlichen Fragen "zusammentragen" müssen?

Dann wäre es zunächst einmal wichtig, dass jedes Medium eine eindeutige Nummer bekommt. Wenn Frage 1 also die Item-Nummern 1-10 verwendet, würden Sie in Frage 2 die Item-Nummern 11-20 verwenden. Das können Sie beim Import der Items angeben.

Die offenen Eingabefelder haben dann auch eine feste ID, und ab der zweiten Verwendung wird für dieses Medium immer derselbe Platzhalter verwendet. Dann können Sie dieses Item genauso verwenden wie alle anderen.

Wenn Ihnen das noch nicht so richtig weiterhilft, dann würde ich Sie bitten, dass Sie sich mal ein einzelnes Problem herauspicken, und wir uns erstmal dieses vornehmen. Notieren Sie gerne die Kennungen und Typen der beteiligten Fragen, dann kann ich in meiner Antwort darauf eingehen.

by s250258 (110 points)
Besten Dank für Ihre Rückmeldung und die Ausführungen. Den Platzhalter zu verwenden, ist an sich kein Problem. Meine 'dringendste' Frage ist aktuell folgende: Ich habe eine Antwortoption in der Lückentext-Frage, das als Platzhalter für ein offenes Textfeld auf der vorherigen Seite agiert. Wie schaffe ich, dass das verschwindet, wenn die Teilnehmenden der Umfrage das Textfeld gar nicht ausfüllen?
by SoSci Survey (341k points)
Auf Basis der Screenshots oben würde ich raten: Der Platzhalter wird als Item in der Folgefrage verwendet, korrekt?

In dem Fall würden Sie die anzubietenden Items in Abhängigkeit von der Texteingabe auswählen.

$items = ['1-10'];  // Die Items, die immer erscheinen sollen
if (trim(value('TX01_01')) != '') {  // TX01_01 wäre hier das Eingabefeld
  $items[] = 11;  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen
}
question('FF01', $items);  // Folgefrage mit den passenden Items anzeigen
by s250258 (110 points)
Besten Dank für die rasche Rückmeldung. Der Platzhalter wird als Antwortoption angeboten. Ich bin mir nicht sicher, ob SoSci-Survey beim Lückentext die Optionen als 'Item' bezeichnet, oder aber die Lückentexte an sich. Wenn ich den Code ausprobiere, zeigt es mir die Fehlermeldung an, dass die Frage bzw. das Eingabefeld bereits einmal abgefragt wurde. Könnte das daran liegen, dass ich das Eingabefeld mit %input% in meine vorhergehende Skala einfügen musste?
by SoSci Survey (341k points)
Ach, stimmt, Sie verwenden da ja den geschlossenen Lückentext. Bei dem sind die Items die Eingabefelder - nicht die möglichen Optionen. Versuchen sie es bitte mal wie folgt:

// Folgefrage mit den passenden Items anzeigen
show('FF01', ['filter' => $items]);
by s250258 (110 points)
Danke! Ich erhalte leider immer dieselbe Warnmeldung: "One or more variables (MN24_01) have already been asked on page 22. Please note that the answers from page 22 are shown here and that they will be subsequently replaced. If you require multiple similar questions, please create a copy of the question." bzw. "Items of the following question have been used repeatedly on this page. This inevitably results in data loss! If you need the same question more than once, please create a copy of this question. The following items are duplicates: MN24_01." Das Textfeld ist auch immer noch sichtbar.
by SoSci Survey (341k points)
Was ist MN24 denn und was ist auf Seite 22?
by s250258 (110 points)
MN24_01 ist das offene Textfeld, welches auf Seite 22 abgefragt wird. Da Seite 22 eine Skala darstellt, musste ich eine separate Frage erstellen, die ich mit %input% auf der Seite 22 einfüge und konkret bei Frage MN22_14 abfrage. Das wäre der Code mit den entsprechenden Seiten/Kennungen:

$items = ['MN22_01-MN22_13'];  // Die Items, die immer erscheinen sollen
if (trim(value('MN22_14')) != '') {  // MN22_14 ist das Eingabefeld
  $items[] = 'MN22_01-MN22_14';  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen
}
show('MN16',['filter' => $items]);  // Folgefrage mit den passenden Optionen anzeigen


MN22_14 mit MN24_01 zu ersetzen (also mit der usprünglichen Frage), habe ich schon probiert, das funktioniert leider auch nicht.
by SoSci Survey (341k points)
>  $items[] = 'MN22_01-MN22_14';  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen

Da dürfte nur stehen:

 $items[] = '14';  //  ggf. mit Kommentar

Lesen Sie dazu bitte die Anleitung zu question() und zu Arrays. Oben entsprechend auch nur die Item-Nummern, nicht die kompletten Kennungen.

Haben Sie den Platzhalter %input:MN24_01% nochmal irgendwo auf der Seite verwendet? Die Fehlermeldung besagt, dass Sie das EIngabefeld (und nicht nur die Antwort) auf der Seite eingebunden haben.
by s250258 (110 points)
Vielen Dank für die Ergänzungen und den Verweis auf die Informationsseiten. Ich habe den Code korrigiert. Ich benutze auf der gleichen Seite nicht denselben Platzhalter, aber bei der Antwortoption 14 %other%, um den Eintrag des freien Textfeldes mittels replace zu ersetzen. Könnte es daran liegen?
by SoSci Survey (341k points)
Wodurch wird %other% denn ersetzt, was sagt die Debug-Information dazu?
by s250258 (110 points)
%other% soll durch die individuellen Eingaben der Teilnehmenden ersetzt werden - also das Medium, welches bei MN24_01 bzw. im Feld MN22_14 eingesetzt wird. Der einfache replace-Code funktioniert mit dem Platzhalter einwandfrei. Die Probleme tauchen erst auf, wenn ich mich an einem zusätzlichen Code versuche, um das Textfeld bei keinem Eintrag verschwinden zu lassen.
by SoSci Survey (341k points)
> Die Probleme tauchen erst auf, wenn ich mich an einem zusätzlichen Code versuche, um das Textfeld bei keinem Eintrag verschwinden zu lassen.

Möchten Sie den Code im gegenwärtigen Zustand vielleicht einmal posten?
by s250258 (110 points)
Ich poste gleich mal alle Codes, die ich auf der Seite habe. Der letzte Code entspricht den Textteilen und Eingabefeldern des Lückentexts.


replace('%other%', 'MN24_01', 'response'); // Antwortoption im Lückentext mit individueller Antwort im Freitextfeld der vorherigen Seite ersetzen

$items = ['1-13'];  // Die Items, die immer erscheinen sollen
if (trim(value('MN22_14')) != '') {  // MN22_14 ist das Eingabefeld
  $items[] = '14';  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen
}
show('MN16',['filter' => $items]);  // Folgefrage mit den passenden Optionen anzeigen

$items = getItems('MN09', 'min', 4);  // Eine Liste der Items abfragen, die in MN09 min. den Antwortcode 4 bekommen haben
question('MN16', $items);   // Ausfrage MN16 nur diese Items anzeigen
by SoSci Survey (341k points)
Okay, ich sehe das Problem ... Sie haben MN16 doppelt eingebunden, einmal per question() und einmal per show().

Und das erste mal filtern Sie die Optionen, das zweite mal die Lücken. Ist das korrekt und intendiert? Wenn ja, kombinieren Sie es wie folgt:

// Lücken
$items = getItems('MN09', 'min', 4);  // Eine Liste der Items abfragen, die in MN09 min. den Antwortcode 4 bekommen haben

// Optionen
$options = ['1-13'];  // Die Items, die immer erscheinen sollen
if (trim(value('MN22_14')) != '') {  // MN22_14 ist das Eingabefeld
  $options[] = '14';  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen
}

// Frage anzeigen
show('MN16', [
  'items' => $items,
  'filter' => $options
]);
by s250258 (110 points)
Vielen Dank, genau so ist es. Der Code funktioniert und die Fehlermeldung wird nicht mehr angezeigt. Ich konnte den replace-Befehl als zweite Bedingung setzen und es funktioniert optimal. Das Problem ist nun jedoch, dass das Optionenfeld bei keiner Angabe trotzdem immer noch zu sehen ist (also einfach die Umrisse, wie im Screenshot oben). Könnte es sein, dass das eher etwas mit dem Layout/der Ansicht zu tun hat?
by SoSci Survey (341k points)
> Das Problem ist nun jedoch, dass das Optionenfeld bei keiner Angabe trotzdem immer noch zu sehen ist

Ich denke eher, dass der 'filter'-Parameter noch nicht wie geplant funktioniert. Ich prüfe das und melde mich.
by s250258 (110 points)
Besten Dank!
by SoSci Survey (341k points)
So, nun sollte der 'filter' Parameter wie oben beschrieben funktionieren. Wenn Sie bitte nochmal testen und kurz berichten?
by s250258 (110 points)
Besten Dank für Ihre Bemühungen. Nun ist es so, dass auf der ersten Seite, auf der der Code benötigt wird, lediglich die leere, offene Antwortoption zu sehen ist. Aber der zweiten Seite funktioniert der Code - die leere, offene Antwortoption ist aber immer noch zu sehen. Ich poste hier nochmals den Code, damit mir auch ja kein Fehler unterlaufen ist:

// Lücken bzw. Nutzungsmotive filtern
$items = getItems('MN09', 'min', 4);  // Eine Liste der Items abfragen, die in MN09 min. den Antwortcode 4 bekommen haben

// Optionen bzw. Medienträger filtern
$options = ['1-13'];  // Die Items, die immer erscheinen sollen
if (trim(value('MN22_14')) != '') {  // MN22_14 ist das Eingabefeld
  $options[] = '14';  // Wenn etwas drin steht, dann die Nummer der Items mit in die Liste nehmen
replace('%other%', 'MN24_01', 'response'); // Wenn etwas drin steht, ersetze %other% mit Inhalt von MN24_01
}

// Frage anzeigen
show('MN16', [
  'items' => $items,
  'filter' => $options
]);
by SoSci Survey (341k points)
> Nun ist es so, dass auf der ersten Seite, auf der der Code benötigt wird, lediglich die leere, offene Antwortoption zu sehen ist.

Ergänzen Sie bitte folgende Zeilen und berichten Sie kurz, was angezeigt wird;

debug($items);
debug($options);

Prüfen Sie außerdem bitte, welche Codes die Antwortvorgaben in MN16 verwenden.
by s250258 (110 points)
Es wird folgendes angezeigt:
Debug information for $items: 04, 5 (auf der 04 ist ein Stoppschild, auf der 5 eine kleine 1)

Debug information for $options: 01-13, 14 (auf der 13 ist ein Stoppschild, auf der 14 eine kleine 1)
by SoSci Survey (341k points)
Sie führende Null bei "01" irritiert mich ein wenig, die sollte da nicht stehen. Aber ich glaube, das Problem geht ein wenig tiefer ... der 'filter'-Parameter ist nicht so flexibel, wie die Item-Definition, und will ein richtiges Array anstatt dem Text '1-13'. Bitte verwenden Sie folgende Modifikation für Ihre Code:

// Lücken bzw. Nutzungsmotive filtern
$items = getItems('MN09', 'min', 4);  // Eine Liste der Items abfragen, die in MN09 min. den Antwortcode 4 bekommen haben

// Optionen bzw. Medienträger filtern
$options = getItems('MN22', 'all');
if (trim(value('MN22_14')) != '') {  // MN22_14 ist das Eingabefeld
  replace('%other%', 'MN24_01', 'response'); // Wenn etwas drin steht, ersetze %other% mit Inhalt von MN24_01
} else {
  // Option 14 nicht anzeigen
  $options = array_diff($options, [14]);
}

// Frage anzeigen
show('MN16', [
  'items' => $items,
  'filter' => $options
]);
by s250258 (110 points)
Danke! Ich habe den Code kopiert und eingefügt. Die gute Nachricht ist, dass nun wieder alle Items angezeigt werden. Die schlechte aber, dass das leere Antwortfeld immer noch da steht.
by s250258 (110 points)
Korrektur: Es ist geschafft!
Ich habe MN22_14 (das Eingabefeld) durch die ursprüngliche Frage ersetzt (MN24_01). Zuvor hat das nicht geklappt, da das System mir meldete, dass ich das Item nicht zwei Mal wählen kann. Nun funktioniert es aber einwandfrei und die 14. Option verschwindet, wenn das Eingabefeld leer bleibt. Vielen herzlichen Dank für die Unterstützung!

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

...