我有一个订阅时事通讯表单,如果电子邮件已存在于数据库中,我正在尝试显示错误消息。以下是订阅者模型 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.'
]
];
}
}
?>
控制器操作:
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 :(得分:0)
您还需要在AR模型上定义规则。你的表单模型有它自己的内置验证,是的..但是,email
规则告诉它查看你的AR模型,它没有任何规则。
除此之外,如果你将其分解,你的Subscriber
AR模型应该能够独立于Form模型运行。在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消息。
答案 1 :(得分:0)
改为尝试
[['email'], 'unique',
'targetClass' => Suscriber::className(),
'message' => 'This email is already taken']