ExtJS 4:将复杂数据发送到服务器并在新浏览器中打开结果 window

ExtJS 4: Send complex data to the server and open result in a new browser window

我想在服务器上生成一个 .xlsx 文件(如果合适的话使用 PHP)并在新浏览器中打开结果(实际上 'Save As...' window)window.要在服务器上生成文件,我必须传递复杂的数据(文件设置),例如:

[
    {
        'value1': 1,
        'value2': 2,
        'value3': 3
    },
    {
        'value4': 4,
        'value5': 5,
        'value6': 6
    }    
 ]

为此我做了类似的事情:

Ext.create(Ext.form.Panel).submit({
    clientValidation: false,
    method: 'POST',
    params: [
        {
            'value1': 1,
            'value2': 2,
            'value3': 3
        },
        {
            'value4': 4,
            'value5': 5,
            'value6': 6
        }    
    ],
    standardSubmit: true,
    target: '_blank',
    url: 'my/real/url'
});

但是在我的服务器上,我不断收到错误的数据,比如

Array (
    [0] => [object Object]
    [1] => [object Object]
)

在我的 $_POST 中(其中 [object Object] 是实际字符串)或

0=%5Bobject+Object%5D&1=%5Bobject+Object%5D

在我的$data(我使用的是 Slim 框架)

$app->post('my/real/url', function () use ($app) {
    $request = $app->request();
    $data = $request->getBody();
});

实际上我尝试了很多解决方法,但我从未在我的服务器端获得所需的数据。也许我使用了错误的方法或者只是做错了?

原因是 standardSubmit 配置将导致 Ext JS 创建一个 <form> 并使用表单项的值和您传入的参数向该表单添加项。 A <form> 项目不能包含数组或对象等复杂值。

您可以在发送数据之前对其进行编码,然后在服务器上对其进行解码:

Ext.create(Ext.form.Panel).submit({
    clientValidation: false,
    method: 'POST',
    params: {
        data: Ext.encode([
            {
                'value1': 1,
                'value2': 2,
                'value3': 3
            },
            {
                'value4': 4,
                'value5': 5,
                'value6': 6
            }    
        ])
    },
    standardSubmit: true,
    target: '_blank',
    url: 'my/real/url'
});

然后在你的服务器上,不确定 Slim 框架(从未使用过),但是 PHP 你可以使用 json_decode:

$data = json_decode($_POST['data']);