Yii2检查数据库中是否已经存在电子邮件
我有一个订阅时事通讯表单,如果数据库中已经存在电子邮件,我会尝试显示一条错误消息。以下是订阅服务器模型Subscriber.php中的代码Yii2检查数据库中是否已经存在电子邮件,yii2,yii2-advanced-app,Yii2,Yii2 Advanced App,我有一个订阅时事通讯表单,如果数据库中已经存在电子邮件,我会尝试显示一条错误消息。以下是订阅服务器模型Subscriber.php中的代码 <?php namespace common\models; use yii\db\ActiveRecord; class Subscriber extends ActiveRecord { public static function tableName() { return 'subscriber';
<?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.'
]
];
}
}
?>
查看代码:
<?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);
?>
订阅时事通讯
当前代码显示“空电子邮件”和“无效电子邮件”消息,但对唯一电子邮件的验证失败。请告诉我代码中的问题是什么。您还需要在AR模型上定义规则。您的表单模型有自己的内置验证,是的。。但是,
email
规则告诉它查看您的AR模型,它没有任何规则
除此之外,如果您将其分解,您的订阅者AR模型应该能够独立于表单模型运行。在CRUD更新订阅服务器的过程中,表单之外的情况如何。它还需要知道规则:)
您确定要从视图中创建AJAX请求吗?如果你不这样做,而且你没有展示你的观点,那就行不通了。如果是,则返回适当的成功AJAX响应。如果您不使用AJAX,那么您需要设置一条成功的flash消息。试试这个
[['email'], 'unique',
'targetClass' => Suscriber::className(),
'message' => 'This email is already taken']
我想这会对您有所帮助,它会在提交表单后返回此电子邮件地址已被占用。
消息。是的,您需要实现一个AJAX请求,以便在表单验证期间进行检查。但是,当您单击“提交”时,它仍然会失败。请在控制器中向我们显示您的操作功能。我已尝试过,但它对我无效。如果可能,请更新我的模型代码,如果唯一验证失败,请启用错误消息。使用$form->formName有史以来最差的解决方案。使用$form->id。在这种情况下使用pjax=\正如您所说,我已经删除了SubscribeNewsletterForm模型,现在我只使用一个模型来收集和保存用户输入(Subscriber)。我还添加了操作代码。正在进行保存和其他验证,但仍不显示消息“此电子邮件地址已被占用”。您可以更新我的代码吗?请尝试将'targetClass'=>'\common\models\Subscriber',
添加回AR模型。我不知道你为什么把它拿走。我不是很肯定,但我认为有必要把AR申报给你。我总是包含它,因为我认为它创建了类的新实例另外,您是否正在从视图中创建AJAX请求?如果你不这样做,它就跑不动了我更新了代码以更好地显示操作。嗨,韦德,谢谢你的回复。我已经添加了视图代码。正如我所说,如果输入框中输入了不正确的电子邮件或什么都没有输入,我可以将电子邮件存储在数据库中,并且我的代码显示错误。只有当我输入表中已存在的相同电子邮件ID时,才会发生任何事情。我只想在客户端显示一个错误“此电子邮件已被接收”。谢谢
<?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.'
]
];
}
}
?>
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
}
}
[['email'], 'unique',
'targetClass' => Suscriber::className(),
'message' => 'This email is already taken']