- Posts: 23
- Thank you received: 0
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
- Topic Author
- Offline
- Junior Member
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
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
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
- Offline
- LimeSurvey Community Team
- Posts: 11712
- Thank you received: 2756
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
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
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
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
Um zusätzlich zu Deinem script den Dezimalpunkt zu löschen, habe ich es einfach davor gesetzt
// 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)
<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
- Topic Author
- Offline
- Junior Member
- Posts: 23
- Thank you received: 0
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
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
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
- Topic Author
- Offline
- Junior Member
- Posts: 23
- Thank you received: 0
ich bin mit der Aufgabe eindeutig überfordert. Es klappt leider gar nichts.
Für einen Dropdown ist der Bereich leider zu groß.
Gruß
HETILV
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
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)=) 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)!,"<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)=))
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)!) 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
- Topic Author
- Offline
- Junior Member
- Posts: 23
- Thank you received: 0
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
- Topic Author
- Offline
- Junior Member
- Posts: 23
- Thank you received: 0
Gruß
HETILV
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
- Posts: 13057
- Thank you received: 4021
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"
// 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 && $('input[type="text"]', this).val() == '') || ($('input:radio[value!=""]:checked', this).length == 0 && $('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
Das war doch bereits enthalten.Wenn ich die Sonstiges-Abfrage über die Validierung machen möchte
Ich schrieb
Nämlich hier (und mit screenshot):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.
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.