yii2
Validazione
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)
- Rimuovere
use yii\bootstrap\ActiveForm;
(se presente) - Aggiungi
use yii\widgets\ActiveForm;
- 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!");
}
}]
]