Recherche…


Valider la valeur unique de la base de données en Yii2

Peu de personnes ont un problème concernant le message d'erreur ne s'affiche pas si la valeur existante est entrée dans la zone de texte.

Donc, par exemple, je n'autorise pas l' utilisateur à entrer le courrier électronique existant .

signup.php

(Page où vous vouliez vous inscrire un nouvel utilisateur sans identifiant de messagerie existant)

  1. Supprimez use yii\bootstrap\ActiveForm; (si présent)
  2. Ajoutez use yii\widgets\ActiveForm;
  3. Ajoutez 'enableAjaxValidation' => true (Dans ce champ Où vous voulez arrêter l'utilisateur pour entrer l'identifiant de messagerie existant.)
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>

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

Manette

Ajoutez ces lignes en haut à 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())) {
      
    }
    
  }
?>

Modèle

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

Validation de la valeur unique de la base de données: validation unique

Certaines personnes ont des problèmes concernant les messages d'erreur qui ne sont pas affichés si une valeur existante est entrée. Par exemple, je ne permet pas à un utilisateur de s'inscrire avec un courrier électronique existant.

Vue

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

Manette

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

Modèle

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

Désactiver le message d'erreur de validation sur focus / key up

Par défaut, un message d'erreur apparaît sous la textbox de textbox dans <div class="help-block"></div> sur keyUp ou après avoir appuyé sur le bouton de soumission si des contraintes de validation ne sont pas remplies.

Parfois, nous voulons un message uniquement sur soumission, c'est-à-dire pas de validation à l'événement onKeyup .

Vérifions le 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;
  
  .
  .
  .
  
}

Nous voyons que $validateOnBlur est défini sur true par défaut. La modification des fichiers-cadres est une très mauvaise chose à faire, nous devons donc la remplacer lorsque vous utilisez le formulaire:

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

Scénario en validation

En utilisant un scénario, vous pouvez effectuer une validation sur différentes situations

Définir un scénario dans la classe de modèle

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

Utiliser le scénario dans le contrôleur

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
}

Valider le tableau

Depuis Yii2 version 2.0.4, il y a le EachValidator utilisé pour valider chaque élément d'un tableau.

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

La partie ['integer'] peut être tout autre objet validateur proposé par Yii2 et peut contenir les arguments spécifiques du validateur. Comme: ['integer', 'min' => 1337] . Si l'ID utilisateur ne contient pas de tableau, la validation de la règle échouera.

Si vous voulez juste voir si un attribut contient un tableau sans valider le contenu, vous pouvez écrire votre propre validateur.

[
    ['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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow