Yii2:如何以编程方式启动导出

时间:2016-03-30 06:41:15

标签: yii2

我有DynaGridExportMenu的几个观点。我每天都需要将所有导出保存为CSV文件。我不知道,如何从控制器开始一个新的导出(在DynaGrid中定义)。

我找到了以下可能的解决方案,但它们都不是最佳解决方案:

  • 我可以在相应的模型中定义导出,然后通过控制器中的操作实现导出,例如在this example中。但后来我必须两次定义相同的出口,我冒险,两个出口之间会有差异。
  • 我可以使用Codeception和在验收测试的框架中模拟导出菜单上的单击。这个解决方案相对容易实现,但我发现它不稳定。
  • 我还可以准备导出文件的链接,因此使用Codeception进行导出会更容易。

请参阅:

<?= echo yii\helpers\Html::a('Export', ['controller/action'], [
    'class'=>'classname',
    'data'=>[
        'method'=>'post',
        'params'=>[
            'export_type'=>'CSV',
            'exportFull_w0' => '1',
            'export_columns' => '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20',
            'column_selector_enabled' => '1'
        ],
    ]
]) ?>

有更简单的事情吗?我需要扩展程序UploadFromUrl,它可以下载文件,如下所示:

$url = 'http://static.yiiframework.com/files/logo/yii.png' ;
$path = 'uploads/yii.png';

$file = UploadFromUrl::initWithUrl($url);
$file->saveAs($path);

但它无法使用当前Yii应用程序中的post参数和url。

2 个答案:

答案 0 :(得分:2)

我没有亲自使用DynaGrid,但是我使用这个lib https://github.com/arogachev/yii2-excel编写了一些导出 - 这样我可以自定义我的大部分导出功能。您还可以编写自定义SQL,您可以轻松更改,假设您的导出更改而不影响DynaGrid。希望这是有帮助的。

答案 1 :(得分:0)

最后我使用了以下解决方案。

在Dynagrid中将stream参数设置为false:

'gridOptions' => [
    ...
    'toolbar' => [
        ...
        \kartik\export\ExportMenu::widget([
            ...
            'stream' => false,
            'folder' => '@webroot/export',
        ]);
    ],
],

如果流设置为false,则导出的文件将保存在目录“文件夹”中。

web 控制器中定义一个新操作,该操作将使用Dynagrid保存导出数据:

public function actionExport()
{
    $_POST['export_type'] = 'CSV';
    $_POST['exportFull_w0'] = '1';
    $_POST['export_columns'] = '0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15';
    $_POST['column_selector_enabled'] = '1';

    Yii::$app->runAction('controller/data');

    return true;
}

可以从控制台到cURL启动“导出”操作,如以下答案中所述:Yii2: Run a web action in a console controller