如果Yii中的模型验证失败,如何加载以前填充的字段?

时间:2011-05-29 17:57:07

标签: php validation yii

当用户点击“创建”并且模型验证失败时,我的网站会重定向到显示完全相同表单的同一页面。我一直在研究如何加载以前输入的值,以免让用户再次输入。使用firebug我可以观察帖子内容,这些似乎不包含这些信息。

在互联网上查看我看到有人建议使用Ajax提交表单并让它返回JSON数据,指明验证是否成功。但是,我对Yii和PHP完全不熟悉,所以我需要一些指导才能开始使用它。

还有另一种(更简单的)方法吗?如果没有,我怎么能有一个JSON返回指定验证是否成功?谢谢!

1 个答案:

答案 0 :(得分:2)

在我看来,您需要做的就是查看$ _POST变量以查看选择了哪个依赖下拉列表,并在表单验证失败时预呈现它,以便Yii的默认验证错误有效。以this link为例:

首先,将actionDynamiccities()方法的一部分重构为控制器中的单独公共(非动作)方法:

public function getCitiesList($country_id) {
    $data=Location::model()->findAll('parent_id=:parent_id', 
              array(':parent_id'=>(int) $country_id));
    return CHtml::listData($data,'id','name');
}

然后修复你重构的AJAX动作:

public function actionDynamiccities()
{
  $data = $this->getCitiesList($_POST['country_id']);
  foreach($data as $value=>$name)
  {
    echo CHtml::tag('option',
               array('value'=>$value),CHtml::encode($name),true);
  }
}

然后在你的_form.php视图文件中,在#city_id div中,第二个下拉列表将由第一个下载AJAX,添加一个像这样的小PHP片段:

<div id="city_id">
<?php if(isset($_POST['city_id'])): ?>
  <?php foreach($this->getCitiesList($_POST['country_id']) as $value=>$name): ?>
    <?php echo CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true); ?>
  <?php endforeach; ?>
<?php endif; ?>
</div>

这样,如果您已经提交了表单并且设置了$ _POST ['country_id'],则已经呈现了依赖下拉列表,它应该显示相应的验证错误。

如果用户选择其他国家/地区,则应按照正常情况更换城市下拉列表。

我没有测试这段代码,但它原则上应该有效。祝你好运!