Ausgabe Antworten aus MultiSelect & Matrix

More
1 month 5 days ago - 1 month 5 days ago #219818 by MGantner
LimeSurvey Cloud 3.27.16

Hallo Zusammen,

Ich würde gerne bei meiner Umfrage bestimmte Fragen mit Antworten in meine End-URL integrieren. Aktuell schaffe ich es mit implode() und auch über list(). Mein Code sieht gerade so aus:
www.url.de?{list(Q2_SQ001.shown,Q2_SQ002.shown,Q2_SQ003.shown,Q2_SQ004.shown)}

Q2 is die Frage, SQ001 etc. sind die Teilfragen. Gibt es eine Möglichkeit den Code zu verkürzen um nicht jede Teilfrage in den Code schreiben zu müssen? Die Frage bezieht sich auf Multiselect und auch auf Matrixen.

Vielen Dank für Eure Unterstützung.
Last edit: 1 month 5 days ago by MGantner.

Please Log in to join the conversation.

More
1 month 5 days ago #219820 by Joffm
manual.limesurvey.org/ExpressionScript_-....22that.22_variables

Dein Beispiel würde also zu 
list(that.Q2.shown)}

Joffm


Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: MGantner

Please Log in to join the conversation.

More
1 month 5 days ago #219822 by MGantner
Vielen Dank!

Funktioniert super! Ich habe dann noch weiter gemacht und die Funktion listifop gefunden. Diese wurde von dir auch schon super im Forum erklärt. Ich habe jetzt einige question prperty (retProp) ausprobiert. Am liebsten hätte ich ein String mit nur SQ002&SQ003&... Gibt es da ein Command für nur die SubQuestion? Ansonsten muss ich es wohl mal mit regexMatch versuchen.


Aktuelle Ausgabe:

www.url.de?frage1=194269X86X955SQ002&194269X86X955SQ003


Bis dahin super vielen Dank =)

Please Log in to join the conversation.

More
1 month 5 days ago #219825 by Joffm
Sorry, aber jetzt hast Du mich etwas verwirrt.

Was willst Du eigentlich übergeben?
Jetzt sieht es so aus, als wollest Du keine Ergebnisse übergeben, sondern die SGQA Codes.
Also etwas wie {list(that.Q2.sgqa)},
vielleicht verziert mit etwas Stringfunktion
{str_replace(", ","&",list(that.Q2.sgqa))}

Gibt bei mir z.B.
188316X3414X43379SQ001&188316X3414X43379SQ002&188316X3414X43379SQ003&188316X3414X43379SQ004&188316X3414X43379SQ005&188316X3414X43379SQ006&188316X3414X43379SQ007&188316X3414X43379SQ008&188316X3414X43379SQ009&188316X3414X43379SQ010

Ansonsten solltest Du einmal ein Beispiel als lss Export schicken mit Erklärung, was wann, warum und wie übergeben werden soll.

Joffm


Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: MGantner

Please Log in to join the conversation.

More
1 month 5 days ago #219848 by MGantner
Ok, verwirren wollte ich niemanden.

Das große Ziel ist, die End-URL mit Antworten aus der Umfrage zu bestücken, sodass auf der Landingpage für den Teilnehmer eine kleine kurze Auswertung stattfinden kann. Dies geht über die URL-Parameter. Top!
Mein Ziel ist es, die URL-Parameter so kurz wie möglich zu halten. Deswegen eignen sich die Variable-Attributes .shown / .question nicht, da die Teilfragen ab und an recht lang sind.

Darum bin ich auf die SGQA Codes gekommen. Wenn ich {list(that.Q2.sgqa)} benutze, werden mir alle SGQA Codes der Frage ausgegeben, auch die, die nicht ausgewählt wurden. Mit {listifop("code", "==","Y","sgqa","&", that.Q2.sgqa)} bekomme ich jetzt nur die SGQA Codes, die in der Frage auch angeklickt wurden. Passt!

Am liebsten hätte ich eine noch kürzere Ausgabe. Der SGQA Code wirft dann doch auch viele Informationen aus. 194269X86X955SQ001&194269X86X955SQ003. Schöner wäre nur den Code der Teilfragen, also SQ001&SQ003. Deswegen die Fragen, ob es eine bekannte Möglichkeit gibt, auf die Codes der Teilfragen zu reduzieren. Ich habe nichts gefunden.


