Zoeken…


Valideer unieke waarde uit database in Yii2

Weinig mensen hebben problemen met het foutbericht dat niet wordt weergegeven als de bestaande waarde in het tekstvak wordt ingevoerd.

Dus bijvoorbeeld, ik sta de gebruiker niet toe bestaande e-mail in te voeren.

signup.php

(Pagina waar u een nieuwe gebruiker wilde aanmelden zonder bestaande e-mail-id)

  1. use yii\bootstrap\ActiveForm; (indien aanwezig)
  2. use yii\widgets\ActiveForm; toevoegen use yii\widgets\ActiveForm;
  3. Voeg 'enableAjaxValidation' => true (in dat veld Waar u de gebruiker wilt stoppen voor het invoeren van een bestaand e-mailadres).
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>

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

controleur

Voeg deze regels bovenaan toe 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.'],

Unieke waarde uit database valideren: unieke validatie

Sommige mensen hebben problemen met foutmeldingen die niet worden weergegeven als een bestaande waarde wordt ingevoerd. Ik sta bijvoorbeeld niet toe dat een gebruiker zich aanmeldt met een bestaande e-mail.

Visie

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

controleur

<?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.'],
        ...........
    ]
}

Validatiefoutmelding uitschakelen bij focus / toets omhoog

Standaard verschijnt een foutmelding onder het textbox in <div class="help-block"></div> op keyUp of nadat op de verzendknop is gedrukt als niet aan de validatiebeperkingen is voldaan.

Soms willen we alleen een bericht over verzenden, dwz geen validatie bij onKeyup evenement.

Laten we het bestand 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;
  
  .
  .
  .
  
}

Daar zien we dat $validateOnBlur is ingesteld op true . Het wijzigen van framework-bestanden is een zeer slechte zaak, dus moeten we het overschrijven wanneer we het formulier gebruiken:

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

Scenario in validatie

Met behulp van scenario's kunt u validatie uitvoeren op verschillende situaties

Definieer scenario in modelklasse

    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']],
    ];
  }
}

Gebruik Scenario in Controller

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
}

Matrix valideren

Sinds Yii2 versie 2.0.4 wordt de EachValidator gebruikt om elk item in een array te valideren.

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

Het gedeelte ['integer'] kan elk ander validatorobject zijn dat Yii2 aanbiedt en kan de specifieke argumenten voor de validator bevatten. Zoals: ['integer', 'min' => 1337] . Als de userID's geen array bevatten, mislukt de validatie van de regel.

Als je gewoon wilt zien of een attribuut een array bevat zonder de inhoud te valideren, kun je je eigen validator schrijven.

[
    ['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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow