Yii框架:表单验证失败后的空变量

时间:2012-06-12 21:00:16

标签: php yii

我有一个包含两个输入文本字段的表单:

<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 被声明为 safe

我想要达到的目标是:
如果验证失败,则将输入的值放回相应的输入文本字段中。

任何正确方向的指针都会有所帮助:)

2 个答案:

答案 0 :(得分:0)

问题是,CHtml::activeTextField期望模型及其中一个属性作为参数。如果属性名为test,则为$form->textField($model,'test');。提交表单后,test没有任何值,或者它是一个数组(选中此项以确认,或者回显它的值或在print_r上执行$model->attributes。 / p>

答案 1 :(得分:0)

我在yiiframework.com网站上发现了这篇文章,帮助我解决了这个问题: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,您可以在其中找到有关如何使用“表格输入”的更多详细信息:http://www.yiiframework.com/doc/guide/1.1/en/form.table