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


How to load the previously filled fields when model validation in Yii fails?

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

在互联网上,我看到有人建议使用Ajax提交表单,并让它返回指定验证是否成功的JSON数据。然而,我对Yii和PHP都很陌生,所以我需要一些指导才能开始使用。

还有其他(更简单的)方法吗?如果没有,我怎么能有一个JSON返回来指定验证是否成功?非常感谢。

在我看来,你需要做的是查看$_POST变量,看看选择了哪个依赖下拉列表,并在表单验证失败时预呈现它,这样Yii的默认验证错误就可以工作了。以这个链接为例:

首先,将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_iddiv中,第二个下拉列表将由第一个下拉列表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'],则依赖下拉列表已经呈现,并且应该显示相应的验证错误。

如果用户选择了不同的国家/地区,则城市下拉列表应该像正常情况一样被替换。

我没有测试这个代码,但原则上它应该可以工作。祝你好运