web-dev-qa-db-ja.com

JForm-Fieldsを相互に依存させる

この問題を解決したいと思います:

フォームにいくつかのフィールドを取得しました。コンボボックス、ラジオボタン、テキスト入力などがあります。

今、私は次のことをしたいと思います:Radio-Button 1の値が1の場合、テキスト入力が表示され(showonで動作します)、表示される場合は必須です。

表示されていない場合は必要ありません。

それは可能ですか?

1
MyFault

はい、これは可能ですが、主要な回避策です。 Joomlaには2つの必須検証イベントがあります。 1つはブラウザにあり、もう1つはフォームを保存する直前のサーバーにあります。ブラウザーはブリッジするのが簡単な部分であり、サーバー側の検証はよりトリッキーです。

「not_required」という追加の非表示フィールドをフォームに追加し、これを使用して不要なフィールドをサーバーに送信します。次に、このビューのJModelAdmin拡張クラスで、検証時に「not_required」フィールドの値を取るようにvalidateメソッドを書き換えます。

さて、ブラウザの検証を橋渡しするコードは次のとおりです。

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

一般的な名前付けで申し訳ありませんが、上記は、フィールドを更新してブラウザーの検証を解除する方法についての良いアイデアを提供します。

「updateFieldRequired( 'css_view'、0);」という関数呼び出しがあることがわかります。

これは、この検証の問題のサーバー側で役立つ非表示フィールドを設定するために使用されます。この関数のコードは次のとおりです。

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

これはモデルの新しい検証メソッドです

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

ここに GitHubのデモコンポーネント があります フィールド依存の実装モデル検証メソッド と関連する他のスクリプトも見てください。

これがあなたが探しているものであることを願って、次回は気をつけてください!

3
Llewellyn