我在yii2视图中遇到了困难的形式,其中一些字段显示或隐藏。它根据用户字段选择决定,在表单中选择选项。我用自定义jquery文件编写这个前端逻辑。一切都好。但是当我提交表单时 - 隐藏的字段保持不进行验证,没有任何事情发生。如果字段是hiiden并且打开它,当字段可见时,我可以杀死所有的验证吗?
答案 0 :(得分:24)
$form->field($model, 'youAttribute', ['enableClientValidation' => false])->textInput();
ActiveField
类有一个属性enableClientValidation
,如果要在某些字段中禁用clientValidation,可以将此属性设置为false
。
答案 1 :(得分:17)
禁用客户端验证。像这样开始你的活动表格。
ActiveForm::begin(['enableClientValidation'=>false]);
答案 2 :(得分:10)
您可以使用以下代码设置有效字段:(完全不是active record
,activefield
)
$activeField = $form->field($model, 'someField');
$activeField->enableClientValidation=false;
$activeField ->enableAjaxValidation=false;
答案 3 :(得分:8)
您可以尝试为未设置的属性设置默认值:
[
// set "username" and "email" as null if they are empty
[['username', 'email'], 'default'],
// set "level" to be 1 if it is empty
['level', 'default', 'value' => 1],
]
在定义验证器时,您还可以使用条件客户端验证和"whenClient"
选项:
从手册:
如果您还需要支持客户端条件验证,那么 应该配置带有字符串的whenClient属性 表示返回值确定的JavaScript函数 是否适用规则。例如,
[ ['state', 'required', 'when' => function ($model) { return $model->country == 'USA'; }, 'whenClient' => "function (attribute, value) { return $('#country').val() == 'USA'; }"], ]
答案 4 :(得分:1)
从验证中删除字段:
$('#yourFormID').yiiActiveForm('remove', 'yourinputID');
将字段添加到验证列表:
$('#yourFormID').yiiActiveForm('add', {
id: 'country',
name: 'yourinputID',
container: '.field-inputID', //or your cllass container
input: '#yourinputID',
error: '.help-block', //or your class error
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: "Validation Message Here"});
}
});
并且不要忘记模型中的条件验证。 More info
答案 5 :(得分:0)
对于您的表单,使用whenClient:
['name', 'required', 'when' => {serverSide Condition),
'whenClient' => "ut_utils.isAttributeVisible",
],
['name', 'string', 'min' => 2, 'max' => 28],
['name', 'trim'],
在ut_utils(JS)中:
/**
* Useful for FE validation (whenClient) to validate only if visible (ie valid input)
*
* @param attribute Obj containing all sorts of info about attr including container name :-)
* @param value
*/
isAttributeVisible: function (attribute, value) {
return $(attribute.container).is(':visible');
},
您还需要添加“何时”来验证服务器端,您也可以在此处添加特定的逻辑,或者使用方案从验证中排除属性...