将ajax响应数组对象转换为javascript数组?

时间:2014-04-24 14:19:19

标签: javascript php ajax arrays yii

我正在使用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响应中会收到不同的错误。

我希望通过循环在成功函数的其他部分中显示登录表单上方的错误。

但是当我在响应上运行循环时,那个数组的长度非常大,例如,如果响应中的错误是&#34;密码错误&#34;然后响应数组在错误消息中的长度为18(字符数)。简而言之,响应数组就像:

array('I','n','c','o','r','r'....)

而不是

array([0]=>"Incorrect password")

如何以后一种格式转换响应数组并迭代每个索引以向登录表单上方的用户显示错误消息?

2 个答案:

答案 0 :(得分:3)

将其编码为JSON

在你的php中:

echo json_encode($model->getErrors());

在你的js中(在其他地方):

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

答案 1 :(得分:0)

除了@ sroes的回答,使用Yii库获取JSON

echo CJSON::encode($response);

而不是

echo json_encode($response);
为什么?

Why use CJSON encode when we have json_encode