webexmachina/contao-personal-data-manager

Contao开源CMS的个人数据管理包

v1.2.0 2024-08-22 13:18 UTC

README

此项目的目的是允许在Contao CMS中更好地处理个人数据。

警告

请注意,此包会修改数据库中注册的数据。因此,由该包管理的所有实体在其数据库表中都将具有加密数据版本。通过配置的模型(见下文)检索这些数据不会像以前那样有区别。然而,直接与数据库交互的SQL查询可能存在问题,因为它们将在加密数据上运行。

例如:如果您将 Member 模型配置为由此包管理,您需要在 SendNewsletterEvent 事件上创建一个 EventListener,因为它使用SQL查询直接从 tl_member 检索新闻通讯接收者的数据,而不是使用模型。请参阅此示例

功能

  • 存储个人数据
  • 检索个人数据

系统要求

  • Contao 4.13

安装

从Packagist(Contao Manager)克隆扩展

配置

首先,您需要定义一个加密密钥。然后,需要调整模型(及其关联的DCA)。

加密密钥

由于此包使用plenta/contao-encryption,需要设置一个加密密钥。当包加载时,它会检查加密密钥 plenta_contao_encryption.encryption_key 是否已设置。

如果没有设置,它将在 /system/config/localconfig.php 文件中查找我们自己的密钥,名称为 wem_pdm_encryption_key,并将其应用到 plenta_contao_encryption.encryption_key 容器参数。

模型

在您的模型中使用 WEM\PersonalDataManagerBundle\Model\Traits\PersonalDataTrait 特性,并定义必需的静态属性。

例如

<?php 

use WEM\PersonalDataManagerBundle\Model\Traits\PersonalDataTrait as PDMTrait;

class MyModel
{
    use PDMTrait;
    /** @var array Fields to be managed by the Personal Data Manager */
    protected static $personalDataFieldsNames = ['myField'];
    /** @var array Default values for fields to be managed by the Personal Data Manager */
    protected static $personalDataFieldsDefaultValues = ['myField' => 'managed_by_pdm'];
    /** @var array Values for fields to be managed by the Personal Data Manager when anonymized */
    protected static $personalDataFieldsAnonymizedValues = ['myField' => 'Anonymized'];
    /** @var string Field to be used as pid by the Personal Data Manager */
    protected static $personalDataPidField = 'id';
    /** @var string Field to be used as email by the Personal Data Manager */
    protected static $personalDataEmailField = 'email';
    /** @var string ptable to be used by the Personal Data Manager */
    protected static $personalDataPtable = 'tl_my_table';

这样,当保存一个 MyModel 对象时,MyField 的实际值不会存储在 MyModel 的表中,而是存储在个人数据管理器中,并与相应的 MyModel 的id以及定义的 $personalDataPtable 相关联。MyFieldtl_my_table 中的存储值将是 MyMode::personalDataFieldsDefaultValues 中定义的值(在我们的例子中为 'managed_by_pdm')。

当从数据库检索 MyModel 对象时,个人数据管理器将自动检索关联的个人数据,并相应地填充 MyModel 对象。

自定义表驱动程序

此包提供了一种特性,允许在后台列表中分组工作。要使其工作,您需要定义一个自定义DCA Table Driver(如果您已经有一个自定义的,您仍然需要创建另一个,因为特性假定它在配置了使用个人数据管理器的模型上工作)。

<?php

declare(strict_types=1);

namespace Your\Namespace;

use WEM\PersonalDataManagerBundle\Dca\Driver\PDMDCTableTrait;

class DC_Table extends \Contao\DC_Table
{
    use PDMDCTableTrait;
}

DCA

在您的DCA中,您需要添加以下回调和驱动程序

use Path\To\Your\Custom\Dca\Driver\DC_Table_Custom;

$GLOBALS['TL_DCA']['tl_my_table'] = [
    'config'=>[
        // ...
        'dataContainer' => DC_Table_Custom::class,
        'ondelete_callback' => [['wem.personal_data_manager.dca.config.callback.delete', '__invoke']],
        'onshow_callback' => [['wem.personal_data_manager.dca.config.callback.show', '__invoke']],
        'onsubmit_callback' => [['wem.personal_data_manager.dca.config.callback.submit', '__invoke']],
    ],
    'list'=>[
        'label' => [
            // ...
            'label_callback' => ['wem.personal_data_manager.dca.listing.callback.list_label_label_for_list', '__invoke'],
        ],
    ],
    'fields'=>[
        'myField'=>[
            // ...
            'load_callback' => [['wem.personal_data_manager.dca.field.callback.load', '__invoke']],
        ]
    ]
]

这样,在后台编辑您的记录将像使用模型一样工作。

⚠️ 如果您正在处理的数据可以通过 contao 的 个人数据 前端模块进行编辑,您需要扩展 load 回调以精确指定前端回调应在哪个表 & 字段上工作!

PHP 回调

<?php

declare(strict_types=1);

namespace Your\Namespace\Dca\Field\Callback;

use WEM\PersonalDataManagerBundle\Dca\Field\Callback\Load as PdmCallback; // or Save

class Load
{
    /** @var WEM\PersonalDataManagerBundle\Dca\Field\Callback\Load */
    private $pdmCallback;
    /** @var string */
    private $frontendField;
    /** @var string */
    private $table;

    public function __construct(
        PdmCallback $pdmCallback,
        string $frontendField,
        string $table
    ) {
        $this->pdmCallback = $pdmCallback;
        $this->frontendField = $frontendField;
        $this->table = $table;

        $this->pdmCallback->setFrontendField($this->frontendField)->setTable($this->table);
    }

    public function __invoke()
    {
        return $this->pdmCallback->__invoke(...\func_get_args());
    }
}

YAML 配置文件(例如 your/bundle/src/Resources/contao/config/services.yml

services:
    your.bundle.dca.field.callback.load.tl_my_table.my_field:
        class: Your\Namespace\Dca\Field\Callback\Load
        arguments:
            $pdmCallback: '@wem.personal_data_manager.dca.field.callback.load'
            $frontendField: 'myField'
            $table: 'tl_my_table'
        public: true

DCA 文件

$GLOBALS['TL_DCA']['tl_my_table']['fields']['myField']['load_callback'][] = ['your.bundle.dca.field.callback.load.tl_my_table.my_field', '__invoke'];

用法

提供后端条目和前端模块,以允许管理员和用户显示、导出或匿名化他们的个人数据。

后端

用户可以输入一个电子邮件地址,所有相关联的个人数据都会显示出来。从这里,用户可以显示、导出或匿名化它们。

前端

前端模块需要注册到您的主题中。

用户需要在显示的表单中输入一个电子邮件地址。将包含一个链接到当前页面并带有令牌的电子邮件发送到表单中填写的电子邮件地址。令牌在创建后有效期为 5 分钟。通过点击电子邮件中提供的链接,用户将被重定向到包含前端模块的页面,令牌作为 GET 参数。从这里,用户可以显示、导出或匿名化他们的个人数据。

用户的每个操作都会使令牌再有效 5 分钟。

钩子

有多个钩子可用于自定义此捆绑包。列表可在此处找到。

文档

许可

此扩展受 Apache License 2.0 条款的约束。完整的许可文本可在主文件夹中找到。

获取支持

访问支持页面提交问题或直接联系:):

从 Git 安装

您可以使用此仓库 URL 获取扩展: Github