Welcome to the LimeSurvey Community Forum

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

Matrix mit Klappbox und Eingabefeld für Zahlen (nur ganze Zahlen)

  • HETILV
  • HETILV's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
2 weeks 3 days ago #262968 by HETILV
Bitte helfen Sie uns, Ihnen zu helfen und füllen Sie folgende Felder aus:
Ihre LimeSurvey-Version: 6.5.5
Eigener Server oder LimeSurvey-Cloud: Eigener
Genutzte Designvorlage: vanilla
==================
Hallo,

ich habe eine Matrixfrage mit einer Klappbox- und 2 Eingabespalten erstellt. Bei der 2. und 3. Spalte (Einheit und Jahr) werden nur Zahleneingaben zugelassen.

1. Leider habe ich nun bemerkt, dass er auch Punkte beim Schreiben nimmt. Das sollte so auf keinen Fall so sein. Kann man das abstellen?

2. Könnte man zusätzlich nur bei der 3. Spalte (Jahr) die Eingabe auf 4 Ziffern beschränken?

Gruß
HETILV
 

File Attachment:

File Name: limesurvey...3677.lss
File Size:37 KB

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 3 days ago #262975 by Joffm
Naja,
1. Du könntest Eingabemasken benutzen (finde ich persönlich ganz charmant)
siehe. mein "Tutorial 3: Gimmicks", Kap. 5.

2. Validierung mittels Regular Expression, also Funktion "regexMatch"

3. Es gibt auch irgendwo ein script, welches direkt bei der Eingabe alles außer Ziffern "rausschmeißt".
Muss man suchen.

Und ich muss jetzt weg.

Bis später
Joffm

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

Please Log in to join the conversation.

  • holch
  • holch's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 2 days ago #262996 by holch

Und ich muss jetzt weg.





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.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 2 days ago #263014 by Joffm
Ach, holch,
aber meine Frau scharrte schon mit den Hufen, dass ich sie zum Arzt fahre.

Gut, zurück zum Thema.
Das erwähnte script ist ja vorhanden.
Aber klar, es testet auf "isnumeric". Und der Dezimalpunkt gehört dazu.

Zusätzlich muss man also auf '.' testen und ihn dann ersetzen.

Es gibt dieses Script auch mit einer Erweiterung auf Minwert und Maxwert.

Ich werde einmal schauen, was da zu machen ist.

Dann benutzt Du ein veraltetes script; das für die "Sonstigen".
Seit Limesurvey 3.x. haben sich Bezeichnungen für Klassen und Identifier geändert.
Betrifft bei Dir den "Weiter"-Button.
Bevor ich jetzt am Smartphone aufgrund einsetzender Demenz Blödsinn schreibe, schau selbst nach, wie er heißt, z.B. Tutorial Gimmicks, gleich das zweite Beispiel.

Und als Schlusssatz:
Inputmask finde ich immer noch gut.

Morgen kommt eine lss.

Bis dann 
Joffm 
​​​​​​

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

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 2 days ago #263075 by Joffm
So, jetzt kommt die Lösung:
Um zusätzlich zu Deinem script den Dezimalpunkt zu löschen, habe ich es einfach davor gesetzt
Code:
        // Numerics only
           var id=thisValue.indexOf('.');
           if(id >0) {
             newValue=thisValue.replace('.','');
             $(this).val(newValue).trigger('change');
        }
        if($.isNumeric(thisValue) === false) {

Also:
  • Guck nach, ob ein Punkt vorhanden ist
  • Wenn Ja
  • Ersetze ihn durch Nichts

Leider klappte der Test auf "isInteger" nicht.

Wenn Du es so machen möchtest, würde ich eine einfache Validierung auf eine vernünftige Jahreszahl einbauen.
Da es "seit" heißt, wird die Jahreszahl also nicht größer als das aktuelle Jahr sein.
Dann wäre eine mögliche Validierung
strlen(D2a_Y017_X002)==4 and D2a_Y017_X002 le date('Y')
Also: Vier Stellen und kleiner oder gleich dem aktuellen Jahr.
Kannst Du dann auch als Tipp nehmen
Bitte, nur Jahreszahlen bis {date('Y')}

Oder (ich hacke immer noch auf der Eingabemaske herum)
mit der Bibliothek von Robin Herbots.
für das Jahr beispielhaft dies (von 1900 bis 2099)
Code:
<script src="https://cdnjs.cloudflare.com/ajax/libs/inputmask/4.0.9/jquery.inputmask.bundle.min.js"></script>
 
<script type="text/javascript" charset="utf-8">
    $(document).on('ready pjax:scriptcomplete',function(){ 
         $('#question{QID} .answer_cell_X002 input[type="text"]').inputmask({ regex: "([1][9])|([2][0])[0-9][0-9]|",
            'placeholder': '_',
            'removeMaskOnSubmit': false,
            'rightAlign': false,
        });
    });
</script>

Für die erste Spalte ähnlich, schau einfach in die Dokumentation!


Jetzt zu Deiner "Sonstigen"-Behandlung.
Das kann auch mit dem richtigen Identifier des Buttons (#ls-button-submit") nicht funktionieren, da dieses script ja für eine "normale" Matrix mit Radio-Buttons ist.
Siehst Du hier
if(($('input:radio[value!=""]:checked', this).length > 0 && $('input[type="text"]', this).val() == '') || ($('input:radio[value!=""]:checked', this).length == 0 && $('input[type="text"]', this).val() != '')) {
Es geht also darum, dass immer auch ein Radio-Button geklickt ist.
Da könnte man einfach validieren in der Art
(!is_empty(Textfeld) and !is_empty(Spalte 1) and !is_empty(Spalte 2) and ...) OR
(is_empty(Textfeld) and is_empty(Spalte 1) and is_empty(Spalte 2) and ...)

Alles gefüllt oder alles leer.

Bis dann
Ich habe wieder etwas vor, nämlich Kaffee trinken und Kuchen essen (damit @holch mir wieder ein Video schickt. )
Joffm


 

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

Please Log in to join the conversation.

  • HETILV
  • HETILV's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
2 weeks 1 day ago #263124 by HETILV
Hallo Joffm,

erstmal vielen lieben Dank.
Ich habe das Script zum Löschen des Dezimalpunktes genutzt. Es funktioniert prima.
Ich hoffe, dass ich damit in meinen anderen Fragen auch weiter komme, denn ich habe isNumeric in mehreren Fragen verbaut. Leider, habe ich erst sehr spät gemerkt, dass das Problem mit dem Punkt besteht.

Da ich das Problem in vielen Fragen habe, kommt für mich das mit der Eingabemaske nicht in Frage. Zudem muss ich gestehen, dass mir das im Moment zu hoch ist.

Die Validierung für das Jahr habe ich eingebaut. Es muss doch in die Fragenvalidierung, oder? Da funktioniert leider nicht. Da gehen gleich alle Eingabekästen von Anfang an auf rot. Habe ich jetzt auch erstmal wieder gelöscht, weil das mit dem Sonstigen probieren wollte.

Das mit dem Sonstigen funktioniert auch nicht. Ist vielleicht nicht mein Tag. Wieso prüft er alle Felder? Wieviel Script muss ich denn rausschmeißen oder dürfte er auch drinnen bleiben? Ich glaube, ich muss mich damit nächste Woche nochmal beschäftigen.

Gruß
HETILV
 

File Attachment:

File Name: limesurvey...5-02.lss
File Size:38 KB

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 1 day ago #263125 by Joffm
Dass Du einen initialen Fehler hast, ist klar.
Am Anfang ist die Bedingung ja nicht erfüllt.
Da muss zusätzlich noch die Erlaubnis rein, dass das Feld leer ist, also "is_empty(Feld) or strlen(Feld)... "
Das wollte ich aber Dir überlassen.

Abgesehen davon: Das Einfachste, Dezimalzahlen zu verhindern ist natürlich die Validierung auf "is_int()",
oder auch ein "regexMatch" auf einen vernünftigen Jahresbereich, der genau 0-mal oder 1-mal auftaucht.
​​​​​​
Und wenn der Bereich nicht zu groß ist, mach ein Dropdown.

Es gibt halt viele Möglichkeiten 

Joffm 

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

Please Log in to join the conversation.

  • HETILV
  • HETILV's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
1 week 4 days ago - 1 week 4 days ago #263334 by HETILV
Hallo Joffm,

ich bin mit der Aufgabe eindeutig überfordert. Es klappt leider gar nichts.
Für einen Dropdown ist der Bereich leider zu groß. 

File Attachment:

File Name: limesurvey...6771.lss
File Size:38 KB


Gruß
HETILV

 

File Attachment:

File Name: limesurvey...6771.lss
File Size:38 KB
Last edit: 1 week 4 days ago by HETILV.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
1 week 4 days ago #263344 by Joffm
Bitte, bereinige zunächst Deine scripte.
Ich schrieb bereits, dass sich die "Sonstigen"-Behandlung im script auf "Matrizen" bezieht, nicht auf "Matrizen(Text)", und auch dass der "Weiter"-Button nicht mehr den Identifier "#movesubmitbtn", bzw, "#movenextbtn" hat. Seit Version 3.x. ist es "#ls-button-submit".

Okay, Validierungen bei Fragen mit initialem Fehler sind immer etwas tricky.
Ich habe jetzt einmal dies genommen.
Validierung:
((is_empty(D1a_Y017_X002) or (strlen(D1a_Y017_X002)==4 and D1a_Y017_X002 le date('Y'))) and (is_empty(D1a_Y018_X002) or (strlen(D1a_Y018_X002)==4 and D1a_Y018_X002 le date('Y'))) and (is_empty(D1a_Y019_X002) or (strlen(D1a_Y019_X002)==4 and D1a_Y019_X002 le date('Y')))) and ((!is_empty(D1aSonst) and count(self.sq_Y019)==3) OR (is_empty(D1aSonst) and count(self.sq_Y019)==0))

Und als Hinweis:
{if(D1a_Y017_X002 gt date('Y') or D1a_Y018_X002 gt date('Y') or D1a_Y019_X002 gt date('Y'),"Bitte, nur Jahreszahlen bis "+date('Y'),"")}
{if(!is_empty(D1aSonst) and count(self.sq_Y019)!=3,"<br/>Bitte, vervollständigen Sie 'Sonstiges'","")}


Du siehst, dass ich für die "Sonstigen" einfach die Eingaben gezählt habe.
Wenn in "Sonstige" etwas steht, müssen es 3 sein, sonst 0.
Das ist nicht der Weisheit letzter Schluss; an sich müsste man mit einem verschachtelten IF arbeiten.
Hier wird die Leerzeile ja immer eingefügt, auch wenn es keinen Jahreszahlfehler gibt.
Und wenn man den Jahreszahltipp ohne Bedingung einfügt, wird er ebenfalls rot, wenn der "Sonstigen"-Fehler angezeigt wird.
   
 
 




2. Lösung (mit "RegexMatch")
Validierung:
(regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y017_X002) and regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y018_X002) and regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y019_X002)) and ((is_empty(D2aSonst) and count(self.sq_Y019)==0) or (!is_empty(D2aSonst) and count(self.sq_Y019)==3)) 

Hinweis
{if(!regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y017_X002) or !regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y018_X002) or !regexMatch("/^((19[0-9][0-9])|(20[01][0-9])|(202[0-4]))?$/",D2a_Y019_X002),"Bitte, nur Jahreszahlen bis "+date('Y'),"")}
{if((!is_empty(D2aSonst) and count(self.sq_Y019)!=3) or (is_empty(D2aSonst) and count(self.sq_Y019)!=0),"<br>Bitte, vervollständigen Sie die 'Sonstigen'","")} 


Hier gilt dasselbe wie vorher.

Daher wäre für mich die einfachste Lösung, für die Jahreszahl ein zweites Drop-Down zu nehmen.
 
Dann bist Du von der gesamten Validierung der Jahreszahl ab.
Es bleibt der Test auf "Zeile gefüllt"


 

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

Please Log in to join the conversation.

  • HETILV
  • HETILV's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
1 week 3 days ago #263378 by HETILV
Hallo Joffm,

ich habe jetzt die Jahreszahl über ein Dropdown geregelt. Eigentlich wollte ich das nicht, weil die Jahreszahlen von 1960 bis 2024 eingefügt werden mussten. Aber nun ist es so.

Bitte entschuldige, dass ich das Script nicht bereinigt habe. Ich habe von Programmierung keine Ahnung. Muss ich was entfernen oder umschreiben?
Ich habe das Ganze eigentlich nur wo rauskopiert.

Muss ich für den Weiter-Button nur die beiden Sachen gegen #ls-button-submit austauschen?
// Validate the "Other" text inputs on submit
        if($('#movenextbtn, #movesubmitbtn').attr('data-inserted-other') != 'true') { // We're only doing this once on this page
            $('#movenextbtn, #movesubmitbtn').attr('data-inserted-other', 'true').on('click.insertedOther', function (event) {

Wenn ich die Sonstiges-Abfrage über die Validierung machen möchte, was muss dann alles aus dem Script gelöscht werden?

Gruß
HETILV
 

Please Log in to join the conversation.

  • HETILV
  • HETILV's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
1 week 2 days ago #263403 by HETILV
Ich habe den Eingabekasten bei Sonstige nun entfernt und in eine Extrafrage gepackt.

Gruß
HETILV

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
1 week 2 days ago #263413 by Joffm
Hallo,
zunächst zu Deiner vorigen Frage:
Dies alles ist im script überflüssig, da es hier um "Radio-Buttons" geht (input:radio) und nicht um Textfelder.
D.h. "Kann weg"
Code:
        // Handle the "Other" radios
//Diese Funktion geht von hier (geschweifte Klammer auf)
        $('input[type="text"]', thisQuestion).on('keyup change',function(event){
            event.stopPropagation();
 
            var thisRow = $(this).closest('tr.answers-list');            
            if($.trim($(this).val()) == '') {
                $('input:radio[value!=""]', thisRow).prop('checked',false);
                $('input:radio[value=""]', thisRow).click();
            }
            else {
                $('input:radio[value=""]', thisRow).prop('checked',false);
            }
        });    
 // Bis hier
 
        // Handle the "Other" text inputs
// Eine neue Funktion - wenn der Text leer ist, lösche einen geklickten Radio-Button
        $('.otherRow input.radio', thisQuestion).on('click',function(event){
            var thisRow = $(this).closest('tr.answers-list');
            if($(this).attr('value') == '') {
                $('input[type="text"]', thisRow).val('');
            }
        });
 // Ende dieser Funktion
 
        // Validate the "Other" text inputs on submit
// Hier eine Bedingung, die nur das Flag 'otherError' setzt
        if($('#movenextbtn, #movesubmitbtn').attr('data-inserted-other') != 'true') {
            $('#movenextbtn, #movesubmitbtn').attr('data-inserted-other', 'true').on('click.insertedOther', function (event) {
 
                var otherError = 0;
 
                $('.array-flexible-row .otherRow').each(function(i) {
 
                    if(($('input:radio[value!=""]:checked', this).length > 0 &amp;&amp; $('input[type="text"]', this).val() == '') || ($('input:radio[value!=""]:checked', this).length == 0 &amp;&amp; $('input[type="text"]', this).val() != '')) {
                        otherError = 1;
                    }
                });
 // und im Falle eines Fehlers den Alert anschmeißt
                if(otherError == 1) {
                    alert('Please review your answer in the "Other" row(s).');
                    return false;
                }
            });
        }
// Und hier ist das Ende des IFs

Wenn ich die Sonstiges-Abfrage über die Validierung machen möchte

Das war doch bereits enthalten.
Ich schrieb

Du siehst, dass ich für die "Sonstigen" einfach die Eingaben gezählt habe.
Wenn in "Sonstige" etwas steht, müssen es 3 sein, sonst 0.

Nämlich hier (und mit screenshot):
and ((!is_empty(D1aSonst) and count(self.sq_Y019) eq 3 OR (is_empty(D1aSonst) and count(self.sq_Y019) eq 0))
Ich habe den Operator "==" in "eq" geändert, damit der Editor nicht immer meint, ein Smiley daraus machen zu müssen.

Joffm

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

Please Log in to join the conversation.

Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose