Sök…


Validera unikt värde från databasen i Yii2

Få människor har problem angående felmeddelandet som inte visas om befintligt värde anges i textrutan.

Så till exempel tillåter jag inte användare att ange befintlig e-post .

signup.php

(Sidan där du ville registrera en ny användare utan befintligt e-post-id)

  1. Ta bort use yii\bootstrap\ActiveForm; (om närvarande)
  2. Lägg till use yii\widgets\ActiveForm;
  3. Lägg till 'enableAjaxValidation' => true (I det fältet där du vill stoppa användaren för att ange befintligt e-post-id.)
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>

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

Kontrollant

Lägg till dessa rader på toppen 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())) {
      
    }
    
  }
?>

Modell

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

Validera unikt värde från databasen: Unik validering

Vissa människor har problem angående felmeddelanden som inte visas om ett befintligt värde anges. Till exempel tillåter jag inte en användarregistrering med ett befintligt e-postmeddelande.

Se

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

Kontrollant

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

Modell

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

Inaktivera valideringsfelmeddelande vid fokus / nyckel

Som standard visas ett felmeddelande under textbox i <div class="help-block"></div>keyUp eller efter att du har tryckt på skicka-knappen om några valideringsbegränsningar inte uppfylls.

Ibland vill vi bara ha ett meddelande på skicka, dvs ingen validering vid onKeyup händelse.

Låt oss kolla yii2/widgets/ActiveForm.php filen:

<?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;
  
  .
  .
  .
  
}

Där ser vi att $validateOnBlur är inställd på true standard. Att ändra ramfiler är mycket dåligt att göra så vi måste åsidosätta det när vi använder formuläret:

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

Scenario i validering

Med hjälp av scenario kan du utföra validering på olika situationer

Definiera scenario i modellklass

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

Använd Scenario i 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
}

Validera matris

Sedan Yii2 version 2.0.4 finns det EveryValidator som används för att validera varje objekt i en matris.

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

['integer'] -delen kan vara alla andra validatorobjekt som Yii2 erbjuder och kan innehålla de specifika argumenten för validatorn. Gilla: ['integer', 'min' => 1337] . Om användar-ID: erna inte innehåller en matris kommer valideringen av regel att misslyckas.

Om du bara vill se om ett attribut innehåller en matris utan att validera innehållet kan du skriva din egen validator.

[
    ['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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow