markocupic/export_table

将Contao数据库表导出为CSV或XML文件。

安装次数: 6,369

依赖项: 4

建议者: 0

安全: 0

星级: 4

关注者: 2

分支: 3

开放性问题: 0

类型:contao-module

5.6.5 2024-08-18 11:30 UTC

README

Markoo Cupic Logo

Contao CMS的Export Table扩展

使用此扩展,可以从Contao后端将数据库表导出为CSV或XML格式。导出可以配置。

  • 选择导出类型(CSV/XML)
  • 可选择的表格
  • 可选择的字段
  • 是否包含标题行
  • 通过输入JSON数组过滤数据集
  • 可排序输出(字段名和方向)
  • 可设置分隔符(默认:;)
  • 可设置封装符(默认:")
  • 设置BOM(用于在MS Excel中正确显示UTF-8编码的字符)
  • 可设置数组分隔符
  • 深度链接支持
  • 选择存储目录
  • 选择文件名
  • 通过HOOKS和更多写入器可扩展的扩展名

Backend

使用过滤器

导出可以通过过滤器进行配置。

以下简单的过滤器仅允许来自Luzern的tl_member成员表的女性
[["gender=? AND city=?"],["female","Luzern"]]

或仅来自Luzern或Bern的女性
[["gender=? AND (city=? OR city=?)"],["female","Luzern", "Bern"]]

或所有ID为3的成员组成员[["tl_member.groups LIKE '%:\"3\";%' AND id > ?"],["0"]]

也可以使用Contao Insert Tags
[["lastname=? AND city=?"],["{{user::lastname}}","Oberkirch"]]

或从URL传递参数
[["lastname=? AND city=?"],["{{GET::lastname}}","Oberkirch"]]

对于开发者:通过"exportTable" HOOK控制输出

通过Hook可以调整输出。扩展本身使用这些Hooks。例如,使用exportTable Hook将时间戳转换为格式化的数据。可以禁用现有的Hooks,此时必须设置Priority以确保新Hook在现有Hook之前被调用。
请参考此示例

从自定义控制器中利用ExportTable

ExportTable类也可以相对简单地从其他扩展中利用。

首先需要配置导出。将导出表的名称作为构造函数参数传递给配置类。使用此最小配置将采用默认设置。下面是一个更详细的配置示例。

$config = new Config('tl_member');

通过方法$this->exportTable->run($objConfig)调用实际的导出服务,该方法期望一个之前创建的配置对象作为唯一参数。

$config = new Config('tl_member');
$config->setOutputBom(ByteSequence::BOM['UTF-8']);

return $this->exportTable->run($config);

以下是在自定义控制器中嵌入的更详细示例。

// App/Controller/CustomController.php

declare(strict_types=1);

namespace App\Controller;

use Contao\CoreBundle\Exception\ResponseException;
use Contao\CoreBundle\Framework\ContaoFramework;
use Contao\FilesModel;
use Markocupic\ExportTable\Config\Config;
use Markocupic\ExportTable\Export\ExportTable;
use Markocupic\ExportTable\Writer\ByteSequence;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/_test_export', name: CustomController::class, defaults: ['_scope' => 'frontend', '_token_check' => false])]
class CustomController extends AbstractController
{

    public function __construct(
        private ContaoFramework $framework,
        private ExportTable $exportTable,
    ){
    }

    public function __invoke(): Response
    {
        $this->framework->initialize();

        // First you have to config your data export.
        $config = (new Config('tl_member'))
            ->setExportType('csv')
            ->setFields(['firstname', 'lastname', 'dateOfBirth'])
            ->setAddHeadline(true)
            ->setHeadlineFields(['Vorname', 'Nachname', 'Geburtsdatum'])
            ->setDelimiter(',')
            ->setEnclosure('"')
            // Select * FROM tl_member WHERE tl_member.city = 'Oberkirch'
            ->setFilter([["city=?"],["Oberkirch"]])
            // Save the file to the Contao filesystem
            ->setSaveExport(true)
            // Define a target path, otherwise the file will be temporarily stored in system/tmp
            ->setSaveExportDirectory(FilesModel::findByPath('files')->uuid)
            // Define a filename, otherwise the file will become the name of the table ->tl_member.csv
            ->setFilename('export.csv')
            // Add BOM (correct display of UTF8 encoded chars in MS-Excel)
            ->setOutputBom(ByteSequence::BOM['UTF-8'])
            // Use the row callback to manipulate records
            ->setRowCallback(
                static function ($arrRow) {
                    foreach($arrRow as $fieldName => $varValue)
                    {
                        $arrRow[$fieldName] = doSomething($varValue);
                    }
                    return $arrRow;
                }
            )
            //->convertEncoding(true, 'UTF-8', 'ISO-8859-1');
        ;

        // The export class takes the config object as single parameter.
        return $this->exportTable->run($config);
    }
}

创建自定义导出服务

如果两个标准写入器(CSV和XML)不足以满足需求,可以轻松添加另一个写入器。必须编写一个实现Markocupic\ExportTable\Writer\WriterInterface的Writer类。在services.yaml中,必须使用name: markocupic_export_table.writer标记该类。别名应该是唯一的且未被使用过。例如alias: my_custom_csv

    # Inject Custom CSV writer into Markocupic\ExportTable\Export\ExportTable and Markocupic\ExportTable\DataContainer\ExportTable during compilation
    App\ExportTable\Writer\CustomXmlWriter:
        tags:
            - { name: markocupic_export_table.writer, alias: xml, verbose_name: Custom xml exporter class }

祝您使用Export Table愉快!