Yiiフォームモデル使用および配列形式でのフォームデータのコミット

6921 ワード

Yiiドキュメントの説明によると、Yiiがフォームを処理する一般的なプロセスは次のとおりです.
  • フォームに対応するモデルクラスを作成し、フィールド検証ルール
  • を設定する
  • フォームコミット対応actionを作成し、コミットされたコンテンツ
  • を処理する.
  • ビューにフォームform
  • を作成する
    先ほどの小さなプロジェクトではajaxを使用してフォーム情報をコミットして検証保存したいし、iframeを隠してリフレッシュなしコミットをしたくないし、actionでモデルクラスの検証方法を使用できるようにするには、フォーム配列を使用してコミットする方法を考えています.例を挙げます.
    formコード:
    <form action='' method='post' name='form_test'>
    
        <input type='text' name='arr[]' value='1'>
    
        <input type='text' name='arr[]' value='2'>
    
        <input type='text' name='arr[]' value='3'>
    
    </form>

    コミット後、$_を直接使用できます.POST['arr']でコミットされたデータを取得し、$POST['arr']は:
    Array
    ( [0] => a [1] => b [2] => c )

    同様に、次のformを使用してコミットする場合は、次のformを使用します.
    <form action='' method='post' name='form_test'>
    
        <input type='text' name='arr[3]' value='a'>
    
        <input type='text' name='arr[6]' value='b'>
    
        <input type='text' name='arr[8]' value='c'>
    
    </form>

    $_POST['arr']は:
    Array
    
    (
    
        [3] => a
    
        [6] => b
    
        [8] => c
    
    )

    もちろん、2 D配列もコミットできます.
    <form action='http://127.0.0.1/zhaobolu/test.php' method='post' name='form_test'>
    
        <input type='text' name='arr[][name1]' value='a'>
    
        <input type='text' name='arr[][name2]' value='b'>
    
        <input type='text' name='arr[][name3]' value='c'>
    
    </form>

    $_POST['arr']は:
    Array
    
    (
    
        [0] => Array
    
            (
    
                [name1] => a
    
            )
    
    
    
        [1] => Array
    
            (
    
                [name2] => b
    
            )
    
    
    
        [2] => Array
    
            (
    
                [name3] => c
    
            )
    
    )

    ここで、最初のサブ配列のkeyを設定しないと、配列を生成するときにarrに各値が順次追加され、arrayに情報を保存したい場合はkey値を追加すればよいという問題があります.以下のようにします.
    <form action='http://127.0.0.1/zhaobolu/test.php' method='post' name='form_test'>
    
        <input type='text' name='arr[a][name1]' value='a1'>
    
        <input type='text' name='arr[a][value1]' value='a2'>
    
        <input type='text' name='arr[b][name2]' value='b1'>
    
        <input type='text' name='arr[b][value2]' value='b2'>
    
    </form>

    $_POST['arr']は:
    Array
    
    (
    
        [a] => Array
    
            (
    
                [name1] => a1
    
                [value1] => a2
    
            )
    
        [b] => Array
    
            (
    
                [name2] => b1
    
                [value2] => b2
    
            )
    
    )

     
    次にajaxでフォームをコミットしyiiフォームモデルで検証する例を貼ります.まずモデルクラス部分で、最も簡単な検証方法しかありません.
    <?php
    
    class LandingForm extends CFormModel
    
    {
    
        public $landing_title;
    
        public $landing_content;
    
        public $landing_position;
    
    
    
        public function rules()
    
        {
    
            return array(
    
                array('landing_title, landing_content', 'required'),
    
                array('landing_position', 'default', 'value'=>''),
    
            );
    
        }
    
    }

    興味深いことに、モデルクラスはパラメータチェックの方法を設定する際に、publicパラメータごとにルールを設定する必要があります.ルールを設定していないパラメータがあれば、$POSTのフォーム値がモデルに割り当てられている場合、ルールが設定されていないパラメータ値は空になります
    Actionでフォームにコミットされたパラメータを取得し、検証します.
    $model = new LandingForm;
    $model
    ->attributes = $_POST['form']; if($model->validate()){ $info = $model->attributes; ... }
    ...

    最後に、フォーム部分のコードをフロントエンドでコミットし、jqueryを使用します.
    var info = new Object();
    
    info = { 'form[landing_title]': landing_title,
    
            'form[landing_content]': landing_content,
    
            'form[landing_position]': landing_position,
    
            };
    
    
    
    var url = "...";
    
    
    
    $.post(url, info, function(rst){
    
        ... 
    
    });