Ok, habe mir die Frage jetzt selbst beantwortet =)

{str_replace("194269X86X955","",listifop("code", "==","Y","sgqa","&", that.Q2.sgqa))}

Gruß

 

Please Log in to join the conversation.

More
1 month 5 days ago #219849 by Joffm

die End-URL mit Antworten aus der Umfrage zu bestücken

Das hatte ich mir am Anfang auch gedacht.
Daher: Was willst Du mit den SGQA-Codes?
Wie willst Du mit dem SGQA-Code einer Einfachnennung herausbekommen, wie diese Frage beantwortet wurde?
Außerdem ist der SGQA-Code ja auch nur ein Synonym für {Q2}; musste halt benutzt werden, als es ExpressionScript / Manager noch nicht gab.

Wenn ich Daten übergebe, schaue ich auch, dass es kurz wird (der GET-Parameter ist ja sowieso in der Länge begrenzt)
Einfachnennung ist klar: Da "knallt" man einfach die Codes in definierter Reihenfolge mit "join" hintereinander. Sollte es mehrstellige Codes geben, evtl. als "001012004123002..."
Geht auch bei Mehrfach: eben mit "join".
Da kann dann entweder mittels
{join(if(Q1_SQ001=="Y","1","0"),if(Q1_SQ002=="Y","1","0"),if(Q1_SQ003=="Y","1","0"),... einen String erzeugen wie "10011011". Da weißt Du genau, welche Option ausgewählt wurde, welche nicht.
Nach Deinem Beispiel möchtest Du nur die ausgewählten?
Gut, dann eben so
{join(if(Q1_SQ001=="Y","1",""),if(Q1_SQ002=="Y","2",""),if(Q1_SQ003=="Y","3",""),...
Dann gibt es so etwas: "1379"; erstes, drittes, siebtes und neuntes Item wurde gewählt.
Und wieder, wenn es auch zweistellige Codes gibt:
{join(if(Q1_SQ001=="Y","01",""),if(Q1_SQ002=="Y","02",""),...,if(Q1_SQ013=="Y","13",""),...
Das ist alles auf jeden Fall kürzer als wenn Du immer das "SQ0.." mit herumschleppst.

Bei Matrizen kannst Du wieder ein simples join machen (vorausgesetzt einstellige Codes, und nicht den "A1", "A2",... Unsinn)
join(that.Q1) gäbe dann eben so etwas wie "5526154331", die Antwortcodes der Teilfragen der Matrix

Die Zielanwendung kann dann ja leicht mittels "substr" die Antwort zu jeder Frage herausfischen.

Und diese Erzeugung des Übergabestrings würde ich in einer Gleichungsfrage "eqParam" vorziehen, dass in der end-url nur noch steht : "https://......?param={eqParam}

Joffm
 


Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
1 month 5 days ago - 1 month 5 days ago #219851 by MGantner
Danke für die super ausführlichen Infos. Mit dem join() komme ich jetzt gut klar.

Top, Danke
Last edit: 1 month 5 days ago by MGantner.

Please Log in to join the conversation.

More
1 month 5 days ago #219852 by holch
Wäre es mit der Übergabe der Saved-ID und einem Script das per API auf die Antworten zugreift nicht noch kürzer?

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.
The following user(s) said Thank You: MGantner

Please Log in to join the conversation.

More
1 month 4 days ago #219857 by MGantner

Wäre es mit der Übergabe der Saved-ID und einem Script das per API auf die Antworten zugreift nicht noch kürzer?
 

Hey,

das ist sicherlich auch ein interessanter Ansatz. Da müsste ich dann mal schauen, welcher der beiden Wege in der Programierung mehr Aufwand bedeutet.

Besten Dank

Please Log in to join the conversation.

More
1 month 4 days ago #219866 by Joffm
Ach, @holch,
wenn ein Thread so harmlos beginnt mit "Wie kann ich "list(Q1_SQ001,Q1_SQ002,Q1_SQ003,...)" kürzer machen?" denkt man nicht mehr daran, den Workflow in Frage zu stellen.

Zunächst ist mir ja nicht klar, wie umfangreich und kompliziert die Auswertung sein wird und ob man sie nicht auch direkt in LimeSurvey hinbekommt.
Da geht überraschend viel.
 

Aber gut:
Im Rahmen eines Bewerbungsfragebogens wurde auch ein BIF-6F (Bochumer Inventar zur beruflichen Persönlichkeitsbeschreibung) ausgefüllt.
Das kann LimeSurvey dann nicht mehr, da man hier in hinterlegten Tabellen nachschauen muss.

Also wurde die SAVEDID an eine php-Seite übergeben, welche nur sagte "Vielen Dank, Ihre Daten sind bei uns eingegangen. usw."
Im Hintergrund wurde dann der BIF berechnet, ein schönes pdf erstellt (mit den Daten und einer graphischen Darstellung des BIF) und eine mail verschickt, dass es eine neue Bewerbung gibt.

Da ich mit der API nicht "auf DU und DU" bin, wurde hier der direkte Zugriff auf die Datenbank gewählt.
Nachteil: Man muss mit den SGQA Codes abfragen, die wenig sprechend sind; daher wurde eine "Übersetzungsdatei" eingebunden.
$survey=193161;
$tbl_daten='lime_survey_'.$survey;
$tbl_timing='lime_survey_'.$survey.'_timings';
$col_name=$survey.'X42X545';
$col_dob=$survey.'X42X546';
$col_gender=$survey.'X42X554';
$col_schul=$survey.'X42X547';
$col_taet=$survey.'X42X548';
$col_erf=$survey.'X42X549';
$col_upload=$survey.'X43X550';
$col_cv=$survey.'X43X551';
...

Dann sind die Abfragen ein wenig anschaulicher.
"SELECT
    {$col_quelle}SQ001 as Q1,{$col_quelle}SQ002 as Q2,{$col_quelle}SQ003 as Q3,{$col_quelle}SQ004 as Q4,
    {$col_quelle}other as QOther,{$col_quelle_sonst2} as QSo2,{$col_quelle_sonst3} as QSo3,
    {$col_name}SQ001 as vname,{$col_name}SQ002 as name,concat({$col_name}SQ003,', ',{$col_name}SQ004,' ',{$col_name}SQ005) as adresse,
    {$col_name}SQ006 as phone,{$col_name}SQ007 as email,
    {$col_dob} as dob,
    {$col_gender} as gender,
    {$col_schul} as schule,
    {$col_upload}_filecount as fc,{$col_cv} as cv,
    7-{$col_T1}SQ001 as W01,7-{$col_T1}SQ002 as W02,{$col_T1}SQ003 as W03,{$col_T1}SQ004 as W04,7-{$col_T1}SQ005 as W05,7-{$col_T1}SQ006 as W06,7-{$col_T1}SQ007 as W07,
    7-{$col_T1}SQ008 as W08, ...,
    FROM {$tbl_daten} WHERE id={$SID}"

Das war schnell gemacht, weil ich daran gewöhnt bin.

Eine Auflistung der Antworten eines Teilnehmers mit der API ginge wohl so:
<?php
require_once 'jsonrpcphp/JsonRPCClient.php';
 
define( 'LS_BASEURL', 'https://www.myServer.de/limesurvey');  // adjust this one to your actual LimeSurvey URL
define( 'LS_USER', 'ICH_ICH' );
define( 'LS_PASSWORD', 'meinPassword' );
 
// the survey to process
$survey_id=886223;
 
// instantiate a new client
$myJSONRPCClient = new \org\jsonrpcphp\JsonRPCClient( LS_BASEURL.'/index.php/admin/remotecontrol' );
// receive session key
$sessionKey= $myJSONRPCClient->get_session_key( LS_USER, LS_PASSWORD );
 
if(is_array($sessionKey))
{
    header("Content-type: application/json");
    echo json_encode($sessionKey);
    die();
}
 
/* Get the responses */
/*
export_responses(
string $sSessionKey,
integer $iSurveyID,
string $sDocumentType,
string $sLanguageCode = null,
string $sCompletionStatus = 'all',
string $sHeadingType = 'code',
string $sResponseType = 'short',
integer $iFromResponseID = null,
integer $iToResponseID = null,
array $aFields = null
) : array|string
*/
$response = $myJSONRPCClient->export_responses(
    $sessionKey,
    $survey_id,
    'json', // Document type : pdf,csv,xls,doc,json
    null, // Language code : null : default from survey
    'complete', // Stautus complete|incomplete|all
    NULL, // Heading : code|full|abbreviated : question text, default code
    'short', // answer : short|long , default : long
    $SID,   // die übergebene SAVEDID als Startwert
    $SID    // die übergebene SAVEDID als Endwert
); // See http://api.limesurvey.org/classes/remotecontrol_handle.html#method_export_responses or https://github.com/LimeSurvey/LimeSurvey/blob/master/application/helpers/remotecontrol/remotecontrol_handle.php#L2382 or
 
    $decodedString = base64_decode($response);
    $aResponses = json_decode($decodedString, True);
        // Find the first response ID
    $aFirstResponse = reset($aResponses['responses'][0]);
 
  //Hier als Tabelle auf den Bildschirm gebracht.
    echo '<table style="border-collapse: collapse; text-align: left;">';
        echo '<tr>';
            // Insert column headers
            foreach($aFirstResponse as $key => $value) {
                echo '<th style="border: 1px solid #CCC; padding: 2px 7px;">'.$key .'</th>';
            }
        echo '</tr>';
        foreach($aResponses['responses'] as $key => $row) {
        echo '<tr>';
                // Insert the data
                foreach(reset($row) as $key => $item) {
                    echo '<td style="border: 1px solid #CCC; padding: 2px 7px;">'.$item .'</td>';
                }
            echo '</tr>';
        }
    echo '</table>';
 
// release the session key
$myJSONRPCClient->release_session_key( $sessionKey );
 
?>

Was Du letztendlich machst, musst Du selbst entscheiden.

Joffm


Volunteers are not paid.
Not because they are worthless, but because they are priceless
Attachments:

Please Log in to join the conversation.

More
1 month 4 days ago #219872 by holch
@Joffm: Bei der ursprünglichen Frage hätte ich die API auch nicht ins Spiel gebracht

Aber dann wurde es ja immer komplizierter. Für 1-2 Variablen lohnt sich der API Ansatz sicher nicht. Aber wenn man darüber nachdenkt die Variablen zu kürzen, dann ist es vermutlich eine gute Idee sich die API mal genauer anzuschauen. Sicher im ersten Moment etwas mehr Einarbeitung, aber danach vermutlich die sauberste Lösung.

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.

Please Log in to join the conversation.

More
1 month 4 days ago #219873 by holch
Allerdings, und das ist mir jetzt erst beim schreiben aufgefallen, muss man da vermutlich noch mehr auf den Datenschutz achten. Denn mit der Übergabe der SAVEDID via URL an ein Skript, das dann die Angaben ausliest, könnte man ja theoretisch die SAVEDID manipulieren und andere Daten auch auslesen. Aber ich bin kein Programmierer...

Bei der Übergabe der kompletten Daten via URL sind es halt wirklich nur die Daten die vorher eingegeben wurden. Da kann man eigentlich keinen Zugriff auf die Daten anderer damit bekommen.

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.

Please Log in to join the conversation.

More
1 month 4 days ago #219879 by Joffm
Stellt sich auch die Frage nach dem Zweck.
Wenn am Ende nur angezeigt wird "Du hast 457 Punkte" bringt eine Manpulation der SAVEDID nicht viel.
Aber man könnte in der Umfrage eine zufällige, eindeutige Zahl erzeugen, die auch übergeben wird.
Das wird dann in der Auswertung verglichen.
Dann muss - wenn man manipulieren will - die zur SAVEDID passende zufällige Zahl erraten werden.
Dafür gibt es auch ein Plugin, "generateUniqueId' von Denis.

 


Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
1 month 4 days ago #219880 by holch
Klar, kommt immer darauf an, was da am Ende angezeigt wird. Ob ein "Super, du hast 500 Punkte" oder deine ganzen persönlichen Daten inklusive Patientendaten, Geschlechtskrankheiten, etc...

I answer at the LimeSurvey forum in my spare time, I'm not a LimeSurvey GmbH employee.
No support via private message.

Please Log in to join the conversation.

More
1 month 4 days ago #219881 by Joffm
Wie, @holch, hatte ich das von meinen Geschlechtskrankheiten auch schon hier ausgeplaudert? 


Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

Start now!

Just create your account and start using Limesurvey today.

Register now