2017-04-16 211 views
-1

我订阅了一个通讯表单,如果电子邮件已存在于数据库中,我试图显示一条错误消息。下面是用户模型Subscriber.phpYii2检查数据库中是否已存在电子邮件

<?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.' 
      ] 
     ]; 
    } 
} 
?> 

控制器行动代码:

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); 
?> 

当前的代码显示 “空的电子邮件”和“无效的电子邮件”消息,但验证失败独特的电邮。请告诉我在我的代码中有什么问题。

+0

我认为[this](http://stackoverflow.com/questions/41205936/yii2-unique-validator-ignored)应该可以帮到你 – gmc

+0

它会在提交后返回'此电子邮件地址已被采取.'消息表格。是的,您需要实施AJAX请求以在表单验证期间进行检查。但是,点击提交后,它仍然会失败。 –

+0

请向我们展示您的控制器中的动作功能。 –

回答

0

您还需要在AR模型上定义规则。你的表单模型有自己的内置验证,是的..但是,email规则告诉它看看你的AR模型,它没有任何规则。

除了其他任何事情,如果将其细分,则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}}用于支持的表前缀。我总是这样替换它们,以防将来我(或某人)添加表格前缀。

如果列名完全相同,则不需要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,那么你会想设置一个成功的Flash消息。

+0

正如你所说我已经删除了SubscribeNewsletterForm模型,现在我只使用一个模型来收集和保存用户输入(订阅者)。我还添加了操作代码。保存和其他验证正在运行,但消息“此电子邮件地址已被占用。”仍然没有显示。你可以更新我的代码吗? – Alex

+0

尝试向AR模型添加''targetClass'=>'\ common \ models \ Subscriber'。我不知道你为什么删除它。我并不积极,但我认为有必要将你的比较声明为AR。我总是把它包括进去,因为我认为它创建了一个新的类实例。---另外,你是否从你的视图创建了一个AJAX请求?它不会运行,如果你不是。 - 我更新了我的代码以更好地显示此操作。 –

+0

嗨韦德谢谢你的回应。我已添加视图代码。正如我所说,我可以将电子邮件存储在数据库中,如果输入框中输入了错误的电子邮件或任何内容,我的代码将显示错误。当我输入表中已经存在的相同电子邮件ID时,只会发生任何事情。我只是想在客户端显示一个错误“这封电子邮件已被采纳”。谢谢。 – Alex

相关问题