yii2
Проверка
Поиск…
Проверка уникального значения из базы данных в Yii2
Мало кто знает, что сообщение об ошибке не отображается, если существующее значение вводится в текстовое поле.
Итак, для примера я не разрешаю пользователю вводить существующий адрес электронной почты .
signup.php
(Страница, где вы хотите зарегистрировать нового пользователя без существующего идентификатора электронной почты)
- Удалите
use yii\bootstrap\ActiveForm;
(если представить) - Добавьте
use yii\widgets\ActiveForm;
- Добавьте
'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!");
}
}]
]