Поиск…


Проверка уникального значения из базы данных в Yii2

Мало кто знает, что сообщение об ошибке не отображается, если существующее значение вводится в текстовое поле.

Итак, для примера я не разрешаю пользователю вводить существующий адрес электронной почты .

signup.php

(Страница, где вы хотите зарегистрировать нового пользователя без существующего идентификатора электронной почты)

  1. Удалите use yii\bootstrap\ActiveForm; (если представить)
  2. Добавьте use yii\widgets\ActiveForm;
  3. Добавьте 'enableAjaxValidation' => true (В этом поле, где вы хотите, чтобы пользователь не вводил существующий идентификатор электронной почты.)
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>

<?= $form->field($modelUser, 'email',['enableAjaxValidation' => true])
    ->textInput(['class'=>'form-control','placeholder'=>'Email']); ?>

контроллер

Добавьте эти строки сверху use yii\web\Response;use yii\widgets\ActiveForm;

<?php
use yii\web\Response;
use yii\widgets\ActiveForm;

  .
  .// Your code
  .

  public function actionSignup() {
    
    $modelUser = new User();

    //Add This For Ajax Email Exist Validation 
    if(Yii::$app->request->isAjax && $modelUser->load(Yii::$app->request->post())){
      Yii::$app->response->format = Response::FORMAT_JSON;
      return ActiveForm::validate($modelUser);
    } 
    else if ($model->load(Yii::$app->request->post())) {
      
    }
    
  }
?>

модель

[['email'],'unique','message'=>'Email already exist. Please try another one.'],

Проверка уникальной ценности из базы данных: уникальная проверка

У некоторых людей возникают проблемы с отображением сообщений об ошибках, если вводится существующее значение. Например, я не разрешаю пользователям регистрироваться с существующим электронным письмом.

Посмотреть

<?php
......................    
    
    <?= $form->field($modelUser, 'email')->textInput(['class'=>'form-control','placeholder'=>'Email']) ?>
......................    

контроллер

<?php
use yii\web\Response; // important lines
use yii\widgets\ActiveForm; // important lines
        
.
.// Your code
.
        
public function actionSignup() 
{
            
    $modelUser = new User();
        
    //Add This For Ajax Validation 
    if(Yii::$app->request->isAjax && $modelUser->load(Yii::$app->request->post())){
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($modelUser);
    } 
    if ($modelUser->load(Yii::$app->request->post()) && $modelUser->save()) {
        return $this->redirect(['someplace nice']);
    }
    return $this->render('update', [
        'modelUser' => $modelUser,
    ]);            
}

модель

public function rules()
{
    return [
        ..............
        ['email', 'unique', 'message'=>'Email already exist. Please try another one.'],
        ...........
    ]
}

Отключить сообщение об ошибке проверки по фокусу / клавише вверх

По умолчанию появится следующее сообщение об ошибке textbox в <div class="help-block"></div> на KeyUp или после нажатия кнопки отправки , если какое - либо ограничение проверки не выполняется.

Иногда мы хотим, чтобы сообщение было onKeyup . onKeyup Не было подтверждения на событие onKeyup .

Давайте проверим yii2/widgets/ActiveForm.php :

<?php

namespace yii\widgets;

use Yii;
use yii\base\InvalidCallException;
use yii\base\Widget;
use yii\base\Model;
use yii\helpers\ArrayHelper;
use yii\helpers\Url;
use yii\helpers\Html;
use yii\helpers\Json;

class ActiveForm extends Widget
{
  public $action = '';
  public $method = 'post';
  public $options = [];
  .
  .
  .
  public $validateOnSubmit = true;
  public $validateOnChange = true;
  public $validateOnBlur = true;
  public $validateOnType = false;
  
  .
  .
  .
  
}

Там мы видим, что для $validateOnBlur по умолчанию установлено значение true . Изменение файлов фреймов очень плохо, поэтому мы должны переопределить его при использовании формы:

<?php $form = ActiveForm::begin([ 'id' => 'register-form','validateOnBlur' => false]); ?>

Сценарий проверки

С помощью сценария вы можете выполнять валидацию в разных ситуациях

Определение сценария в классе модели

    class User extends \yii\db\ActiveRecord 
    {
      public static function tableName()
      {
          return 'user_master';
      }

    // define validation in rule() function
  public function rules()
  {
    return [
      [['email_id'],'email'],
      [['first_name',],'required','on'=>['create','update']],  // create scenario
      [['email_id',],'required','on'=> ['admin','create','update','forgotpassword']],
      [['mobile',],'required','on'=>['admin','create','update']],
    ];
  }
}

Использовать сценарий в контроллере

public function actionCreate()
{
  $model = new User();
  $model->scenario="create";  // use create scenario, create scenario validaion applied in this model
            
  
}
public function actionUpdate()
{
    $model = new User();
    $model->scenario="update";  // use update scenario, update scenario validaion applied in this model
}

Проверить массив

Начиная с версии Yii2 версии 2.0.4, для каждого элемента массива используется параметр EveryValidator.

[
    // ... other rules
    ['userIDs', 'each', 'rule' => ['integer']],
]

Часть ['integer'] может быть любым другим объектом валидатора, который предлагает Yii2, и может содержать конкретные аргументы для валидатора. Например: ['integer', 'min' => 1337] . Если идентификаторы пользователя не содержат массив, проверка правильности не будет выполнена.

Если вы просто хотите узнать, содержит ли атрибут массив без проверки содержимого, вы можете написать собственный валидатор.

[
    ['myAttr', function($attribute, $params) {
        if (!is_array($this->$attribute)) {
            $this->addError($attribute, "$attribute isn't an array!");
        }
    }]
]


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow