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)

  1. Usuń use yii\bootstrap\ActiveForm; (Jeśli obecny)
  2. Dodaj use yii\widgets\ActiveForm;
  3. 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!");
        }
    }]
]


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow