0 votes
in SoSci Survey (dt.) by s033075 (145 points)
edited by s033075

Liebes SosciSurvey team,

Ich versuche Textbausteine als Array-Elemente zu randomisieren und dann im Fragebogen so einzubinden, dass sie teilweise fett formattiert sind. Die Randomisierung mit Arrays funktioniert, aber nicht die Fett-formattierung. Ich habe hierzu versucht:

  • die Texbausteine direkt als Strings in eine php Seite unter "Fragebogen zusammen stellen" einzubinden, aber dann werden die tags auch als string gelesen und mit dem Text mit ausgegeben
  • die Texte als Textbausteine zu speichern und dann ueber ihren Namen im Array einzubinden, aber dann werden die html tags auch als strings gelesen und zusammen mit dem Text ausgegeben
  • die Textbausteine in Befehle "einzuwickeln" wie "html()" oder "getTextElement()", damit der html code als solches gelesen wird, statt als Text ausgegeben zu werden, aber dann werden die Textbausteine sofort ausgegeben, und stehen dem Array dann nicht mehr fuer eine weitere Verwendung zur Verfuegung.

Ich freue mich ueber jeden Tip um dies umsetzen zu koennen!

1 Answer

0 votes
by SoSci Survey (302k points)

Das "einwickeln" geht schon in die richtige Richtung. Folgendes sollte z.B. funktionieren:

html('<div style="font-weight: bold;">');
text('AB01');
html('</div>');

Noch eleganter und besser steuerbar wird es aber mit CSS:

