2017-04-16 3 views
-1

뉴스 레터 신청 양식을 받았는데 이메일이 이미 데이터베이스에 존재하는 경우 오류 메시지를 표시하려고합니다.Yii2 이미 데이터베이스에 이메일이 있는지 확인하십시오.

public function actionSubscriber() 
    { 
     $subscriber_model = new Subscriber(); 

     $request = Yii::$app->request; 
     if($request->isAjax && $subscriber_model->load($request->post())){ 
      $subscriber_model->save(); 
     } 
    } 

보기 코드 :

<?php 
use yii\helpers\Html; 
use yii\bootstrap\ActiveForm; 
use yii\helpers\Url; 
?> 

<h3>Subscribe to Newsletter</h3> 
<?php $form = ActiveForm::begin(['id' => $subscriber_model->formName(), 'action' => ['project/subscriber'], 'enableAjaxValidation' => true]); ?> 
    <div class="input-group"> 
     <?= $form->field($subscriber_model, 'email')->textInput()->label(false); ?>        
     <span class="input-group-btn"> 
      <?php echo Html::submitButton('Sign Up', ['class' => 'btn btn-primary subscribe-btn']); ?> 
     </span>        
    </div> 
<?php ActiveForm::end(); ?> 

<?php 
$script = <<< JS 
    $('#{$subscriber_model->formName()}').on('beforeSubmit', function(e){ 
     var form = $(this); 
     $.post(
      form.attr("action"), 
      form.serialize() 
     ).done(function(data){  
      form.trigger("reset"); 
     }); 
     return false; 
    }); 
JS; 
$this->registerJs($script); 
?> 

현재 코드 쇼 "하늘 메일"여기 가입자 모델에서 코드 Subscriber.php

<?php 

namespace common\models; 

use yii\db\ActiveRecord; 

class Subscriber extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'subscriber'; 
    } 

    public function rules() 
    { 
     return [ 
      ['email', 'filter', 'filter' => 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      [ 
       'email', 'unique',   
       'message' => 'This email address has already been taken.' 
      ] 
     ]; 
    } 
} 
?> 

컨트롤러 행동입니다 및 "잘못된 이메일"메시지가 표시되지만 인증에 실패합니다. 고유 이메일. 내 코드에서 문제가 무엇인지 말해주십시오.

+0

[이] (http://stackoverflow.com/questions/41205936/yii2-unique-validator-ignored) 도움이 될 것입니다 – gmc

+0

제출 후 'This email address has been taken .' 메시지가 표시됩니다. 형태. 예, 양식 유효성 검사 중에 확인하려면 AJAX 요청을 구현해야합니다. 그러나 제출을 클릭하면 여전히 실패합니다. –

+0

귀하의 컨트롤러에 귀하의 행동 기능을 보여주십시오. –

답변

0

AR 모델에 대한 규칙도 정의해야합니다. 귀하의 양식 모델은 자체 검증 기능을 갖추고 있습니다. 그렇지만, email 규칙은 규칙이없는 AR 모델을 살펴 보도록 지시합니다.

아예 다른 것을 제외하면, Subscriber AR 모델은 양식 모델과 독립적으로 작동 할 수 있어야합니다. 양식 외부에서 구독자를 업데이트하기위한 CRUD는 어떻게됩니까? 너무 규칙을 알 필요가있다 :

<?php 

namespace common\models; 

use yii\db\ActiveRecord; 

class Subscriber extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return '{{%subscriber}}'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      ['email', 'filter', 'filter' => 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      [ 
       'email', 'unique', 
       'targetClass' => '\common\models\Subscriber',   
       'message' => 'This email address has already been taken.' 
      ] 
     ]; 
    } 
} 
?> 

{{%subscriber}} 지원 테이블 접두사입니다. 나는 항상 그것들을 대체 할 것입니다. 미래의 I (또는 누군가)가 테이블 접두사를 추가 할 경우를 대비하여.

targetAttribute 열 이름이 완전히 동일하면 필요하지 않습니다.

public function actionSubscriber() 
{ 
    $subscriber_model = new Subscriber(); 

    $request = Yii::$app->request; 
    if($request->isAjax && $subscriber_model->load($request->post()) && $subscriber_model->validate() && $subscriber_model->save()) 
    { 
     // return something here 
    } 
} 

당신이 있는지 당신이보기에서 AJAX 요청을 만드는 :


편집

이 같은 액션을 다시 작성? 당신이 아니라면, 당신은 당신의 견해를 보여주지 않았다. 그렇다면 적절한 AJAX 응답을 반환하십시오. AJAX를 사용하지 않는다면 성공적인 플래시 메시지를 설정하고 싶을 것입니다.

+0

여러분은 구독 입력 (가입자)을 수집하고 저장하는 데 하나의 모델 만 사용하고있는 지금 SubscribeNewsletterForm 모델을 제거했다고 말했습니다. 액션 코드도 추가했습니다. 저장 및 기타 유효성 검사가 작동하지만 '이 이메일 주소는 이미 사용되었습니다'라는 메시지가 표시됩니다. 아직 보이지 않습니다. 내 코드를 업데이트 할 수 있습니까? – Alex

+0

'targetClass'=> '\ common \ models \ Subscriber', '를 AR 모델에 다시 추가하십시오. 왜 당신이 그것을 제거했는지 모르겠다. 임은 긍정적이지는 않지만 AR을 비교하는 것을 선언해야한다고 생각합니다. 나는 그것이 클래스의 새로운 인스턴스를 생성한다고 생각하기 때문에 항상 그것을 포함합니다.--- 또한,보기에서 AJAX 요청을 작성하고 있습니까? 네가하지 않으면 뛰지 않을거야. - 코드를 업데이트하여 동작을 더 잘 보여줍니다. –

+0

안녕하십니까. 안녕하세요. 보기 코드를 추가했습니다. 내가 말했듯이 데이터베이스에 전자 메일을 저장할 수 있고 잘못된 전자 메일이나 입력 상자에 아무것도 입력하지 않으면 코드가 오류를 표시합니다. 이미 테이블에있는 것과 동일한 이메일 ID를 입력 한 경우에만 아무 것도 발생하지 않습니다. 이 경우 클라이언트 측에서 "이 이메일은 이미 사용되었습니다"라는 오류를 표시하기 만하면됩니다. 감사. – Alex