Champs conditionnels dans profil joomla

  • Posts: 505
  • Thank you received: 36
  • Hikaserial Subscription Hikashop Business
1 week 6 hours ago #369053

-- HikaShop version -- : 6.1.0
-- Joomla version -- : 5.3.1
-- PHP version -- : 8.3.16

Bonjour,

un petit message pour signaler un petit souci. Les champs conditionnels fonctionnent nickel sur la page d'inscription, si un champ requis n'est pas affiché car il dépend d'un autre, aucun souci.

Par contre, dans le profil joomla, les champs supplémentaires hikashop générés ne répondent pas pareil, la validation JS Joomla bloque sur ces champs, non visibles dans le form car les conditions ne sont pas remplies pour leur affichage, mais présents dans le DOM et donc "is not focusable"

De mon coté ce n'est pas urgent, j'ai fait un petit patch js en attendant, mais je tenais à vous faire remonter l'info.

Merci

Please Log in or Create an account to join the conversation.

  • Posts: 84580
  • Thank you received: 13751
  • MODERATOR
6 days 20 hours ago #369056

Bonjour,

Intéressant en effet. Quel patch avez-vous fait ? Car pour l'instant je ne suis pas sûr de quelle serait la méthode à appliquer pour éviter le problème.

Please Log in or Create an account to join the conversation.

  • Posts: 505
  • Thank you received: 36
  • Hikaserial Subscription Hikashop Business
2 days 6 hours ago #369112

Bonjour,

mon "patch" est un peu à l'arrache et pas générique du tout mais il règle mon souci je préviens :)

<script>
    // Corrige les champs conditionnels pour éviter le blocage de validation du formulaire JS
    document.addEventListener('DOMContentLoaded', function() {
        // 1) Cibler les 3 champs (id ou name — couvre les deux cas)
        var legalInputs = Array.from(document.querySelectorAll(
            'input[id^="user_legal_representative"],' +
            'input[name^="data[user][user_legal_representative"]'
        ));

        if (legalInputs.length === 0) {
            return;
        }

        var form = legalInputs[0].form || document.querySelector('form.form-validate') || document.querySelector('form');

        function isHidden(el) {
            // offsetParent === null couvre display:none et les éléments non focusables
            if (el.offsetParent === null) {
                return true;
            }
            // Vérifie si HikaShop masque via visibility/height/opacity
            var cs = window.getComputedStyle(el);
            if (cs.visibility === 'hidden' || cs.display === 'none' || parseFloat(cs.opacity) === 0) {
                return true;
            }
            // Vérifie si le conteneur parent est masqué
            var p = el.closest('.hikashop_field, .control-group, .form-group, li, div');
            if (p) {
                var cps = window.getComputedStyle(p);
                if (cps.display === 'none' || cps.visibility === 'hidden') {
                    return true;
                }
            }
            return false;
        }

        function syncOne(el) {
            var hidden = isHidden(el);
            if (hidden) {
                el.disabled = true; // Le validateur ignore un champ désactivé
                el.required = false;
                el.classList.remove('required', 'invalid', 'form-control-danger');
                el.setAttribute('aria-invalid', 'false');
                var label = form && form.querySelector('label[for="' + el.id + '"]');
                if (label) {
                    label.classList.remove('invalid');
                    var fb = label.querySelector('.form-control-feedback');
                    if (fb) {
                        fb.remove();
                    }
                }
            } else {
                el.disabled = false;
                el.required = true; // Quand visible, le champ redevient requis
                el.classList.add('required');
            }
        }

        function syncAll() {
            legalInputs.forEach(syncOne);
        }

        // 2) Synchroniser au chargement
        syncAll();

        // 3) Synchroniser avant chaque soumission (capture pour exécuter avant la validation Joomla)
        if (form) {
            form.addEventListener('submit', function() {
                syncAll();
            }, true);
        }

        // 4) HikaShop masque/affiche via toggleField → resynchroniser après chaque appel
        if (window.hikashop && typeof window.hikashop.toggleField === 'function') {
            var _origToggle = window.hikashop.toggleField;
            window.hikashop.toggleField = function() {
                var r = _origToggle.apply(this, arguments);
                setTimeout(syncAll, 0);
                return r;
            };
        }

        // 5) Resynchroniser sur tout changement d’état
        document.addEventListener('change', syncAll, true);
    });
</script>

Please Log in or Create an account to join the conversation.

Time to create page: 0.062 seconds
Powered by Kunena Forum