Hallo @all,
mir ist aufgefallen, das wenn ich ein required field einen showon zuweise, dass ein leeres Feld auch eine Warnung wirft wenn es ausgeblendet ist.
Jetzt möchte ich per Javascript hook an Joomla.setUpShowon andocken und auf den visible state reagieren um das required zu setzen oder zu entfernen.
Hat da jemand einen Ansatz für mich?
Fields und showon
- togo
- Erledigt
-
-
Ich habe das Problem einmal so gelöst, dass ich dem "required field" einen Standardwert zugewiesen habe, den ich in der späteren Logik als "leer" ausgewertet habe.
-
Danke astrid,
werd ich mal versuchen. -
Update:
Ich hab mich mal hingesetzt und ein kleines Script geschrieben.
Momentan läuft es nur mit Radio Buttons.Code
Alles anzeigen/** * @copyright Copyright (C) 2020 Thomas Goldbach. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @version 1.0 * Used parts of cms.js opyright (C) 2005 - 2020 Open Source Matters, Inc. * */ /** * @since: 1.0 */ Joomla = window.Joomla || {}; !(function (document, Joomla) { "use strict"; window.jQuery && (function ($) { var $chain = new Array(); /** * Joomla.setUpChain * Diese Funktion durchsucht die von Joomlas cms.js erstellten showon HTML Elemente um anhand der Informationen * aus den json deklarationen und den Elementen mit dem required Attribut einen Array zu füllen. * @since: 1.0 */ Joomla.setUpChain = function () { var $showonElements = $(document).find('[data-showon]'); for (var is = 0, ls = $showonElements.length; is < ls; is++) { // Use anonymous function to capture arguments (function () { var $target = $($showonElements[is]), jsondata = $target.data('showon') || [], field, values, sign, $fields = $(); var $childs = $target.find('.controls').find('.required'); // Collect an all referenced elements for (var ij = 0, lj = jsondata.length; ij < lj; ij++) { field = jsondata[ij]['field']; values = jsondata[ij]['values']; sign = jsondata[ij]['sign']; $fields = $fields.add($('[name="' + field + '"], [name="' + field + '[]"]')); for (var fi = 0, fl = $fields.length; fi < fl; fi++) { var field_id = $($fields[fi]).attr('id'); var field_name = $($fields[fi]).attr('name'); var field_val = $($fields[fi]).val(); if ($chain[field_id] === undefined) { $chain[field_id] = []; } if ($childs.length > 0) { for (var ic = 0, lc = $childs.length; ic < lc; ic++) { var child_name = $($childs[ic]).attr('name'); var child_id = $($childs[ic]).attr('id'); var child_val = true; if ($chain[field_id][child_id] == undefined) { console.log('Set Child value for ' + child_id); switch (sign) { case '=': if (values.includes(field_val)) { $chain[field_id][child_id] = true; child_val = true; } else { $chain[field_id][child_id] = false; child_val = false; } break; case '!=': if (values.includes(field_val) == false) { $chain[field_id][child_id] = true; child_val = true; } else { $chain[field_id][child_id] = false; child_val = false; } break; } //Setzt das required Element beim start if ($("#" + field_id).is(":checked")) { Joomla.setRequiredToFormField(child_id, child_val); } } } } } } // Fügt den Event an das referenzierte Element an, um die required Elemente des Referenzelements bei change und keyup neu zu setzen. $fields.on('change keyup', function () { Joomla.walkTheChain($(this).attr('id')); }); })(); } } /** * Joomla.walkTheChain * Die Funktion wird aufgerufen, wenn an dem entsprechenden showon Aktions Element der change oder keyup event ausgeführt wird. * @param e ; Die ID des ausführenden Elements * @since 1.0 */ Joomla.walkTheChain = function (e) { var a = $chain[e]; for (var prop in a) { Joomla.setRequiredToFormField(prop, a[prop]); } } /** * Diese Funtion setzt den required status der übergebenen Elementen id * @param field ; String; Die id des zu setzenden Elementes * @param required ; bool; Der Status * @since 1.0 */ Joomla.setRequiredToFormField = function (field, required) { $('#' + field).attr("required", required); $('#' + field).attr("aria-required", required); $('#' + field).toggleClass("required", required); } $(document).ready(function () { Joomla.setUpChain(); }); })(jQuery); })(document, Joomla);
Es geht bestimmt besser oder geschickter. Wer Lust hat kann ja mal seine Erfahrungen hier posten.
Guten Rutsch.