Ricerca…


Convalida un valore univoco dal database in Yii2

Poche persone hanno problemi con il messaggio di errore che non viene visualizzato se il valore esistente viene inserito nella casella di testo.

Quindi, ad esempio, non sto permettendo all'utente di inserire l' e-mail esistente .

signup.php

(Pagina in cui si desidera registrare un nuovo utente senza un ID e-mail esistente)

  1. Rimuovere use yii\bootstrap\ActiveForm; (se presente)
  2. Aggiungi use yii\widgets\ActiveForm;
  3. Aggiungi 'enableAjaxValidation' => true (In quel campo dove vuoi fermare l'utente per inserire l'e-mail esistente.)
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>

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

controllore

Aggiungi queste linee in cima 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())) {
      
    }
    
  }
?>

Modello

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

Convalida del valore univoco dal database: convalida univoca

Alcune persone hanno problemi con i messaggi di errore che non vengono visualizzati se viene inserito un valore esistente. Ad esempio, non autorizzo l'iscrizione di un utente con un'e-mail esistente.

vista

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

controllore

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

Modello

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

Disabilita messaggio di errore di convalida su Focus / Key Up

Per impostazione predefinita, il messaggio di errore viene visualizzato sotto la textbox di textbox in <div class="help-block"></div> su keyUp o dopo aver premuto il pulsante di invio se non vengono soddisfatti i vincoli di convalida.

A volte vogliamo un messaggio solo onKeyup ovvero nessuna convalida a evento onKeyup .

Controlliamo il file 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;
  
  .
  .
  .
  
}

Vediamo che $validateOnBlur è impostato su true per impostazione predefinita. Cambiare i file framework è una cosa molto brutta da fare, quindi è necessario sovrascriverli quando si utilizza il modulo:

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

Scenario in convalida

Utilizzando lo scenario è possibile eseguire la convalida in situazioni diverse

Definire lo scenario nella classe del modello

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

Usa scenario nel 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
}

Convalida matrice

Dalla versione 2.0.4 di Yii2 è presente EachValidator per convalidare ogni elemento in una matrice.

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

La parte ['integer'] può essere ogni altro oggetto validatore che Yii2 offre e può contenere gli argomenti specifici per il validatore. Tipo: ['integer', 'min' => 1337] . Se gli ID utente non contengono un array, la convalida della regola avrà esito negativo.

Se vuoi solo vedere se un attributo contiene un array senza convalidare il contenuto, puoi scrivere il tuo validatore.

[
    ['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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow