1

2 つの入力テキスト フィールドを持つフォームがあります。

<input id="ModelName_test_0" name="ModelName[test][0]" type="text">
<input id="ModelName_test_1" name="ModelName[test][1]" type="text">

これらの入力フィールドは、次のコマンドで生成されます。

<?php echo $form->textField($model,'test[0]'); ?>
<?php echo $form->textField($model,'test[1]'); ?>

ここで、フォームを送信すると、POST リクエストに値が表示されます。ただし、フォームの送信が失敗すると、値を入力フィールドに戻すことができません。モデルを印刷すると、$test の値がないことがわかります。- これは $test がフォームの配列だからですか?

検証後でも、すべての値が変数に割り当てられます。

if($model->validate()) {
   echo "<pre>";
   print_r($_POST);
   return;
}

これは以下を返します:

[ModelName] => Array  
        (
            [test] => Array  
                (
                    [0] => myFirstInputField  
                    [1] => mySecondInputField
                )
        )

したがって、値は POST にありますが、検証に失敗した後、それらはなくなり、空の変数が取得されます。

[ModelName] => Array  
        (
            [test] => 
        )

変数testは、検証規則で安全であると宣言されています。

私が達成したいのは
、検証が失敗した場合、入力された値を適切な入力テキストフィールドに戻すことです。

正しい方向へのポインタは役に立ちます:)

4

2 に答える 2

0

問題は、CHtml::activeTextFieldがモデルとその属性の1つをパラメーターとして予期していることです。属性に名前が付けられている場合はtest$form->textField($model,'test');。フォームが送信された後、test値がないか配列であるか(これをチェックして、値をエコーするか、print_ronを実行して確認します$model->attributes)。

于 2012-06-13T05:29:15.613 に答える
0

この問題を解決するのに役立つ yiiframework.com Web サイトでこの記事を見つけました: http://www.yiiframework.com/doc/guide/1.1/en/form.table

これは、コントローラーに配置するサンプル コードです。

public function actionBatchUpdate()
{
    // retrieve items to be updated in a batch mode
    // assuming each item is of model class 'Item'
    $items=$this->getItemsToUpdate();
    if(isset($_POST['Item']))
    {
        $valid=true;
        foreach($items as $i=>$item)
        {
            if(isset($_POST['Item'][$i]))
                $item->attributes=$_POST['Item'][$i];
            $valid=$item->validate() && $valid;
        }
        if($valid)  // all items are valid
            // ...do something here
    }
    // displays the view to collect tabular input
    $this->render('batchUpdate',array('items'=>$items));
}

ビューは次のようになります。

<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo CHtml::submitButton('Save'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

どちらのコード スニペットも yiiframework.com から取得したもので、「Tabular Inputs」の使用方法の詳細を確認できます: http://www.yiiframework.com/doc/guide/1.1/en/form.table

于 2012-06-13T14:03:58.853 に答える