Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Search Results (Searched for: html)

  • 4shm5q7um
  • 4shm5q7um's Avatar
03 Jul 2025 13:46
Hey,
My survey include questions with the possibility to play audio samples. I embedded the audio player with a simple HTML code:

<div style="text-align: center;"> <span style="font-size:20px;"><strong>
<audio controls="" preload="auto" style="width:100%"> <source src="EXTERNAL_URL_TO_MP3_AUDIO_SAMPLE" type="audio/mpeg" /></audio>
</strong></span></div>


I tested in Chrome, Safari, and Firefox. In Firefox, the player is visible but PLAY button doesn't work. I tried some simple variations of the HTML code and I tried to clean my cache, but apparently this did not solve the problem. Any tips?
Thanks
 
  • Alexitktwfo
  • Alexitktwfo's Avatar
24 Jun 2025 11:26 - 24 Jun 2025 11:29
Replied by Alexitktwfo on topic Admin Design nach Update
Genau, wir haben von einer 5er Version auf die 6er geupdatet, deswegen kann ich jetzt leider keine vorher nacher Bilder mehr sharen.

1. wenn man den Quellcode einer Frage bearbeitet hatte, dann wurden zb die html tags markiert oder die geschwungenen Klammern, wenn ich mich noch recht erinnere hervorgehoben.

2. Wenn man in die Teilnehmertabelle ging gab es ganz links einen Button mit dem man mit genau diesem Teilnehmer die Umgfrage starten konnte. Das sah aus wie ein Play Button, Noch früher war es glaub ich eine Art Zahnrad. Das Starten der Umfrage mit einem spezifischen Teilnehmer geht nur mehr, wenn man rechts über die 3 Punkte in das Menü geht und dort auf Umfrage mit dem TN starten geht. (siehe Screenshot)

 

 
  • danielaarias25
  • danielaarias25's Avatar
18 Jun 2025 12:04
I have used the excel TRANSLATE to change from english to dutch where language colum is NL for the general questions then for the choice cards of utrecht i have also tranlsated the tables html formt....this text file (tab separated) is let's say dutch translated....but when importing to lime it gives me this error 

File Attachment:

File Name: last.zip
File Size:328 KB
  • Joffm
  • Joffm's Avatar
13 Jun 2025 17:52 - 13 Jun 2025 17:53
Replied by Joffm on topic Styling SURVEYURL link in email
Hi,
{SURVEYURL} already contains the <a href=... part

<p><a href="<a href=" www.myserver.de/lime6/index.php/772936?token=111&lang=de "> www.myserver.de/lime6/

Therefore you have to use

<p><a href="@@SURVEYURL@@"  style='color: white; font-style: bold;background: yellow; padding: 20px; border-radius:5px;'>Click here! </a></p>

See here:
[url] www.limesurvey.org/manual/Email_templates#Email_Placeholders [/url]

@@SURVEYURL@@
The URL to start the survey - this is the barebone link. Use this if you want to integrate the link in your custom HTML elements somewhere (available in v1.90 and later)

Joffm
  • daverex
  • daverex's Avatar
10 Jun 2025 14:25
Replied by daverex on topic Iframe Integration mit Hürden
Lieber Joffm, 

vielen Dank für die Klarstellung. Tatsächlich hatte ich nur auf die HTML-Ansicht innerhalb der Frage umgeschaltet. Nach Umstellung des Editors in den persönlichen Einstellungen auf Quellcode hat es jetzt funktioniert die Frage zu kopieren und ebenfalls entsprechend anzupassen. 

Herzlichen Dank für die Unterstützung! Damit scheint das Problem aus der Welt! 

Beste Grüße
Dave
  • frosch
  • frosch's Avatar
10 Jun 2025 10:49
Replied by frosch on topic Template mit include einbinden
Danke für die Infos, aber leider funktioniert nix. Laut Doku sollte meine erste Variante funktionieren, aber es kommt diese Fehlermeldung:

