web-dev-qa-db-fra.com

Laissez JForm-Field être dépendants les uns des autres

Je voudrais résoudre ce problème:

J'ai des champs dans mon formulaire. Certains sont des listes déroulantes, des boutons radio, des entrées de texte, etc.

J'aimerais maintenant procéder comme suit: Si le bouton radio 1 a la valeur 1, une entrée de texte doit apparaître (fonctionne avec showon) et, le cas échéant, elle devrait être obligatoire.

Si ce n'est pas indiqué, cela ne devrait pas être nécessaire.

Est-il possible de faire ça?

1
MyFault

Oui c'est possible mais c'est un travail important autour. Joomla a deux événements de vérification requis. L'un dans le navigateur et l'autre sur le serveur juste avant l'enregistrement du formulaire. Le navigateur est la partie la plus facile à combler, la vérification côté serveur est plus délicate.

J'ajoute un champ caché supplémentaire appelé "not_required" à mon formulaire et l'utilise pour envoyer les champs non requis au serveur. Ensuite, dans la classe étendue JModelAdmin pour cette vue, je réécris la méthode validate afin de prendre les valeurs dans le champ "not_required" du compte lors de la validation.

Assez bien dit, voici le code pour relier la validation du navigateur:

    jform_LATkbJUPdS_required = false;  

    // the LATkbJU function
    function LATkbJU(add_css_view_LATkbJU)
    {
        // set the function logic
        if (add_css_view_LATkbJU == 1)
        {
            jQuery('#jform_css_view').closest('.control-group').show();
            if (jform_LATkbJUPdS_required)
            {
                updateFieldRequired('css_view',0);
                jQuery('#jform_css_view').prop('required','required');
                jQuery('#jform_css_view').attr('aria-required',true);
                jQuery('#jform_css_view').addClass('required');
                jform_LATkbJUPdS_required = false;
            }

        }
        else
        {
            jQuery('#jform_css_view').closest('.control-group').hide();
            if (!jform_LATkbJUPdS_required)
            {
                updateFieldRequired('css_view',1);
                jQuery('#jform_css_view').removeAttr('required');
                jQuery('#jform_css_view').removeAttr('aria-required');
                jQuery('#jform_css_view').removeClass('required');
                jform_LATkbJUPdS_required = true;
            }
        }
    }

Désolé pour le nom générique, mais ce qui précède devrait vous donner une bonne idée de la façon de mettre à jour un champ afin que la vérification du navigateur soit désarmée.

Vous verrez qu'il y a un appel de fonction "updateFieldRequired ('css_view', 0);"

Ceci est utilisé pour définir le champ caché qui aide du côté serveur ce problème de validation. Voici le code pour cette fonction.

// update required fields
function updateFieldRequired(name,status)
{
    var not_required = jQuery('#jform_not_required').val();

    if(status == 1)
    {
        if (isSet(not_required) && not_required != 0)
        {
            not_required = not_required+','+name;
        }
        else
        {
            not_required = ','+name;
        }
    }
    else
    {
        if (isSet(not_required) && not_required != 0)
        {
            not_required = not_required.replace(','+name,'');
        }
    }

    jQuery('#jform_not_required').val(not_required);
}

Voici la nouvelle méthode validate pour le modèle

    protected function checkString($string)
    {
        if (isset($string) && is_string($string) && strlen($string) > 0)
        {
            return true;
        }
        return false;
    }

    public function validate($form, $data, $group = null)
    {
        // check if the not_required field is set
        if ($this->checkString($data['not_required']))
        {
            $requiredFields = (array) explode(',',(string) $data['not_required']);
            $requiredFields = array_unique($requiredFields);
            // now change the required field attributes value
            foreach ($requiredFields as $requiredField)
            {
                // make sure there is a string value
                if ($this->checkString($requiredField))
                {
                    // change to false
                    $form->setFieldAttribute($requiredField, 'required', 'false');
                    // also clear the data set
                    $data[$requiredField] = '';
                }
            }
        }
        return parent::validate($form, $data, $group);
    }

Ici, j'ai un composant de démonstration sur GitHub qui a un implémentation dépendante du champ regardez également la méthode validate du modèle et les autres scripts associés.

J'espère que c'est ce que vous recherchez, en attendant la prochaine fois!

3
Llewellyn