Validation Yii2自定义验证器未按指南建议工作

Validation Yii2自定义验证器未按指南建议工作,validation,module,yii2,models,yii2-advanced-app,Validation,Module,Yii2,Models,Yii2 Advanced App,今天我在这里搜索了一段时间,但我无法理解为什么我的验证器在我的模型中不能工作 我有一个模块,在下面的代码中有一个模型“页面” 我有两个属性需要用来验证模型。他们是英雄链接和英雄链接。如果hero_link为真,我想要求hero_link 在指南中,他们解释了这种验证器的正确语法 我已经在我的模型中使用了这种语法,但它并没有像我预期的那样进行验证。我还添加了whenClient属性,因此可以在这里使用客户端验证 我的相关代码如下: // Page model namespace common\mo

今天我在这里搜索了一段时间,但我无法理解为什么我的验证器在我的模型中不能工作

我有一个模块,在下面的代码中有一个模型“页面”

我有两个属性需要用来验证模型。他们是英雄链接和英雄链接。如果hero_link为真,我想要求hero_link

在指南中,他们解释了这种验证器的正确语法

我已经在我的模型中使用了这种语法,但它并没有像我预期的那样进行验证。我还添加了whenClient属性,因此可以在这里使用客户端验证

我的相关代码如下:

// Page model
namespace common\modules\page\models;

use Yii;

class Page extends \yii\db\ActiveRecord
{
    public function rules()
    {
        return [
            [['hero_linked',], 'boolean'],
            [['hero_linked',], 'required'],
            [['hero_link',], 'string', 'max' => 255],
            [
                'hero_link', 
                'required', 
                'when' => function($model) {
                    return $model->hero_linked == true;
                },
                'whenClient' => "function (attribute, value) {
                    return $('#page-hero_linked').val() == '1';
                }",
            ],
        ];
    }
}

// _form view 
<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'hero_linked')->checkbox() ?>
    <?= $form->field($model, 'hero_link')->textInput(['maxlength' => 255]) ?>
<?php ActiveForm::end(); ?>
//页面模型
名称空间公共\模块\页面\模型;
使用Yii;
类页扩展\yii\db\ActiveRecord
{
公共职能规则()
{
返回[
[['英雄链接',],'布尔'],
[['hero_linked',],'required'],
[['hero_link',],'string','max'=>255],
[
“英雄链接”,
“必需”,
'when'=>函数($model){
返回$model->hero\u linked==true;
},
'whenClient'=>“函数(属性、值){
返回$('#page-hero_linked')。val()=='1';
}",
],
];
}
}
//_形式视图

正确应用了所需的验证器,但它似乎忽略了when属性,并且即使未选中“我的复选框”,也需要。我的语法是否不正确,或者我是否缺少一个要求?感谢您的帮助,提前谢谢

我发现了如何使这项工作成功。如果使用复选框,则不能仅使用服务器或客户端验证。我必须同时使用when和whenClient。我必须在视图中注册一个脚本,这样复选框上的checked属性就会更新

$('label > #page-hero_linked').click(function(event) {
    var checked = $(this).attr('checked');
    if (checked) {
        $(this).removeAttr('checked');
    }else{
        $(this).attr('checked', '');
    };
});
下面是我的验证规则

[['hero_link'],
'required',
'when' => function($model) {
    return $model->hero_linked == true;
},
'whenClient' => "function (attribute, value) {
    return $('#page-hero_linked').attr('checked');
}",],

总而言之,让它工作起来的代码非常简单,但我并不清楚文档中需要这么多

我想这就是你想要的。 首先在输入字段的whenClient中使用属性“checked”来获取复选框是否选中

复选框的隐藏字段不是问题

hero_linked(复选框)中的whenClient用于在更改复选框时验证hero_link(文本输入)字段。 因此,您可以立即看到是否需要hero_链接(textinput)

如果使用此规则,则表单中不需要任何额外的js代码

但正如您可能也看到的,由于完整的名称“page something”,这实际上只固定在“page”模型上,我猜这也取决于表单名称。因此,对于form.php中的两个字段,您应该使用一些其他固定的“id”,因此,如果您将页面模型扩展到另一个类,这也会起作用

[
    'hero_linked', 'required',
    'whenClient' => "function (attribute, value) {
        $('form').yiiActiveForm('validateAttribute', 'page-hero_link');
        return true;
    }",
],
[['hero_link',], 'string', 'max' => 255],
[
    'hero_link', 'required', 'when' => function ($model) {
        return $model->hero_linked == true;
    },
    'whenClient' => "function (attribute, value) {
        return $('#page-hero_linked').prop('checked');
    }",
],

语法似乎正确。也许问题是,链接的英雄也是必需的,所以实际上另一种情况永远不会发生。因为如果未选中“英雄链接”,则会出现错误。试想一下……如果这只是js的问题,你能尝试更新'whenClient'部分以返回
$(“#page-hero\u linked”).attr('checked')
?我发现,由于Yi2执行复选框的方式,你不能使用js使用checked属性获取复选框的值。该复选框有一个隐藏字段,我假设该字段在提交时更新,但不是实时更新。@Asped我认为这不是错误。required表示它需要一个值进行验证,如果未选中,复选框将返回0,如果按预期选中,复选框将返回1。隐藏字段存在,因此如果复选框未选中,则会为此属性提交一些内容。这是一个HTML“功能”。和