在Yii2中使用带有ActiveForm的自定义validation器

我想制作自定义validationfunction,如需要内置validation。 我这里有示例代码:

模型:

 use yii\base\Model; class TestForm extends Model { public $age; public function rules(){ return [ ['age', 'my_validation'] ]; } public function my_validation(){ //some code here } } 

视图:

 title = 'test'; ?> 
field($model, 'age')->label("age") ?>
'btn btn-primary']) ?>

控制器:

 use app\models\form\TestForm; use yii\web\Controller; class TestController extends Controller { public function actionIndex(){ $model = new TestForm(); if($model->load(\Yii::$app->request->post())){ return $this->render('test', array( 'model'=>$model, 'message'=>'success' )); } return $this->render('test', array('model'=>$model)); } } 

在这个例子中,我有一个年龄字段,这个my_validation函数应该在提交之前检查年龄是否超过18,如果年龄小于18则抛出错误。这个validation应该由ajax处理,如果你尝试提交空字段。

虽然您可以在场景中使用Conditional Validators whenwhenClient ,但我建议使用更复杂的方法来定义自定义validation器,因为根据文档

要创建支持客户端validation的validation器,您应该实现yii\validators\Validator::clientValidateAttribute()方法,该方法返回一段在客户端执行validation的JavaScript代码。 在JavaScript代码中,您可以使用以下预定义变量:

attribute:要validation的属性的名称。

value:要validation的值。

messages:用于保存属性的validation错误消息的数组。

deferred:可以推送延迟对象的数组(在下一小节中解释)。

因此,您需要做的是创建一个validation器并将其添加到您想要的字段的规则中。

如果您没有提供实际的型号名称并相应地更新字段名称,则需要小心复制以下代码。

1)首先要做的是将ActiveForm小部件更新为以下内容

 $form = ActiveForm::begin([ 'id' => 'my-form', 'enableClientValidation' => true, 'validateOnSubmit' => true, ]); 

2)将模型rules()函数更改为以下内容

 public function rules() { return [ [['age'], 'required'], [['age'], \app\components\AgeValidator::className(), 'skipOnEmpty' => false, 'skipOnError' => false], ]; } 

3)从你的模型中删除自定义validation函数my_validation()我希望你检查它的年龄限制为18+我们将把那个逻辑移到validation器中。

现在在components目录中创建一个文件AgeValidator.php ,如果你使用basic-app在项目根目录下添加文件夹components ,如果它不存在则创建一个新文件,并复制下面的代码。

我已经假设了上面提供的Model的名称,所以如果它不是实际名称,你需要在clientValidateAttribute函数中的javascript语句中更新字段名称,你在validation器中看到,因为ActiveForm字段的id属性以#modelname-fieldname (所有小的情况)的格式生成,所以根据上面给出的模型, #testform-age会相应地更新它,否则validation将不起作用。 如果您计划将其保存在其他位置,请在下面的validation器和模型rules()更新命名空间。

 message = 'You need to be above the required age 18+'; } public function validateAttribute($model, $attribute) { if ($model->$attribute < 18) { $model->addError($attribute, $this->message); } } public function clientValidateAttribute($model, $attribute, $view) { $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); return <<