使用 DynamicFormWidget 验证唯一的电子邮件 - Yii2 [英] Validating unique email using DynamicFormWidget - Yii2

查看:22
本文介绍了使用 DynamicFormWidget 验证唯一的电子邮件 - Yii2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将 DynamicFormWidget 用于多个输入字段,例如:first_namelast_nameemail &mobile_no.而且,我不希望用户输入现有的 email.意味着,email 应该是唯一的.当我不使用 DynamicFormWidget 时它正在工作.实际上,我不知道如何使用 Yii2 在多个输入表单中验证唯一的电子邮件.

I am using DynamicFormWidget for multiple input fields like: first_name, last_name, email & mobile_no. And, I don't want user to type the existing email. Means, email should be unique. It is working when I am not using DynamicFormWidget. Actually, I don't know how to validate unique email in multiple input forms using Yii2.

addmembers.php(查看)

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use wbraganca\dynamicform\DynamicFormWidget;
?>

<?php DynamicFormWidget::begin([
'widgetContainer' => 'dynamicform_wrapper',
'widgetBody' => '.container-items',
'widgetItem' => '.house-item',
'limit' => 10,
'min' => 1,
'insertButton' => '.add-house',
'deleteButton' => '.remove-house',
'model' => $modelsTeamMembers[0],
'formId' => 'dynamic-form',
'formFields' => ['description',],
]); ?>

<table class="table table-bordered table-striped">
<thead>
  <tr>
    <th>First Name</th>
    <th>Last Name</th>
    <th>Email</th>
    <th>Mobile Number</th>
  </tr>
</thead>
<tbody class="container-items">
<?php foreach ($modelsTeamMembers as $indexMember => $modelTeamMembers): ?>
    <tr class="house-item">
      <td class="vcenter">
        <?php
        if (! $modelTeamMembers->isNewRecord) {
          echo Html::activeHiddenInput($modelTeamMembers, "[{$indexMember}]id");
        }
        ?>
        <?= $form->field($modelTeamMembers, "[{$indexMember}]first_name")->label(false) ?>
      </td>
      <td>
        <?= $form->field($modelTeamMembers, "[{$indexMember}]last_name")->label(false) ?>
      </td>
      <td>
        <?= $form->field($modelTeamMembers, "[{$indexMember}]email",['enableAjaxValidation' => true])->label(false) ?>
      </td>
      <td>
        <?= $form->field($modelTeamMembers, "[{$indexMember}]mobile_no",['inputOptions' => ['class' => 'form-control', 'maxlength'=>"10"]])->label(false) ?>
      </td>
    </tr>
 <?php endforeach; ?>

UsersController.php(控制器)

<?php
namespace app\modules\users\controllers;

use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\swiftmailer\Mailer;
use yii\filters\AccessControl;
use yii\web\Response;
use yii\widgets\ActiveForm;

class UsersController extends CommonController 
{
    public function actionAddmembers() {

        if(Yii::$app->request->isAjax && $modelUser->load(Yii::$app->request->post())) {
          Yii::$app->response->format = Response::FORMAT_JSON;
          return ActiveForm::validate($modelUser);
        } 
        elseif ($modelUser->load(Yii::$app->request->post())) {
            .
            .
        }

    }
}

Users.php(模型)

namespace app\modules\users\models;

use Yii;
use app\models\MyActiveRecord;
use yii\web\IdentityInterface;

class Users extends MyActiveRecord implements IdentityInterface
{

  public $rememberMe;
  public $confirm_password;
  public $verify_code;
  public $_user = false;

  public static function tableName() {
    return 'users';
  }

  public function rules() {
    return [

      .
            .
      //Email ID
      'emailTrim' => ['email', 'filter', 'filter' => 'trim'],
      'emailRequired' => ['email', 'required','message'=>'* required field'],
      'emailPattern' => ['email', 'email'],
      'emailUnique' => ['email', 'unique','message'=>'Email already exists!'],
        ];
  }
  .
  .
  .
}

我也试过:

UsersController.php(控制器)

public function actionAddmembers() {

  $modelUser = new Users();
  $modelCompanyUser = new CompanyUsers();
  $modelCompany = new Company();
  $modelsTeamMembers = [new Users]; 

  $modelUserDetails = MyActiveRecord::createMultiple(Users::classname());
  MyActiveRecord::loadMultiple($modelUserDetails, Yii::$app->request->post());

    if (Yii::$app->request->isAjax) {
      Yii::$app->response->format = Response::FORMAT_JSON;
      return ArrayHelper::merge(ActiveForm::validateMultiple($modelUserDetails));
    } elseif($modelUser->load(Yii::$app->request->post())){
        .
        .
    }
}

我正在关注 yii2-dynamicform

任何帮助/提示/建议都是可观的.

Any help/hint/suggestion would be appreciable.

推荐答案

是的.我知道了.如果有人遇到同样的问题,请使用此代码.请在需要的地方更改 $modelUserDetails 变量.

Yes. I got it. If anyone having the same problem, use this code. Please Change $modelUserDetails variable wherever it is needed.

我正在使用 DynamicFormWidget.

而且,我想在 email 字段上检查电子邮件是否存在.所以,

And, I wanted to check email exist on email field. So,

addmembers.php(查看)

使用 use yii\widgets\ActiveForm; 在页面顶部.并且,把 'enableAjaxValidation' =>true 在您希望用户限制输入重复值的字段中.

Use use yii\widgets\ActiveForm; in top of the page. And, put 'enableAjaxValidation' => true in the field where you want user to restrict to enter duplicate value.

use yii\widgets\ActiveForm; // This is mandatory.
.
.
<?= $form->field($modelTeamMembers, "[{$indexMember}]email",['enableAjaxValidation' => true]);?>
.
.

UsersController.php(控制器)

<?
// These two lines are mandatory. 
use yii\web\Response;
use yii\widgets\ActiveForm;

..

public function actionAddMembers() {

   .
   .
   $modelUserDetails = MyActiveRecord::createMultiple(Users::classname());
   MyActiveRecord::loadMultiple($modelUserDetails, Yii::$app->request->post());

   // ajax validation
   if (Yii::$app->request->isAjax) {

     Yii::$app->response->format = Response::FORMAT_JSON;
     return ActiveForm::validateMultiple($modelUserDetails);

   } elseif ($modelUser->load(Yii::$app->request->post())) {
        // Business Logic
   }
}

Users.php(模型)

class Users extends MyActiveRecord implements IdentityInterface
{
    .
    .
    .

    public function rules() {
    return [
            .
            .
            ['email', 'unique','message'=>'Email already exists!'],
        ];
  }

}

肯定会有帮助.

这篇关于使用 DynamicFormWidget 验证唯一的电子邮件 - Yii2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