yii2
検証
サーチ…
Yii2のデータベースから一意の値を検証する
既存の値がテキストボックスに入力されている場合、エラーメッセージが表示されないという問題はほとんどありません。
したがって、例として、ユーザーに既存の電子メールを入力させることはできません 。
signup.php
(あなたが既存の電子メールIDなしで新しいユーザーにサインアップしたいページ)
-
use yii\bootstrap\ActiveForm;
削除しuse yii\bootstrap\ActiveForm;
(存在する場合) -
use yii\widgets\ActiveForm;
を追加してくださいuse yii\widgets\ActiveForm;
-
'enableAjaxValidation' => true
を追加し'enableAjaxValidation' => true
(このフィールドには、既存のメールIDを入力するユーザーを停止します)。
<?php
use yii\bootstrap\ActiveForm;
use yii\widgets\ActiveForm;
?>
<?= $form->field($modelUser, 'email',['enableAjaxValidation' => true])
->textInput(['class'=>'form-control','placeholder'=>'Email']); ?>
コントローラ
これらの行を上に追加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())) {
}
}
?>
モデル
[['email'],'unique','message'=>'Email already exist. Please try another one.'],
データベースからの一意の値の検証:一意の検証
既存の値が入力されている場合に表示されないエラーメッセージに関する問題があります。たとえば、私は既存の電子メールでユーザーサインアップを許可していません。
ビュー
<?php
......................
<?= $form->field($modelUser, 'email')->textInput(['class'=>'form-control','placeholder'=>'Email']) ?>
......................
コントローラ
<?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,
]);
}
モデル
public function rules()
{
return [
..............
['email', 'unique', 'message'=>'Email already exist. Please try another one.'],
...........
]
}
フォーカス/キーアップで検証エラーメッセージを無効にする
デフォルトでは、 keyUp上の<div class="help-block"></div>
textbox
、または検証制約が満たされていない場合はsubmitボタンを押した後にエラーメッセージが表示されます。
場合によっては、送信時にのみメッセージが必要な場合があります。つまり、 onKeyup
イベントでは検証は行われません。
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;
.
.
.
}
$validateOnBlur
はデフォルトでtrue
設定されています。フレームワークファイルを変更することは非常に悪いことです。そのため、フォームを使用する際には、フレームワークを上書きする必要があります。
<?php $form = ActiveForm::begin([ 'id' => 'register-form','validateOnBlur' => false]); ?>
検証のシナリオ
シナリオを使用すると、異なる状況で検証を実行できます
モデルクラスでシナリオを定義する
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']],
];
}
}
コントローラでシナリオを使用する
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
}
配列の検証
Yii2バージョン2.0.4以来、配列の各項目を検証するために使用されるEachValidatorがあります。
[
// ... other rules
['userIDs', 'each', 'rule' => ['integer']],
]
['integer']
部分は、Yii2が提供する他のすべてのバリデータオブジェクトであり、バリデータの特定の引数を保持できます。同様: ['integer', 'min' => 1337]
。ユーザーIDに配列が含まれていない場合、ルールの検証は失敗します。
内容の検証を行わずに属性に配列が含まれているかどうかだけを確認したい場合は、独自のバリデータを記述することができます。
[
['myAttr', function($attribute, $params) {
if (!is_array($this->$attribute)) {
$this->addError($attribute, "$attribute isn't an array!");
}
}]
]