当用户点击“创建”并且模型验证失败时,我的网站会重定向到显示完全相同表单的同一页面。我一直在研究如何加载以前输入的值,以免让用户再次输入。使用firebug我可以观察帖子内容,这些似乎不包含这些信息。
在互联网上查看我看到有人建议使用Ajax提交表单并让它返回JSON数据,指明验证是否成功。但是,我对Yii和PHP完全不熟悉,所以我需要一些指导才能开始使用它。
还有另一种(更简单的)方法吗?如果没有,我怎么能有一个JSON返回指定验证是否成功?谢谢!
答案 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'],则已经呈现了依赖下拉列表,它应该显示相应的验证错误。
如果用户选择其他国家/地区,则应按照正常情况更换城市下拉列表。
我没有测试这段代码,但它原则上应该有效。祝你好运!