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

0 votes

Hallo,
Ist es möglich einen Textbaustein einem Platzhalter zuzuweisen?
Also das der gesamte Text des Textbausteins als String im Platzhalter vorliegt?

In den bisherigen versuchen wurde immer der Name des Textbausteins dem Platzhalter als String zugewiesen.

Danke und viele Grüße

in SoSci Survey (dt.) by s109993 (1.7k points)

3 Answers

+1 vote
 
Best answer

Sie können einfach replace() mit getTextElement() verbinden:

replace('%text%', getTextElement('AB01'), 'html');

Wenn Sie ein wenig Speicher sparen möchten - denn die Platzhalter haben zusammen nur ca. 32 KB - dann können Sie den Text auch als temporären Platzhalter verwenden. Und zwar mit der Funktion show() statt text() bzw. statt question().

show('XX02', [
    '%text%' => getTextElement('AB01')
]);
by SoSci Survey (85.6k points)
selected by s109993
Das funktioniert super, kommt aber mit einem Problem. Wenn ich den folgenden Code benutze replace('%B1_D1%', getTextElement('B1_D1'), 'html');
wird dem Text ein div- Element vorangesetzt und der Text in zwei p- tags gesetzt.  


Für meine Anwendung will ich den Platzhalter in mein TTS script einbauen.
<a type"button" style="vertical-align:middle;" value="Play" onclick="responsiveVoice.speak('%B1_D1%','Deutsch Female');"><img src="TTS.png"></a>
Die html Tags im String beenden bzw. unterbrechen den TTS Befehl allerdings.

Das hat auch schon ohne Probleme funktioniert, wenn ich die Platzhalter "normal" erstellt habe: replace('%fahrzeug%', 'AB01', 'response');
Dieses Mal muss es aber über die TExtbausteine gemacht werden.

Ich vermute das die html Tags durch die getTextElement() Funktion an den String angespielt werden?!  Können diese irgendwie umgangen werden?

Entschuldigen Sie die sehr spezifische Nachfrage- ich hoffe ich habe das Problem ausreichend dargelegt.

EDIT:
Ich konnte den Fehler beheben. Habe den 'html' Teil weggelassen: replace('%B1_D1%', getTextElement('B1_D1')); und den Textbaustein nicht mehr als "einfachen Text" abgespeichert, sondern als HTML Code.
Weiterhin können Sie im Befehl getTextElement() als zweiten Parameter "plain" angeben, um die HTML-Boilerplate zu entfernen: https://www.soscisurvey.de/help/doku.php/de:create:functions:gettextelement
Es hat sich doch nochmal eine Frage hierzu ergeben. Jetzt habe ich tatsächlich den Fall, dass die maximale Kapazität für Platzhalter (übrigens 64Kb laut Fehlermeldung) überschritten sind. Der von Ihnen beschriebene Code mit "Show" kann ich leider nicht verwenden, da ich die Platzhalter nicht im Zusammenhang mit Fragen verwende. Gibt es hierzu eine Alternative die eine ähnliche Syntax wie replace('%text%', getTextElement('AB01'), 'html'); verwendet ?
Die einzige Idee, die mir bisher in den Sinn kommt ist eine komplette Sprachversion auf einen anderen Fragebogen auszugliedern bzw. zu verlinken- was allerdings sehr umständlich wäre.

Viele Grüße
Nun, besonder effizient ist es nicht, wenn Sie so viele Daten in einen Platzhalter bauen. Vielleicht beschreiben Sie einfach kurz, wie Sie den Platzhalter einsetzen? Wenn nicht in einer Frage, dann benötigen Sie für Ihr Projekt vielleicht gar keinen Platzhalter.
Gerne, ich habe es oben als Antwort verfasst um Bilder und Code formatiert einfügen zu können.
0 votes

gerne: es geht darum das ein Anschreiben, das Teilnehmer postalisch erhalten, auch als Audiodatei verfügbar ist (für Analphabeten etc.). Dafür haben wir den Gebrauch von SoSci etwas abgeändert. Wir haben Screensshots des Anschreibens in SoSci eingefügt und über jedes Bild Lautsprecher programmiert die einen Teil des zu sehenden Bildes vorlesen.

Dafür wurden alle Texte, welche vorgelesen werden als Textbausteine in vier Sprachen angelegt.
Auf der ersten Seite befindet sich ein Sprachfilter:

if (getLanguage() == 'ger') {
goToPage('ger');

} elseif (getLanguage() == 'eng') {
goToPage('eng');

} elseif  (getLanguage() == 'ara') {
goToPage('ara');

} else {
goToPage('rum');

}

