我解决这个问题的方法是创建场景并在客户端动态更新它们,而无需通过 AJAX 再次加载整个表单。
在 model.php 中创建如下场景:-
...
public function rules(){
return array(
...
array('license_plate', 'required', 'on'=>'car'),
array('some_column', 'some_validation', 'on'=>'bike')
...
);
}
...
现在您询问是否可以根据用户选择的输入更改验证。假设用户必须从选择(汽车或自行车)中进行选择,汽车的值为 1,自行车的值为 2。像这样更新控制器的创建操作:-
public function actionCreate(){
$model = new Vehicle();
if(isset($_POST['ajax']) && $_POST['ajax'] == 'FORM_ID'){
if($_POST['Vehicle']['type'] == 1)
$model->setScenario('car');
else
$model->setScenario('bike');
//You can have n-number of scenarios here based upon your application.
}
$this->performAjaxValidation($model);
if(isset($_POST['Vehicle']))
$model->attributes = $_POST['Vehicle'];
if($model->type == 1)
$model->setScenario('car');
else
$model->setScenario('bike');
//You can have n-number of scenarios here based upon your application.
}
现在,在执行此操作时,我遇到了错误消息不会消失的问题,即使场景改变了。我用这样的Javascript解决了这个问题:-
(在你的视图文件中包含这个脚本)
$(document).on('change', '#DROPDOWN_ID', function(e){
$(':input','#FORM_ID')
.not('#DROPDOWN_ID')
.val('')
.removeAttr('checked')
.removeAttr('selected');
$('.help-block, .error').hide(); //NOTE 1.0
var settings = $('#FORM_ID').data('settings');
$.each(settings.attributes, function () {
this.status = 2;
});
var form = $("#FORM_ID");
form.data('settings', settings);
$.fn.yiiactiveform.validate(form, function (data) {
$.each(settings.attributes, function () {
$.fn.yiiactiveform.updateInput(this, data, $("#FORM_ID"));
});
});
});
请将“FORM_ID”和“DROPDOWN_ID”分别替换为表单的 ID 和表单中验证选择所依赖的下拉列表的 ID。
注1.0说明:
我正在使用 YiiBooster,所以我的所有表单都在 Bootstrap 中。验证
我的表单中的错误有“帮助阻止错误”类,请替换它
使用表单中用于显示错误的类,
正确隐藏它们。
参考资料:
- Validating other fields on change of one field - Yii
- Changing scenarios on client side without loading the form again
我希望这能解决这个问题。