Arguments must be separated by a comma. Unexpected token "punctuation" of value ":" ("punctuation" expected with value ",").

twig.symfony.com/doc/3.x/functions/include.html
  • Joffm
  • Joffm's Avatar
06 Jun 2025 20:46 - 06 Jun 2025 20:47
Replied by Joffm on topic Template mit include einbinden
Hallo,
keine Ahnung; damit kenne ich mich nicht aus.

Ich halte mich immer an das, was LimeSurvey auch macht, wie hier in der "privacy.twig".
Code:
                {% if (aSurveyInfo.showsurveypolicynotice == 1) %}
                    {{include('./subviews/privacy/privacy_text.twig')}}
                {% elseif (aSurveyInfo.showsurveypolicynotice == 2) %}
                    {{include( './subviews/privacy/privacy_modal.twig')}}
                {% endif %}

Da wird entweder der Fließtext oder das modale Fenster angezeigt.

Außerdem:
Hier
[url] twig.symfony.com/doc/3.x/tags/include.html [/url]
steht diese Syntax
Code:
[code]{% include 'sidebar.html.twig' ignore missing %}
[/code]
Aber - wie gesagt - ich habe davon keine Ahnung.

Joffm
  • davebostockgmail
  • davebostockgmail's Avatar
05 Jun 2025 15:05
Voice Capture with Long Free Text question was created by davebostockgmail
Please help us help you and fill where relevant: 6.14.1
Your LimeSurvey version: [see right hand bottom of your LimeSurvey admin screen] 
Own server or LimeSurvey hosting: Self Hosted 
Survey theme/template: Custom
==================

As always people want the strangest things, So with a little AI help I have created a script that you can add to a long free text question to capture voice input. 

Currently this is question by questions where you need to edit the element ID and also it is defaulted to English, if anyone else want to adapt it to use the survey language and pick up the question ID then feel free, Just wanted to share in case someone else has demanding clients.

Put this in your question source
Code:
<!-- Button for starting the recording --><button id="startBtn" style="background-color: green; color: white;" type="button">Click here to use your microphone to answer</button> <!-- Modal HTML --></p>
 
<div id="countdownModal" style="display:none; position:fixed; left:0; top:0; width:100vw; height:100vh; background:rgba(0,0,0,0.5); z-index:1050; align-items:center; justify-content:center;">
<div style="background:white; padding:30px; border-radius:10px; text-align:center; min-width: 240px;">
<h2>Get Ready!</h2>
 