Dann auf der ersten Seite "ger" werden alle Textbausteine in Platzhalter abgespeichert:

replace('%B1_D1%', getTextElement('B1_D1'));
replace('%B1_D2%', getTextElement('B1_D2'));
replace('%B2_D1%', getTextElement('B2_D1'));
.....

Anschließend werden alle Lautsprecher und Bilder zusammengefügt:

    <div class="rahmen">
    <span class="c">1.   </span><a type"button" style="vertical-align:middle;" value="Play" onclick="responsiveVoice.speak('%B1_D1%','Deutsch Female');"><img src="TTS.png"></a>
    <span class="c"style="padding: 0 0 0 60px;">2.   </span><a type="button" style="vertical-align:middle;"  value="Play" onclick="responsiveVoice.speak('%B1_D2%','Deutsch Female');"><img src="TTS.png"></a>
    </div>
    <div style="text-align: center; margin: 40px 0">
    <img src="Bild_1.png">
    </div>
.....
....
....

Und am Ende CSS:

<style>


.rahmen {
  border-style: solid;
  border-width: 1px;
  padding: 10px 10px 10px 10px;
background-color:#eeeeee;

}
.c {
  font-size: 125%;
  font-weight: bold;
    display:inline-block;
    vertical-align:middle;

}
</style>
<script>
SoSciTools.submitButtonsHide();
</script>

Die Speicherkapazität reicht bis zur vierten Sprache arabisch. Dort sind es die letzten vier Textbausteine welche zu viel sind.
Hier noch der Pretest link: https://ofb.iea-hamburg.de/audio/?act=JAfmzgGibM3SjyDGSdaY9KLl

by s109993 (1.7k points)
0 votes

Also zumindest für die SoSci-Datenbank ist es nicht so optimal, wenn so viele zusätzliche Daten pro Interview abgelegt werden ;)

Anschließend werden alle Lautsprecher und Bilder zusammengefügt:

Wenn Sie diesen HTML-Code in einem Textbaustein oder im Fragenkatalog als Text gespeichert haben, können Sie das show() genauso verwenden, wie für eine Frage.

Wenn Sie den HTML-Code direkt im Fragebogen platziert haben (nicht so optimal, das schwerer zu pflegen), können Sie ihn entweder in einen text umziehen oder einen PHP-Code für die Anzeige verwenden und die Texte dort direkt einbauen:

html('
  <div class="rahmen">
    <span class="c">1.   </span><a type"button" style="vertical-align:middle;" value="Play" onclick="responsiveVoice.speak(\''.getTextElement('B1_D1').'\',\'Deutsch Female\');"><img src="TTS.png"></a>
    <span class="c"style="padding: 0 0 0 60px;">2.   </span><a type="button" style="vertical-align:middle;"  value="Play" onclick="responsiveVoice.speak(\''.getTextElement('B1_D2').'\',\'Deutsch Female\');"><img src="TTS.png"></a>
    </div>
    <div style="text-align: center; margin: 40px 0">
    <img src="Bild_1.png">
  </div>
');

Generell würde ich übrigens von dem Springen mittels goToPage() abraten. Meist ist es übersichtlicher, wenn Sie alles auf einer Seite platzieren. Da Sie pro Bedingung nur ein paar Text abrufen (und z.B. in eine PHP-Variable speichern) müssen, wird das auch übersichtlicher.

by SoSci Survey (85.6k points)
edited by SoSci Survey
Danke für die Mühe, allerdings muss ich leider doch noch einmal nachfragen. Beim einbauen der html('') Syntax in das php- Feld kommt eine sehr lange Liste von Fehlermeldungen wie z.B. "Unerwartetes Element: Arabic - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?" Ich denke das der String irgendwo unterbrochen wird, kenne mich aber mit der Zeichensetzung von html in php überhaupt nicht aus. Wenn ich es über die zweite Variante versuche, also den html Code als Textbaustein anlege (als einfachen Text) und dann mit show ('name') versuche anzeigen zu lassen, kommt folgende Fehlermeldung: Fragekennung nicht bekannt.
>  z.B. "Unerwartetes Element: Arabic

Achten Sie bitte darauf, dass ich vor alle einfachen Anführungszeichen einen Backslash gesetzt habe. Wenn man das nicht tut, endet der String-Inhalt dort.
Ja, da hat ein Backslash bei mir gefehlt... passt jetzt. Vielen Dank!
...