首页 > 解决方案 > 我需要编写一个以 CSV 和 XLSX 格式导出数据的插件。十月 CMS

问题描述

我需要编写一个以 CSV 和 XLSX格式导出数据的插件*. 作为基础,我遵循使用 ImportExport 后端行为的 Vojta 的插件代码 (1) 。

主插件控制器DataImportExport从位于ImportExportController.

class DataImportExport extends Controller
   {​​​​​​​
      public$implement = [
            'Backend.Behaviors.ImportExportController', 
      ];
       ...
   }

正是这种行为具有将数据导出到 CSV 文件的方法。然而,如果我想导出到 XLSX 文件中,我应该将相应的方法添加到该行为中,即通过覆盖其现有方法的一些方法添加到导出控制器中。然而,当我在DataImportExport控制器内部执行此操作时,它不起作用......当我尝试/测试时,导出过程与仅使用 CSV 之前的导出过程保持一致......似乎无法覆盖/扩展后端行为,即modules\backend\behaviors\ImportExportController.php

例如,在DataimportExport控制器上,我尝试通过添加用于 XLSX 导出的代码来覆盖行为exportFromList()方法- 然而,没有积极的变化......我尝试了它。ImportExportController

class DataImportExport extends Controller
{
    public $implement = [
       'Backend.Behaviors.ImportExportController', 
    ];

public function __construct()
{
    parent::__construct();
        
    BackendMenu::setContext('RainLab.User', 'user', $this->action);
    
    // extending the ImportExportController behavior
    \Backend\Behaviors\ImportExportController::extend(function($model) {
        $model->addDynamicProperty('tagsCache', null);

        $model->addDynamicMethod('writeXLSX', function() use ($model) {
            
        });

        $model->addDynamicMethod('getTagsAttribute', function() use ($model) {
            if ($this->tagsCache) {
                return $this->tagsCache;
            } else {
                return $this->tagsCache = $model->tags()->lists('name');
            }
        });
    });


}    
...

// method to override
public function exportFromList($definition = null, $options = [])
{
    ... 
    $response = Response::make();
    if ($options['export_type'] == 'csv') {
        /*
        * Response CSV
        */        
        $response->header('Content-Type', 'text/csv');
        $response->header('Content-Transfer-Encoding', 'binary');
        $response->header('Content-Disposition', sprintf('%s; filename="%s"', 'attachment', $filename));
        $response->setContent((string) $csv);
    } else {
        // export into xlsx code             
    }
    
    return $response;
   }
}

笔记

  1. Vojta 的插件仅从 CSV 文件导出/导入。

标签: export-to-excelxlsxoctobercmsoctobercms-pluginsoctobercms-backend

解决方案


也许你应该看看https://octobercms.com/plugin/vdomah-excel在哪里可以导入和导出 CSV 和 Excel 文件?该文档非常好,我在许多项目中都使用它来导入数据,并且运行良好。

最好的,卢卡斯


推荐阅读