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


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

我想在服务器上生成一个.xlsx文件(如果需要的话,使用PHP),并在新的浏览器窗口中打开结果(实际上是"另存为…"窗口)。要在服务器上生成文件,我必须传递复杂的数据(文件设置),如:

[
    {
        '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配置会导致ExtJS创建一个<form>,并使用表单项的值和传入的参数向该表单添加项。<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']);