heimrichhannot/contao-entity-import-bundle

仅后端包。它提供从数据库或文件到数据库的数据导入。


README

此包提供一种通用的导入器,用于将数据从各种来源迁移到contao数据库实体。

此包仍在开发中。

功能

  • 从文件内容或数据库导入数据到任意的contao数据库实体(tl_*
  • 支持各种数据类型(json、csv、...)
  • 支持各种源类型(contao文件系统、http、绝对路径)
  • 可以从contao后端、作为cronjob和symfony命令执行
  • 自动字段操作(排序、别名、dateAdded、tstamp)
  • 合并和插入模式
  • 执行导入时通过异常发送电子邮件和contao_log通知(每个导入器配置发送一次,在下一个成功导入后重置)
  • (可选)如果已安装,支持DC_Multilingual

印象

导入器源后端设置

alt import_source_1

导入器配置后端设置

alt privacy config

安装

通过composer安装: composer require heimrichhannot/contao-entity-import-bundle 并更新您的数据库。

配置

  1. 导航到Contao后端的“系统”部分中的“导入”。
  2. 创建一个满足您需求的导入器源。
  3. 使用之前创建的源创建一个导入器。
  4. 使用dry-run或正常模式运行导入器。

config.yml

huh_entity_import:
  debug:
    contao_log: true # log errors while importing to contao system log
    email: false # report errors while importing via email to the admin email defined in the contao settings

技术说明

在导入过程中输出尊重上下文的消息

导入器可以作为命令、cronjob或在web上下文中运行。上下文表示如何输出消息(或错误消息)。

例如,当通过点击网站上的“导入”按钮(即在浏览器中)运行导入器时,应使用 \Contao\Message::addError()(或 addConfirmation(),...)打印消息。如果作为命令运行导入器,则必须在命令行中使用 SymfonyStyle 实例打印相同的消息。如果命令还在web上下文中运行,则还必须将消息存储到 tl_entity_import_config 实体中,因为这些是通过ajax在进度条视图中检索的。

如您所见,这不仅仅是“打印消息”,还要注意上下文。

为此,您可以使用方法 ImporterInterface::outputResultMessage(),该方法会自动处理正确的上下文。

作为symfony命令运行

huh:entity-import:execute config-ids [--dry-run]

其中 config-ids 需要是一个导入器配置ID的逗号分隔列表。

参数

作为contao cron运行

导入可以通过contao穷人的cron执行。执行间隔类似于contao定义。导入配置允许启用cron执行和选择cron间隔。可以选择 minutelyhourlydailyweeklymonthly 间隔。建议在通过cronjob导入之前在config.yml中设置调试选项。

添加自定义源

  1. 创建源并从 \HeimrichHannot\EntityImportBundle\Source\AbstractSource 继承或实现接口 \HeimrichHannot\EntityImportBundle\Source\SourceInterface
  2. 为事件 SourceFactoryCreateSourceEvent 创建一个事件监听器
    class SourceFactoryCreateSourceEventListener {
        public function __invoke(SourceFactoryCreateSourceEvent $event) {
            $sourceModel = $event->getSourceModel();
            $source = $event->getSource();
    
            switch ($sourceModel->type) {
                case 'new_stuff':
                    $source = new NewStuffSource();
    
                    break;
                // ...
            }
    
            $event->setSource($source);
        }
    }
  3. 创建一个 tl_entity_import_source.php 文件,并在 type 字段选项中添加您的源。
    $dca = &$GLOBALS['TL_DCA']['tl_entity_import_source'];
    
    $dca['fields']['type']['options'] = array_merge($dca['fields']['type']['options'], [
        'new_stuff'
    ]);
  4. 在您的 tl_entity_import_source.php 文件中创建您的调色板,例如,可以复制此捆绑包中的一个。

为源/配置字段映射添加预设。

添加字段映射有时可能很繁琐。因此,我们提供了一种添加预设的事件,这些预设可以在后端实体(源和配置)中选中。

只需注册一个事件监听器,并按照以下方式添加您的预设。

$presets = $event->getPresets();

$presets = array_merge($presets, [
    'twitter' => [
        [
            'name'        => 'externalId',
            'valueType'   => 'source_value',
            'sourceValue' => 'id',
        ],
        [
            'name'        => 'text',
            'valueType'   => 'source_value',
            'sourceValue' => 'full_text',
        ],
        [
            'name'        => 'publishedAt',
            'valueType'   => 'source_value',
            'sourceValue' => 'created_at',
        ],
        [
            'name'        => 'imageUrl',
            'valueType'   => 'source_value',
            'sourceValue' => 'image_url',
        ],
        [
            'name'        => 'imageId',
            'valueType'   => 'source_value',
            'sourceValue' => 'image_id',
        ],
        [
            'name'        => 'url',
            'valueType'   => 'source_value',
            'sourceValue' => 'url',
        ],
    ]
]);

$event->setPresets($presets);

为编辑器添加快速导入器。

坦白说:“快速导入器”是一个比“简单导入器”更好的称呼,这样编辑器就不会感到沮丧了;-) 快速导入器的用例是拥有一个对编辑器来说非常容易使用的用户界面。

简单地创建一个导入源和导入配置,就像您通常做的那样。之后,编辑器可以自己创建快速导入器,并添加自定义文件源(目前仅支持CSV类型的文件)。

alt quick importer example

在Web环境中通过cronjob运行导入。

如果您有大量数据集,导入可能会占用Web服务器过多的内存。在这种情况下,通常很有用

  1. 将导入器作为symfony命令运行。这必须由开发人员完成。
  2. 通过cronjob在Web环境中运行导入器。这可以由编辑器或开发人员完成。

在大多数情况下,通过命令行在shell中运行导入器所需的内存远少于通过网站在Web环境中运行。

为了使选项2生效,您需要执行以下步骤

  1. 使用参数--web-cron-mode将捆绑包的导入命令添加为cronjob。
    * * * * * /path/to/vendor/bin/contao-console huh:entity-import:execute <导入配置ID> --web-cron-mode >/dev/null 2>&1
  2. 在导入器配置中激活useCron并填写所需的字段。
  3. 在导入器配置中激活useCronInWebContext

事件