我想ajax验证我的表单,我跟着this正常工作,但是在第一列的值上,我想让用户填写其他列,
如果选择的值是汽车,我希望用户也填写车牌号,但如果用户选择了自行车,我就不需要该车牌号。
在模型中验证函数之前我已经实现了我的逻辑,但问题是在前端,如果以前不需要字段,但现在需要,表单不会显示这个。
它不会被提交,但表单字段不会变红,并且错误消息不会显示。
我该如何实现这个
更新
我还在模型规则中添加了新的必填字段,并使用$('#my-form').trigger('reset');
重置表单,但那些新需要的字段不会
有红色星号表示它们是必需的。
自从我开始赏金之后,有没有办法在每个领域都有焦点之前显示所有信息?
答案 0 :(得分:1)
我有一个想法......你必须创建场景......但是你应该有一些你想要验证的固定数量...就像你说你有复选框汽车或自行车(或收音机或下拉列表)一样选择你可以通过ajax再次加载你的表格在那个动作你可以设置你的场景,如果选择了汽车将设置为汽车,如果选择了自行车则设置为自行车...并使用所选选项再次加载表格。使用那个特定场景,你可以动态验证...我认为这是唯一的方法......
答案 1 :(得分:1)
我解决这个问题的方法是创建方案并在客户端动态更新它们,而无需通过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中。验证 我的表单中的错误有类'help-block error',请替换它 使用表单中用于显示错误的类来 正确隐藏它们。
参考文献:
答案 2 :(得分:0)
如果我理解正确,您需要custom validation rules而不是标准的必需规则。
答案 3 :(得分:0)
当用户从下拉列表中选择自行车/汽车时,例如您将表单发布到控制器,在那里设置一个新场景,并为新创建的输入部分呈现特定字段并将它们插入到dom中。这是另一个问题,它们没有经过验证的客户端,因为它们不是当前呈现的activeform的一部分。为了实现这一点,请看看我的帖子: Dynamic added form fields based on 1-to-n relation - What framework alternatives?
答案 4 :(得分:0)
使用原始javascript比yii自定义验证更容易实现您的逻辑。
您可以使用ajax下拉列表将ajax回调绑定到该下拉列表。通过更改其值,将调用所需的操作,其中将在那里验证域逻辑,并返回结果(如true / false),您可以在其中决定要向用户显示哪个字段。
您还可以将required
类附加到ajax回调后所需的字段。