我使用Ajax在yii中提交登录表单。这是我的Ajax函数:
$("#login-form").submit(function() {
var email = $("#email").val();
var password = $("#password").val();
$.ajax({
url:"<?php echo Yii::app()->request->baseUrl; ?>/site/validatelogin",
type:"post",
data:"email=" + email +"&password=" + password,
success: function(response) {
if (response ==="1") {
window.location.href="<?php echo Yii::app()->getBaseUrl(true); ?>/dashboard";
}
else
{
//Dispaly response errors above login form
}
},
error: function() {
alert("Could not perform the requested operation due to some error.");
return false;
}
});
});
我的php控制器函数是validatelogin,如下所示:
$email = $_POST['email'];
$password = $_POST['password'];
$model = new LoginForm();
$model->email = $email;
$model->password = $password;
if ($model->validate() && $model->login()) {
echo"1";
} else {
print_r($model->getErrors());
}
号
如果用户输入了正确的凭据,我将发送1作为对视图的响应,并将用户重定向到仪表板。
但是,如果用户输入了不正确的凭据,则根据错误类型,Ajax响应中会收到不同的错误。
我想通过循环在success函数的其他部分的登录表单上方显示这些错误。
但是,当我在响应上运行循环时,该数组的长度非常大,例如,如果响应中的错误是"不正确的密码",那么响应数组在错误消息中的长度为18(字符数)。简而言之,响应数组如下:
array('I','n','c','o','r','r'....)
而不是
array([0]=>"Incorrect password")
。
如何转换后一种格式的响应数组并遍历每个索引,以向登录表单上方的用户显示错误消息?
字符串只是字符数组。我希望您正在迭代一个字符串。请console.log(response);编辑有结果的问题,并在登录表单上显示//显示响应错误的代码。
将其编码为json。
在您的PHP中:
echo json_encode($model->getErrors());
在您的JS中(在else中):
var errors = $.parseJSON(response);
号
编辑:
在您的情况下,最好始终返回JSON。
您的JS可以更改为:
var jqxhr = $.post("<?php echo Yii::app()->request->baseUrl; ?>/site/validatelogin", {
email: email,
password: password
}, 'json');
jqxhr.done(function(response) {
if (response.valid) {
window.location.href="<?php echo Yii::app()->getBaseUrl(true); ?>/dashboard";
} else {
if (response.errors) {
...
}
}
});
jqxhr.error(function(response) {
alert("Could not perform the requested operation due to some error.");
});
您的PHP:
$response = array('valid' => false);
if ($model->validate() && $model->login()) {
$response['valid'] = true;
} else {
$response['errors'] = $model->getErrors();
}
header('Content-type: application/json');
echo json_encode($response);
。
如果设置了正确的JSON头,就不需要使用ParseJSON。最好总是发送JSON,而不仅仅是错误。如echo json_encode(array('success'=>false, 'errors'=>$model->getErrors());表示失败,echo json_encode(array('success'=>true, 'errors'=>'');表示成功。
是的,我同意在这种情况下最好始终返回JSON。这要求您提供正确的dataType。
我用一个例子更新了我的答案。
感谢您的所有回复。我想当我回到办公室的代码时,它会解决这个问题。谢谢!
除了@sroes的答案,使用yii库进行json
echo CJSON::encode($response);
而不是
echo json_encode($response);
。
为什么?
当我们有json_编码时为什么要使用cjson编码?