html('<div class="boldStuff">');
text('AB01');
html('</div>');
pageCSS('
   div.boldStuff { font-weight: bold; }
   div.boldStuff p { font-weight: bold; }
');

Hier kann man für untergeordnete Elemente genau festlegen, was wie dargestellt werden soll.

by s033075 (145 points)
Vielen Dank!

Eine kurze Zwischenfrage: Ist es auch moeglich, diese tags zu benutzen, wenn der Text ein Array-Element ist?

Ich habe z.B. folgendes Array:

$textarray = array(
     "some text",
     "some text in which single words are <b>bold</b> but most are normal",
     "some further text"
);

Das Array stellt verschiedene Textvarianten dar, von denen ich eine zufaellig (in Koordination mit den Werten aus anderen Arrays) auswaehle:

if (condition) {
     $items[$i] = $textarray[1];
}

Dann fuege ich den ausgewaelten Textabschnitt in die Frageseite mittels Platzhalter ein:

$item4 = $items[1];
registerVariable('item4');
replace("%viertesItem%", $item4);

Meine Sorge ist, dass wenn mehrere code befehle benoetigt werden, um einzelne Woerter im Text fett darzustellen, das entsprechende Textelement im Array nicht mehr so gut als einzelnes Array-Element erkennbar ist, sondern sozusagen in Einzelteile zerfaellt.

Vielen Dank im Voraus!
by SoSci Survey (302k points)
Das Array ist erstmal nur eine PHP-Konstruktion. Mit der HTML-Ausgabe hat es nichts zu tun. Was im Hintergrund passiert: Im Textbaustein werden - bevor dieser an den Browser geschickt wird - alle Platzhalter ausgetauscht gegen den "richtigen" Text. Der Browser kann nicht erkennen, was schon vorher im Textbaustein stand und was per Platzhalter eingefügt wurde.

Entsprechend wirkt das CSS nur auf das Ergebnis der Einfüge-Aktionen. Entscheidend ist, welchen HTML-Inhalt Sie zum Teilnehmer übermitteln.
by s033075 (145 points)
Vielen Dank fuer die weiteren Kommentare!

Leider ist es mir immer noch nicht gelungen, es zum funktionieren zu bringen. Es ist aber wahrscheinlich etwas relativ einfaches, und ich kenne mich einfach noch nicht so sehr mit HTML, PHP und CSS aus.

Ich habe versucht, den obigen CSS code unter "Fragebogen zusammenstellen" auf einer PHP Seite einzufuegen, in der auch die Fragen praesentiert werden:

<code>
html('<div class="boldStuff">');
question('AB01', 'spacing=none');
html('</div>');
pageCSS('
   div.boldStuff { font-weight: bold; }
   div.boldStuff p { font-weight: bold; }
');
</code>

Dann wird aber ein ganzer Satz fett gedruckt, und ich moechte nur einzelne Satzelemente hervorheben. Ich verstehe leider den Inhalt des Codes nicht gut genug, um es hierfuer zu adaptieren.

Spezifisch moechte ich alle Erscheinungen von "not" fett markieren. Etwa wie folgt:

<code>
$search = 'not';
registerVariable('search');
$textarray = str_replace($search, '<b>'.$search.'</b>',  'AB01');
question('AB01', 'spacing=none');
</code>

Wenn ich diesen letzteren Code unter "Fragebogen zusammenstellen" auf den Textarray anwende, dann werden die <b> tags zwar an den richtigen Stellen eingefuegt, der resultierende Text wird aber komplett als Text praesentiert, mitsamt den <b> tags, statt dass die <b> tags im Hintergrund den Text formatieren. Dasselbe geschieht, wenn ich diesen Code in die Fragen selbst (vom Typ offene Texteingabe & Auswahl) einbaue (mit und ohne <?php ?> tags), und wenn ich die <b> Tags von vorn herein in die Saetze des Arrays mit einbaue. Wenn ich den letzteren Code unter "Fragebogen zusammenstellen" auf die Fragen selbst anwende (wie beim ersten, obigen Code) dann hat es keine Wirkung (d.h. es findet keine "not" Elemente).

Allgemein weiss ich also nicht, wie ich den CSS code so umbauen kann, dass nur Erscheinungen von "not" innerhalb eines Satzes fett markiert werden, und auch nicht wo ich den entsprechenden Code platzieren kann, damit es als Code gelesen wird statt als Text mit ausgegeben zu werden.

Ich hoffe diese Beschreibung des Problems ist nicht zu unverstaendlich, und freue mich ueber jeden weiteren Hinweis!
by SoSci Survey (302k points)
Ich glaube, ich hatte die Frage nicht korrekt verstanden. Was im Textbaustein soll denn fett formatiert werden?

Im einfachsten Fall schreiben Sie zwei-mal-zwei Sterne um den Teil, der fett werden soll:

Hier ist normaler Text und **hier** steht ein fettes Wort, oder auch ein fetter **%Platzhalter%**.
by s033075 (145 points)
edited by s033075
Danke!

Ich denke, die Situation, die ich versuche umzusetzen, koennte man wie folgt beschreiben.

Zuerst erstelle ich einen Textarray:

$textarray = array {
     "The cat is black and it is on the mat",
     "The cat is black and it is <b>not</b> on the mat",
     "The cat is <b>not</b> black and it is on the mat",
     "The cat is <b>not</b>black and it is <b>not</b> on the mat"
};
registerVariable('textarray');

Ich moechte, dass in jedem Satz des Arrays alle Erscheinungen von "not" fett markiert werden, um Verwechslungen zwischen Saetzen wie den obigen zu vermeiden.

Jede Vpn sieht aber nur eines der vier Saetze. Fuer Vpn X waere dies z.B.:

shuffle($textarray);
$item1 = array_pop($textarray);
registerVariable('item1');
replace("%NamePlatzhalter1%", $item1);

Der Platzhalter ist dann an einer bestimmten Stelle der Frage platziert (z.B. vom Typ offene Texteingabe, umgeben von einer Einfuehrung und Instruktionen zur Beantwortung).

Das Problem ist, dass wenn ich dies wie oben umsetze, d.h. wenn ich die '<b>' tags direkt in die Texte des Arrays einbaue, sie dann als Text widergegeben werden, statt als html gelesen zu werden. Dasselbe geschieht, wenn ich statt '<b>', '**' in die Textarrays einbaue, oder '<span style="font-weight:bold">'. Jedes Mal wird der code als Text mit dargestellt, statt im Hintergrund als html auf den Text angewandt zu werden. Ich habe auch versucht "character escapes" zu benutzen, sie wurden aber ebenfalls als Text mit aufgefuehrt.

Wenn ich den Platzhalter als Ganzes mit '**' umgeben wuerde, dann wuerde das '**' wahrscheinlich korrekt als html gelesen werden, aber es wuerde den gesamten Satz fett markieren, statt nur die "not" innerhalb der Saetze.
by SoSci Survey (302k points)
Die Lösung ist ganz einfach: Setzen Sie als dritte Parameter von replace() noch 'html':

replace("%NamePlatzhalter1%", $item1, 'html');

Dann weiß SoSci Survey, dass Sie HTML-Code und nicht "normalen" Text verwenden.
by s033075 (145 points)
Sehr vielen Dank!
Ja, es funktioniert jetzt alles einwandfrei und wird auf dem Bildschirm genau so dargestellt wie ich es vorhatte! Dies ist eine riesige Hilfe auch bei den naechsten Experimenten!
Danke nochmals!

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

...