yii2
Validación
Buscar..
Validar el valor único de la base de datos en Yii2
Pocas personas tienen problemas con el mensaje de error que no se muestra si el valor existente se ingresa en el cuadro de texto.
Entonces, por ejemplo, no estoy permitiendo que el usuario ingrese el correo electrónico existente .
signup.php
(Página en la que desea registrar un nuevo usuario sin la ID de correo electrónico existente)
- Eliminar
use yii\bootstrap\ActiveForm;
(si está presente) - Añadir
use yii\widgets\ActiveForm;
- Agregue
'enableAjaxValidation' => true
(en ese campo donde desea detener al usuario para ingresar la ID de correo electrónico existente).
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>
<?= $form->field($modelUser, 'email',['enableAjaxValidation' => true])
->textInput(['class'=>'form-control','placeholder'=>'Email']); ?>
Controlador
Agregue estas líneas en la parte superior 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())) {
}
}
?>
Modelo
[['email'],'unique','message'=>'Email already exist. Please try another one.'],
Validación del valor único de la base de datos: validación única
Algunas personas tienen problemas con respecto a los mensajes de error que no se muestran si se ingresa un valor existente. Por ejemplo, no estoy permitiendo que un usuario se registre con un correo electrónico existente.
Ver
<?php
......................
<?= $form->field($modelUser, 'email')->textInput(['class'=>'form-control','placeholder'=>'Email']) ?>
......................
Controlador
<?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,
]);
}
Modelo
public function rules()
{
return [
..............
['email', 'unique', 'message'=>'Email already exist. Please try another one.'],
...........
]
}
Deshabilitar el mensaje de error de validación en el enfoque / Key Up
Por defecto, aparece un mensaje de error debajo del textbox
de textbox
en <div class="help-block"></div>
en keyUp o después de presionar el botón de enviar si no se cumplen las restricciones de validación.
A veces queremos que solo se envíe un mensaje, es decir, que no haya validación en el evento onKeyup
.
Revisemos el 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;
.
.
.
}
Allí vemos que $validateOnBlur
se establece en true
de forma predeterminada. Cambiar los archivos del marco es algo muy malo, por lo que debemos anularlo al utilizar el formulario:
<?php $form = ActiveForm::begin([ 'id' => 'register-form','validateOnBlur' => false]); ?>
Escenario en Validación
Usando el escenario puede realizar validación en diferentes situaciones
Definir el escenario en la clase modelo.
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']],
];
}
}
Usar escenario en el controlador
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
}
Validar matriz
Desde la versión 2.0.4 de Yii2, se utiliza EachValidator para validar cada elemento de una matriz.
[
// ... other rules
['userIDs', 'each', 'rule' => ['integer']],
]
La parte ['integer']
puede ser cualquier otro objeto validador que ofrece Yii2 y puede contener los argumentos específicos para el validador. Me gusta: ['integer', 'min' => 1337]
. Si los ID de usuario no contienen una matriz, la validación de la regla fallará.
Si solo desea ver si un atributo contiene una matriz sin validar el contenido, puede escribir su propio validador.
[
['myAttr', function($attribute, $params) {
if (!is_array($this->$attribute)) {
$this->addError($attribute, "$attribute isn't an array!");
}
}]
]