<p>Starting in <span id="countdownValue">3</span>...</p>
</div>
</div>
<script>
$(document).ready(function() {
    const startButton = $('#startBtn');
    const answerTextarea = $('#answer947655X225X9377');
    const modal = $('#countdownModal');
    const countdownEl = $('#countdownValue');
 
    let startedOnce = false;
    let isRecording = false;
    let lastManualValue = "";   // Keeps manual edits and previous result
    let recognitionActiveSessionTranscript = ""; // Keeps what is added in the present session
 
    if ("webkitSpeechRecognition" in window) {
        const recognition = new webkitSpeechRecognition();
        recognition.continuous = true;
        recognition.interimResults = true;
        recognition.lang = "en-US";
 
        let interimTranscript = "";
        let pauseTimeout;
 
        // Helper: Capitalize after punctuation
        const capitalizeAfterPunctuation = (text) => {
            return text.replace(/(?:^|\. )(\w)/g, (match, p1) => match.replace(p1, p1.toUpperCase()));
        };
 
        // Handle user edits
        answerTextarea.on('input propertychange', function(){
            if (!isRecording) {
                lastManualValue = answerTextarea.val();
            }
        });
 
        // Start speech recognition and sync with edits
        const startRecognition = () => {
            // Always take the CURRENT textarea contents as base
            lastManualValue = answerTextarea.val();
            recognitionActiveSessionTranscript = "";
            recognition.start();
        };
 
        const stopRecognition = () => {
            recognition.stop();
        };
 
        recognition.onstart = () => {
            isRecording = true;
            startButton.text("Stop and edit my answer").css({ "background-color": "red", "color": "white" });
        };
 
        recognition.onend = () => {
            isRecording = false;
            // Update manual value in case user typed something after last pause
            lastManualValue = answerTextarea.val();
            startButton.text("Resume recording").css({ "background-color": "green", "color": "white" });
            clearTimeout(pauseTimeout);
        };
 
        recognition.onresult = (event) => {
            interimTranscript = "";
            clearTimeout(pauseTimeout);
            for (let i = event.resultIndex; i < event.results.length; i++) {
                const transcript = event.results[i][0].transcript;
                if (event.results[i].isFinal) {
                    recognitionActiveSessionTranscript += transcript;
                } else {
                    interimTranscript += transcript;
                }
            }
 
            // Compose up-to-date value: always prepend latest manual edits!
            let finalText = lastManualValue
                + (recognitionActiveSessionTranscript ? " " + capitalizeAfterPunctuation(recognitionActiveSessionTranscript.trim()) : "")
                + (interimTranscript ? " " + interimTranscript : "");
 
            answerTextarea.val(finalText.trim());
 
            // After a pause: finalize what's been heard
            pauseTimeout = setTimeout(() => {
                recognitionActiveSessionTranscript = recognitionActiveSessionTranscript.trim() + ". ";
                recognitionActiveSessionTranscript = capitalizeAfterPunctuation(recognitionActiveSessionTranscript);
                let finalVal = lastManualValue
                    + (recognitionActiveSessionTranscript ? " " + recognitionActiveSessionTranscript.trim() : "");
                answerTextarea.val(finalVal.trim());
            }, 1000);
        };
 
        // Modal logic
        function showCountdownModal(seconds, callback) {
            countdownEl.text(seconds);
            modal.css('display', 'flex');
            let left = seconds;
            const countdownInterval = setInterval(() => {
                left--;
                countdownEl.text(left);
                if (left <= 0) {
                    clearInterval(countdownInterval);
                    modal.hide();
                    callback();
                }
            }, 1000);
        }
 
        // Button click logic
        startButton.on('click', function() {
            if (isRecording) {
                stopRecognition();
            } else if (!startedOnce) {
                startedOnce = true;
                showCountdownModal(3, function() {
                    startRecognition();
                });
            } else {
                startRecognition();
            }
        });
    } else {
        answerTextarea.val("Web Speech API not supported in this browser.");
    }
});
</script>
  • Joffm
  • Joffm's Avatar
04 Jun 2025 14:14
Replied by Joffm on topic Text display randomization
If you use the source code editor you see that there is some HTML in the equation.
 
Remove it and it is fine.
Unfortunately you do not see this if in the WYSIWYG editor.

Joffm
  • Joffm
  • Joffm's Avatar
02 Jun 2025 17:40
Danke fürs Verschieben.
Ja, wir sind etwas empfindlich, was die Sprachdisziplin angeht.

Gut, dann will ich einmal ein paar Ideen kreieren.

1. Baue Deinen eigenen Report in der End-Nachricht.
Da kannst Du "aus dem Vollen" schöpfen mit allem, was HTML, css, bootstrap zu bieten hat.
Und die Werte fügst Du mit ExpressionScript und evtl. gewünschten Funktionen ein.
Z.B.
 

2. Leider hast Du die Fragen am Anfang nicht beantwortet.
Daraus hätten wir schließen können, ob Du überhaupt die Möglichkeit hast, die nächste Idee umzusetzen.
Nämlich mit dem Plugin "pdfReport".
Dann kann der Teilnehmer seine Daten als pdf ausdrucken oder Du kannst Sie ihm auch zuschicken.
 


Allerdings könne Plugins nur in der Community-Edition benutzt werden, bzw. in der Cloud-Version ab "Business" (und gegen eine kleine Gebühr)
 

