yii2
Validation
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)
- Supprimez
use yii\bootstrap\ActiveForm;(si présent) - Ajoutez
use yii\widgets\ActiveForm; - 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!");
}
}]
]