Hallo Ingmar,
der Ablauf ist schon so wie von dir beschrieben. Bei mir löst, noch bevor der Nutzer ein Feld ändert, das SQL-Feld ein change aus, was ich mir nicht erklären kann. Joomla-Test-Installation auf XAMPP. Mein Feld 'kurort' ist ein Radio mit nur 2 Optionen für zwei Kurorte. Es ist ein Pflichtfeld, aber ohne Vorauswahl. Die Anzeige von 'kurort' ist selbst zwar auch abhängig von einem weiteren Radio, welches aber eine Standardauswahl hat und somit immer angezeigt wird. Das SQL-Feld 'kurzeit' wird neu geladen, wenn sich 'kurort' ändert und versteckt, solange das SQL kein Ergebnis liefert. Das SQL-Statement nutzt lediglich input:kurort, um aus 2 unterschiedlichen Tabellen Zeiträume auszulesen und strukturiert zur Auswahl anzubieten.
Für das Formular habe ich ein (FEWA)
Code:
// bildSyntax löschen bei Änderung von Kurzeit und Gruppe, um Neuberechnung zu erzwingen
$('#' + kurzeitField).change(clearSyntaxField);
was auf Änderungen des SQL reagiert. Den Aufruf von clearSyntaxField überwache ich mit dem Debugger im Browser. Beim Laden des Formulars passiert nun Folgendes:
- Radio 'kurort' wird angezeigt, keine Option ist ausgewählt
- SQL-Listbox 'kurzeit' wird kurz angezeigt, dann aber ausgeblendet. Das dürfte wegen 'hideOnEmptyList' normal sein, da das SQL durch den noch fehlenden Kurort kein Ergebnis liefert.
- nach ca. 10 Sekunden (ohne irgendwelche Eingaben) wird ein change auf dem SQL-Feld ausgelöst. So wie ich es erkennen kann von jquery.min.js, und zwar 3x hintereinander, wobei $('#' + kurzeitField).val() immer '' ist. Hier lautet meine Frage: Warum wird ein change ausgelöst? Die lange Zeit von gut 10 Sekunden ist sicher meinem langsamen Testsystem geschuldet. Außerdem gibt es im Formular weitere SQL-Listboxen, die ebenfalls in Abhängigkeit von 'kurort' und 'kurzeit' als Trigger unterschiedlichste Daten bereitstellen, allesamt bleiben sie letztlich ausgeblendet, da 'kurort' und 'kurzeit' leer sind und immer "ohne Ergebnis verstecken" gesetzt ist.
Mein Workaround ist jetzt, dass ich kurort und kurzeit mit
Code:
$('.visform').bind('visformsInitialised', function() {
speichere und in clearSyntaxField mit den aktuellen Werten vergleiche und entsprechend weiter verfahre.
Ich hatte auch erst mein SQL aus 'kurzeit' im Verdacht, aber da sich 'kurort' nie ändert, habe ich das ausgeschlossen. Hier der Vollständigkeit halber mein Statement:
Code:
SELECT CONCAT('1_',`DG1`) AS value, CONCAT('1_',`DG1`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('2_',`DG2`) AS value, CONCAT('2_',`DG2`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('3_',`DG3`) AS value, CONCAT('3_',`DG3`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('4_',`DG4`) AS value, CONCAT('4_',`DG4`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('5_',`DG5`) AS value, CONCAT('5_',`DG5`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('6_',`DG6`) AS value, CONCAT('6_',`DG6`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('7_',`DG7`) AS value, CONCAT('7_',`DG7`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('8_',`DG8`) AS value, CONCAT('8_',`DG8`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('9_',`DG9`) AS value, CONCAT('9_',`DG9`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT CONCAT('10_',`DG10`) AS value, CONCAT('10_',`DG10`) AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT `Jahr` AS value, CONCAT(`Jahr`,' - Kurzeit manuell ins Info-Feld eintragen!') AS label, `Jahr` AS jahr FROM `#__kurdaten_${input:kurort}` UNION
SELECT `Jahr` AS value, CONCAT(`Text`,' - Kurzeit manuell ins Info-Feld eintragen!') AS label, `Jahr` AS jahr FROM `#__kurdaten_unbekannt` order by jahr, value
Gleiches passiert auch beim Editieren eines Datensatzes. Da sind ja alle Felder mit den Werten aus der Datenbank ausgefüllt. Aber auch da wird nach ca. 10 Sekunden wieder 3x nacheinander ein change für das SQL 'kurzeit' ausgelöst, ohne dass sich der ausgewählte Wert geändert hat.