Ohne Genaueres zu wissen würde ich zur ersten Lösung greifen.
Zusätzlich kannst Du dort auch einen Button einbauen, mit welchem der Teilnehmer dann ausdrucken kann.
 
Dies geschieht dann mit der gewohnten "Windows" Print-Funktion.
 

So, jetzt ist der Ball wieder bei Dir.

Sag uns etwas genauer, was Du vorhast, und wir sehen weiter.

Bis dann
Joffm
  • squidy
  • squidy's Avatar
29 May 2025 18:02
Replied by squidy on topic Upload modal script - LS 6.x
Does anyone know how to adapt this code to work in version 6.x? 

File Attachment:

File Name: Survey - D...odal.lss
File Size:40 KB

Code:
<script type="text/javascript" data-author="Tony Partner">    
 
    $(document).on('ready pjax:scriptcomplete',function(){
 
       $("#answer{SGQ}SQ001_SQ001").mask("999.999.999-99",{ placeholder:" " });
 
      // Listener on the text input
        $('#answer{SGQ}SQ002_SQ002').on('keyup', function(e) {
            $(this).val($(this).val().toUpperCase());
            checkconditions($(this).attr('value'), $(this).attr('name'), $(this).attr('type'));
        });
      
       $("#answer{SGQ}SQ001_SQ002").val(" ");
       $("#answer{SGQ}SQ001_SQ002").hide();
      
        // Identify the questions
        var qArrayID = '{QID}';
        var qArray = $('#question'+qArrayID);
        var arrayLength = $('tr[id^="javatbd"]', qArray).length;
        var qUploads = qArray.nextAll('.upload-files:lt('+arrayLength+')');
 
        // Add some classes
        qArray.addClass('array-with-uploads-question');
        $(qUploads).addClass('d-none');
 
        // Insert the "Upload" buttons
        $('tr[id^="javatbd"] .answer-item:last-child', qArray).each(function(i) {
            $('*', this).remove();
            $(this).append('<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#upload-'+qArrayID+'-'+(i+1)+'" data-bs-backdrop="static" data-bs-keyboard="false">Anexar comprovante</button>');
        });
 
        // Loop through the upload questions
        $(qUploads).each(function(i) {
            // Create a modal
            $('body').append('<div class="modal fade upload-modal" id="upload-'+qArrayID+'-'+(i+1)+'" tabindex="-1" aria-labelledby="uploadModalLabel'+qArrayID+'-'+(i+1)+'" aria-hidden="true">\
                                <div class="modal-dialog">\
                                    <div class="modal-content">\
                                        <div class="modal-header">\
                                            <h5 class="modal-title" id="uploadModalLabel'+qArrayID+'-'+(i+1)+'">'+$('.ls-label-question', this).html()+'</h5>\
                                            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fechar"></button>\
                                        </div>\
                                        <div class="modal-body">\
                                        </div>\
                                        <div class="modal-footer">\
                                            <button type="button" class="btn btn-primary" data-bs-dismiss="modal">OK</button>\
                                        </div>\
                                    </div>\
                                </div>\
                            </div>');
 
            // Move this question into the modal
            $('#upload-'+qArrayID+'-'+(i+1)+' .modal-body').append($(this));
            $(this).removeClass('d-none');
        });
 
        // Interrupt the Previous/Next/Submit function (to put upload questions back in the form)
        $('#limesurvey').on('submit', function(e) {
            $('.upload-modal .upload-files').appendTo($('.group-container:eq(0)')).addClass('d-none');
        });    
    });
</script>
<style data-author="Tony Partner" type="text/css">
.upload-modal .file-upload-modal.in {
        height: max-content;
    }
</style>
  • SabineE
  • SabineE's Avatar
23 May 2025 10:46
Hi,

I want to upgrade from 6.8.2+241203 to the latest version as of 2025-05-23 on our self-hosted instance. I have got a ComfortUpdate key of which I have used three updates which all of them failed.

Before updating, I make all the files writable:

find /var/www/html/limesurvey/ -exec chmod a+w {} +

Running the ComfortUpdate fails with the following message:

touch(): Utime failed: Operation not permitted

According to the output of this command,

find /var/www/html/limesurvey -mmin -3

there are lots of files (345) which have already been updated. Also, the version number which is printed in the admin panel increased to 6.14.0. Now I am afraid if this error tells me that the update was not complete, or can I just ignore it?

Kind regards,
Robert
  • gerism81
  • gerism81's Avatar
22 May 2025 12:46
Replied by gerism81 on topic Some features are not working
Also i have seen other things have disapeared:

Now when I am editing a question, i don't see all the stuf that i had before (changing colors, size...) and now only html code apear.

Text elements: When I am working on an introductory text and I save the progress, a very long code comes out, as if it were an error. The modifications are saved, but I have to reopen the file and go to the text elements screen.

Quick translation: It does not work, I translate different variables and press the "save" button but the modifications are not saved

All this happened to me after the last update.

Thanks
  • Joffm
  • Joffm's Avatar
15 May 2025 21:55 - 15 May 2025 22:02
Hallo,
einmal ganz abgesehen von Deinem "sehr ambitionierten" Ansatz - diese "exakt 24h spätere" Erinnerung ist doch rein akademisch, aber praktisch unsinnig (das schrieb @holch ja schon), hast Du auch durch die Art des Hostings (LimeSurvey Cloud Version 6.13.3) ein kleines - naja, größeres - Problem.
Denn hiermit hast Du weder einen direkten Zugriff auf die Datenbank noch kannst Du Plugins installieren.

Klar, wenn Du ein paar tausend in die Hand nimmst, gibt es sicherlich ein kommerzielles Tool mit diesem Feature. Dasjenige, mit dem ich vor 20 Jahre lange Zeit gearbeitet habe, kostet jetzt wohl an die 5000/Jahr.

Gut, versuchen wir etwas Licht ins Dunkel zu bringen.
1. Die spätere Zusammenführung.
Das bedeutet ja, dass in beiden Datensätzen eines Teilnehmers ein eindeutiges Merkmal vorhanden ist.
Das kann man natürlich in der ersten Umfrage generieren - meist wird man die SAVEDID nehmen.
Dieses muss aber dann im Link zur zweiten Umfrage enthalten sein, damit es auch dort vorhanden ist.
Die manchmal benutzte Lösung, den Teilnehmer selbst einen Code erzeugen zu lassen (Erster Buchstabe Vorname der Mutter + Erster Buchstabe Vorname des Vaters + Hubraum des Autos + Letzter Buchstabe der Heimatstadt + ... +), geht auch; ich bin kein Freund davon.
Gut, zusammenführen können wir also.

Eine andere Möglichkeit wäre auch, dass die Teilnehmer sich registrieren.
Dann kannst Du das Token als Zusammenführungsmerkmal nehmen und hast bereits die Email-Adresse.

2. Einladung 24h nach dem Beenden der ersten Umfrage (es ist doch das Beenden das entscheidende Kriterium - auch wenn der Teilnehmer zwischendurch für einen Tag unterbricht)
a. Meine präferierte Lösung wäre:
Ein kleines php script würde die Datenbank abfragen und an diejenigen, die fällig sind eine neue Einladung schicken mit dem entsprechenden Link und Parameter.
Dieses script würde ich mithilfe eines Cronjobs alle 5 Minuten aufrufen.
Das kannst Du allerdings nicht, da Du keinen Zugriff auf die Datenbank hast.

b. Allerdings kannst Du mithilfe der API
[url] www.limesurvey.org/manual/RemoteControl_2_API [/url]
die benötigte(n) Funktion(en) aufrufen, um die fälligen Teilnehmer herauszufiltern.
[url] api.limesurvey.org/classes/remotecontrol-handle.html [/url]
Dazu schreibst Du wieder ein php script, ruft es mittels Cronjob auf, wie gehabt.

Cronjob-Anbieter gibt es zahlreiche im Internet.

c. Wirklich manuell.
Das ist weniger aufwendig als Du denkst.
Du könntest zum Beispiel den Versand mit dem Add-on "Mail Merge" in Thunderbird durchführen.
[url] herbrand.org/tutorials/e-mail/thunderbir...nderbird-mail-merge/ [/url]
Du musst ja nur ca. alle 10 Minuten in LimeSurvey die Antworten anschauen und die neu hinzugekommenen letzten evtl. mittels Copy/Paste in die für das Mailmerge notwendige Tabelle zu kopieren.
Dann werden diese Teilnehmer wieder eingeladen.
Um in der Antworttabelle gut filtern zu können solltest Du eine eigenes Feld (versteckte Frage vom Typ Gleichung) anlegen, worin der TimeStamp des Beendens gespeichert ist.
Das ist durchaus machbar, wenn man es gut vorbereitet.

3. Die Teilnehmer haben 12h Zeit.
Zeit wozu? Anzufangen oder abzuschließen?
a. Das ist nicht weiter schwierig, wenn Du außer des in (1) beschriebenen Merkmals auch diesen Timestamp mit übergibst.
Dann musst Du nur entweder am Anfang oder am Ende testen, ob weniger als 12 Stunden vergangen sind.
Falls nein: Erstelle eine Quote, um den Teilnehmer rauszuschmeißen.
b. Oder Du benutzt wieder die API.
Hier wäre  die zweite Umfrage geschlossen.
Mit der API legst Du im Moment der Einladung diesen Teilnehmer an - und setzt die zeitliche Gültigkeit für die Beantwortung (valid from - valid to)


Langer Rede kurzer Sinn:
1. Es geht einiges. Allerdings hast Du natürlich die allerungünstigste Umgebung (Cloud, Basic)
Der Ansatz - die erste Einladung irgendwie in den Sozialen Medien hinauszutröten, birgt eben gewaltige Tücken.
Hast Du schon einmal daran gedacht, einen Panel Provider einzuschalten?
Dann liegt der Ball bei ihm. Allerdings hat er auch die Möglichkeiten - er weiß, wann seine Schäfchen den ersten Teil abgeschlossen haben, und kann den Rest sicherlich schnell programmieren.
Klar, kostet wieder.
Ich könnte mich einmal schlau machen, da die verschiedenen Firmen ja auch unterschiedliche Bezahlmodelle haben.

Mehr fällt mir gerade nicht ein.

Joffm

P.S.
Ic sehe gerade, dass holch auch über Antwortraten schrieb.
Gerade ein ganz aktuelles Beispiel.
Ein Dorf hier mit ca. 5000 Einwohnern.
Es gibt seit einem Jahr eine App für das Dorfgeschehen. Über diese sollte befragt werden.
1700 Einwohner haben sie heruntergeladen.
Alle wurden mit Flyern, in der App selbst, im Dorfblättchen, etc.  eingeladen.
Und es haben geantwortet?
146 Completes
60 Abbrüche
Und damit waren wir sehr zufrieden.

 
  • gregory.viel
  • gregory.viel's Avatar
13 May 2025 10:12
Replied by gregory.viel on topic Affichage lors de modifications de texte
Bonjour,

Je vous remercie pour votre réponse.

J'avais déjà effacer le cache à l'aide du bouton mais le problème est toujours présent.
J'ai pu identifier que c'était l'éditeur HTML intégré qui ne fonctionnait pas correctement sur notre installation.
Lorsque je choisi "Source HTML" tout fonctionne bien :
 
Cordialement
Displaying 1 - 15 out of 4950 results.

Lime-years ahead

Online-surveys for every purse and purpose