it-swarm.com.de

Lassen Sie JForm-Felder voneinander abhängig sein

Ich möchte dieses Problem lösen:

Ich habe einige Felder in meinem Formular. Einige sind Kombinationsfelder, Optionsfelder, Texteingaben und so weiter.

Nun möchte ich folgendes tun: Wenn der Radioknopf 1 den Wert 1 hat, soll die Texteingabe erscheinen (funktioniert mit showon) und wenn sie erscheint, sollte sie erforderlich sein.

Wenn es nicht angezeigt wird, sollte es nicht erforderlich sein.

Ist das möglich?

1
MyFault

Ja, das ist möglich, ist aber eine große Arbeit. Für Joomla sind zwei Überprüfungsereignisse erforderlich. Eine im Browser und die andere auf dem Server kurz vor dem Speichern des Formulars. Der Browser ist der einfach zu überbrückende Teil, die serverseitige Überprüfung ist schwieriger.

Ich füge meinem Formular ein zusätzliches verstecktes Feld mit dem Namen "not_required" hinzu und sende damit die nicht benötigten Felder an den Server. Dann habe ich in der erweiterten Klasse JModelAdmin für diese Ansicht die Validierungsmethode neu geschrieben, um die Werte im Feld "not_required" bei der Validierung zu berücksichtigen.

Gut genug gesagt, hier ist der Code zur Überbrückung der Browser-Validierung:

    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;
            }
        }
    }

Entschuldigen Sie die generische Benennung, aber die obigen Informationen sollen Ihnen eine gute Vorstellung davon geben, wie Sie ein Feld aktualisieren, damit die Browserverifizierung deaktiviert wird.

Sie werden sehen, dass es einen Funktionsaufruf "updateFieldRequired ('css_view', 0)" gibt.

Hiermit wird das ausgeblendete Feld festgelegt, das auf der Serverseite bei diesem Validierungsproblem hilfreich ist. Hier ist der Code für diese Funktion.

// 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);
}

Hier ist die neue Validierungsmethode für das Modell

    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);
    }

Hier habe ich eine Demo-Komponente auf GitHub , die eine feldabhängige Implementierung hat. Schauen Sie sich auch die Modellvalidierungsmethode und andere verwandte Skripte an.

Hoffe das ist was du suchst, bis zum nächsten Mal pass auf dich auf!

3
Llewellyn