Yii2自定义验证程序无法作为指南工作建议

时间:2015-04-27 05:54:44

标签: validation module yii2 models yii2-advanced-app

今天我在这里搜索了一段时间,但是我无法理解为什么我的验证员在我的模型中没有工作。

我有一个带模型的模块" Page"在我的下面的代码中。

我需要使用2个属性来验证模型。他们是hero_link和hero_linked。如果hero_linked为true,我想要求hero_link。

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

我在我的模型中使用了这种语法,但它并没有像我期望的那样验证。我也添加了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(); ?>

正确应用了所需的验证器,但它似乎忽略了when属性,并且即使取消选中我的复选框也需要。我的语法不正确,还是我错过了一项要求?任何帮助表示赞赏,提前致谢!

2 个答案:

答案 0 :(得分:1)

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

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

hero_linked(复选框)中的whenClient用于在更改复选框时验证hero_link(textinput)字段。 因此,您可以立即查看是否需要hero_link(textinput)。

如果您使用此规则,则表单中不需要任何其他js代码。

但是你可能也会看到,由于完整的名称“page-something”,这实际上仅固定在“页面”模型上,我猜也取决于表单名称。所以你应该在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');
    }",
],

答案 1 :(得分:0)

我发现了如何使这项工作。如果使用复选框,则不能仅使用服务器或客户端验证。我必须同时使用whenClient和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');
}",],

总而言之,这个非常简单的代码可以让它发挥作用,但对我来说并不是很明显,文档需要这么多。