yii2使用Model无刷新验证rule自定义方法

先配置rule

/** 
 * @inheritdoc */ 
 public function rules() { 
    return [ 
        [["B"], "requiredByASpecial", 'skipOnEmpty' => false, 'skipOnError' => false], 
    ]; 
}

在model里面写方法;

/**
 *  自定义验证B
 */
public function requiredByASpecial($attribute, $params)
{
    if ($this->A== 1) 
    {
        if ($this->$attribute=== "")
            $this->addError($attribute, "B的值不可以为空.");
    }
}

自定义的验证方法不支持客户端校验,也就是说鼠标失去焦点后不会自动校验,只有在表单提交后才会校验。所以下面就是解决这个问题的方法。
在form表单开头配置如下

<?php $form = ActiveForm::begin([
        'id' => 'form-id',
        'enableAjaxValidation' => true,//是否开启ajax修改,这里的validationUrl需要自己定义,否则会在失去焦点的时候就更改当前的值了!
        'validationUrl' => Url::toRoute(['validate-form']),
    ]
); ?>

控制器定义方法:

public function actionValidateForm () {
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $model = new Model();   //这里要替换成自己的模型类
    $model->load(Yii::$app->request->post());  
    return \yii\widgets\ActiveForm::validate($model);  
}

如此就实现了无刷新验证了。


有小伙伴遇到要验证的字段是unique类型,更新操作的时候,这可傻了眼了,怎么都处理不好了,我们下面给出一个针对字段unique规则更新操作的解决方案,但是同样兼容上面的案例说明。用下面的可能会好一点,万一你的字段也是unique的呢!

首先我们把ActiveForm的begin配置修改如下:

$validationUrl = ['validate-form'];
if (!$model->isNewRecord) {
    $validationUrl['id'] = $model->id;
}


$form = ActiveForm::begin([
    'id' => 'document-nav-form',
    'enableAjaxValidation' => true,
    'validationUrl' => $validationUrl,
]);

上面代码的意思很简单,如果是更新操作,请求验证的路由中把id也带过去,接着我们对validate-form方法也作相应的修改即可

public function actionValidateForm ($id = null) {

    $model = $id === null ? new DocumentNav() : DocumentNav::findOne($id);
    $model->load(Yii::$app->request->post());  

    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return \yii\widgets\ActiveForm::validate($model);  
}

原文地址:http://www.manks.top/yii2_custom_rules.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值