yii2
Uprawomocnienie
Szukaj…
Sprawdź poprawność unikalnej wartości z bazy danych w Yii2
Niewiele osób ma problem z wyświetlaniem komunikatu o błędzie, jeśli w polu tekstowym wprowadzana jest istniejąca wartość.
Na przykład nie zezwalam użytkownikowi na wprowadzanie istniejącego adresu e-mail .
signup.php
(Strona, na której chcesz zarejestrować nowego użytkownika bez istniejącego identyfikatora e-mail)
- Usuń
use yii\bootstrap\ActiveForm;
(Jeśli obecny) - Dodaj
use yii\widgets\ActiveForm;
- Dodaj
'enableAjaxValidation' => true
(w tym polu, w którym chcesz zatrzymać użytkownika w celu wprowadzenia istniejącego identyfikatora e-mail.)
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>
<?= $form->field($modelUser, 'email',['enableAjaxValidation' => true])
->textInput(['class'=>'form-control','placeholder'=>'Email']); ?>
Kontroler
Dodaj te wiersze na górze 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())) {
}
}
?>
Model
[['email'],'unique','message'=>'Email already exist. Please try another one.'],
Sprawdzanie poprawności unikalnej wartości z bazy danych: unikalne sprawdzanie poprawności
Niektóre osoby mają problemy z wyświetlaniem komunikatów o błędach, jeśli wprowadzana jest istniejąca wartość. Na przykład nie zezwalam na rejestrację użytkownika przy użyciu istniejącego adresu e-mail.
Widok
<?php
......................
<?= $form->field($modelUser, 'email')->textInput(['class'=>'form-control','placeholder'=>'Email']) ?>
......................
Kontroler
<?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,
]);
}
Model
public function rules()
{
return [
..............
['email', 'unique', 'message'=>'Email already exist. Please try another one.'],
...........
]
}
Wyłącz komunikat o błędzie sprawdzania poprawności po ustawieniu ostrości / kluczowaniu
Domyślnie komunikat o błędzie pojawia się poniżej textbox
w <div class="help-block"></div>
na keyUp lub po naciśnięciu przycisku Prześlij, jeśli jakiekolwiek ograniczenia sprawdzania poprawności nie są spełnione.
Czasami potrzebujemy wiadomości tylko po przesłaniu, tj. Bez sprawdzania poprawności podczas zdarzenia onKeyup
.
Sprawdźmy 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;
.
.
.
}
Widzimy, że $validateOnBlur
jest domyślnie ustawione na true
. Zmiana plików frameworków jest bardzo zła, dlatego musimy je przesłonić podczas korzystania z formularza:
<?php $form = ActiveForm::begin([ 'id' => 'register-form','validateOnBlur' => false]); ?>
Scenariusz walidacji
Za pomocą scenariusza można przeprowadzić weryfikację w innej sytuacji
Zdefiniuj scenariusz w klasie modelu
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']],
];
}
}
Użyj scenariusza w kontrolerze
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
}
Sprawdź poprawność tablicy
Od wersji Yii2 2.0.4 EachValidator służy do sprawdzania poprawności każdego elementu w tablicy.
[
// ... other rules
['userIDs', 'each', 'rule' => ['integer']],
]
Część ['integer']
może być każdym innym obiektem walidatora oferowanym przez Yii2 i może przechowywać określone argumenty walidatora. Jak: ['integer', 'min' => 1337]
. Jeśli ID użytkownika nie zawiera tablicy, sprawdzanie poprawności reguły zakończy się niepowodzeniem.
Jeśli chcesz tylko sprawdzić, czy atrybut zawiera tablicę bez sprawdzania poprawności zawartości, możesz napisać własny walidator.
[
['myAttr', function($attribute, $params) {
if (!is_array($this->$attribute)) {
$this->addError($attribute, "$attribute isn't an array!");
}
}]
]