Show Menu
主题×

将草稿和提交组件与数据库集成的示例

示例概述

AEM Forms门户草稿和提交组件允许用户将表单另存为草稿并稍后从任何设备提交。 此外,用户还可以在门户上视图其提交的表单。 要启用此功能,AEM Forms提供数据和元数据服务,以存储用户在表单中填写的数据以及与草稿和已提交表单关联的表单元数据。 默认情况下,此数据存储在CRX存储库中。 但是,当用户通过AEM发布实例与表单交互时(通常在企业防火墙之外),组织可能希望自定义数据存储,以使其更加安全可靠。
本文档讨论的示例是自定义数据和元数据服务的参考实现,以将草稿和提交组件与数据库集成。 示例实现中使用的数 据库为MySQL 5.6.24 。 但是,您可以将草稿和提交组件与您选择的任何数据库相集成。
  • 本文档中说明的示例和配置符合MySQL 5.6.24的要求,您必须将其相应替换为数据库系统。
  • 确保已安装最新版AEM Forms加载项包。 有关可用包的列表,请参阅 AEM Forms发布文章
  • 示例包只能用于自适应表单提交操作。

设置和配置示例

对所有作者和发布实例执行以下步骤以安装和配置示例:
  1. 将以下 aem-fp-db-integration-sample-pkg-6.1.2.zip包下载到您的 文件系统。
    数据库集成的示例包
  2. 转到位于https://的AEM包管​ # : # /crx/packmgr/。
  3. 单击“ 上传包”
  4. 浏览以选 择aem-fp-db-integration-sample-pkg-6.1.2.zip包,然后单击 “确定
  5. 击包 旁的“安装”以安装该包。
  6. 转到 AEM Web Console ​的“配置​ # ​面,网​ # https:// host:port/system/console/configMgr。
  7. 单击以在编 辑模式下打开Forms Portal草 稿和提交配置。
  8. 如下表所述,指定属性的值:
    属性
    描述
    Forms Portal Draft Data Service
    草稿数据服务的标识符
    formsportal.sampledataservice
    Forms Portal草稿元数据服务
    草稿元数据服务的标识符
    formsportal.samplemetadataservice
    Forms Portal提交数据服务
    提交数据服务的标识符
    formsportal.sampledataservice
    Forms Portal提交元数据服务
    提交元数据服务的标识符
    formsportal.samplemetadataservice
    Forms Portal挂起的签名数据服务
    挂起签名数据服务的标识符
    formsportal.sampledataservice
    Forms Portal待签名元数据服务
    待签名元数据服务的标识符
    formsportal.samplemetadataservice
    服务通过其名称解析,这些名称作为密钥 aem.formsportal.impl.prop 的值如下:
    @Service(value = {SubmitDataService.class, DraftDataService.class})
    @Property(name = "aem.formsportal.impl.prop", value = "formsportal.sampledataservice")
    @Service(value = { SubmitMetadataService.class, DraftMetadataService.class })
    @Property(name = "aem.formsportal.impl.prop", value = "formsportal.samplemetadataservice")
    
    
    您可以更改数据和元数据表的名称。
    要为元数据表提供其他名称:
    • 在Web控制台配置中,查找并单击Forms Portal元数据服务示例实现。 您可以更改数据源、元数据/其他元数据表名称的值。
    要为数据表提供其他名称:
    • 在Web控制台配置中,找到并单击Forms Portal Data Service示例实现。 您可以更改数据源和数据表名称的值。
    如果更改表名称,请在表单门户配置中提供这些名称。
  9. 保留其他配置,然后单击“保 存”
  10. 数据库连接可通过Apache Sling Connection池数据源完成。
  11. 对于Apache Sling连接,在Web控制台配 置的编辑模式下查找并单击以打开 Apache Sling Connection Pooled DataSource。 如下表所述,指定属性的值:
属性
数据源名称
用于从数据源池过滤驱动程序的数据源名称
注意: 示例实现使用FormsPortal作为数据源名称。
JDBC驱动程序类 com.mysql.jdbc.Driver
JDBC连接URI jdbc:mysql://[ host ]:[ port ]/[ 模式名称 ]
用户名 对数据库表进行身份验证和执行操作的用户名
密码 与用户名关联的口令
事务隔离 READ_COMMITTED
最大活动连接数 1000
最大空闲连接数 100
最小空闲连接数 10
初始大小 10
最大等待 100000
借阅测试 已选中
空闲时测试 已选中
验证查询 示例值为SELECT 1(mysql)、从dual(oracle)、SELECT 1(MS Sql Server)(validationQuery)中选择1
验证查询超时 10000
  • MySQL的JDBC驱动程序未随示例提供。 确保已为其设置,并提供配置JDBC连接池所需的信息。
  • 将您的作者实例和发布实例指向使用同一数据库。 JDBC连接URI字段的值必须对于所有作者实例和发布实例都相同。
  1. 保留其他配置,然后单击“保 存”
  2. 如果数据库模式中已有表,请跳到下一步。
    否则,如果数据库模式中还没有表,请执行以下SQL语句,为数据模式中的数据、元数据和其他元数据创建单独的表:
    创作和发布实例不需要不同的数据库。 在所有创作和发布实例上使用相同的数据库。
    数据表的SQL语句
    CREATE TABLE `data` (
    `owner` varchar(255) DEFAULT NULL,
    `data` longblob,
    `metadataId` varchar(45) DEFAULT NULL,
    `id` varchar(45) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    元数据表的SQL语句
    CREATE TABLE `metadata` (
    `formPath` varchar(1000) DEFAULT NULL,
    `formType` varchar(100) DEFAULT NULL,
    `description` text,
    `formName` varchar(255) DEFAULT NULL,
    `owner` varchar(255) DEFAULT NULL,
    `enableAnonymousSave` varchar(45) DEFAULT NULL,
    `renderPath` varchar(1000) DEFAULT NULL,
    `nodeType` varchar(45) DEFAULT NULL,
    `charset` varchar(45) DEFAULT NULL,
    `userdataID` varchar(45) DEFAULT NULL,
    `status` varchar(45) DEFAULT NULL,
    `formmodel` varchar(45) DEFAULT NULL,
    `markedForDeletion` varchar(45) DEFAULT NULL,
    `showDorClass` varchar(255) DEFAULT NULL,
    `sling:resourceType` varchar(1000) DEFAULT NULL,
    `attachmentList` longtext,
    `draftID` varchar(45) DEFAULT NULL,
    `submitID` varchar(45) DEFAULT NULL,
    `id` varchar(60) NOT NULL,
    `profile` varchar(255) DEFAULT NULL,
    `submitUrl` varchar(1000) DEFAULT NULL,
    `xdpRef` varchar(1000) DEFAULT NULL,
    `agreementId` varchar(255) DEFAULT NULL,
    `nextSigners` varchar(255) DEFAULT NULL,
    `eSignStatus` varchar(45) DEFAULT NULL,
    `pendingSignID` varchar(45) DEFAULT NULL,
    `agreementDataId` varchar(255) DEFAULT NULL,
    `enablePortalSubmit` varchar(45) DEFAULT NULL,
    `submitType` varchar(45) DEFAULT NULL,
    `dataType` varchar(45) DEFAULT NULL,
    `jcr:lastModified` varchar(45) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `ID_UNIQUE` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    附加元数据表的SQL语句
    CREATE TABLE `additionalmetadatatable` (
    `value` text,
    `key` varchar(255) NOT NULL,
    `id` varchar(60) NOT NULL,
    PRIMARY KEY (`id`,`key`),
    CONSTRAINT ‘additionalmetadatatable_fk’ FOREIGN KEY (`id`) REFERENCES `metadata` (`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    注释表的SQL语句
    CREATE TABLE `commenttable` (
    `commentId` varchar(255) DEFAULT NULL,
    `comment` text DEFAULT NULL,
    `ID` varchar(255) DEFAULT NULL,
    `commentowner` varchar(255) DEFAULT NULL,
    `time` varchar(255) DEFAULT NULL);
    
    
  3. 如果数据库模式中已有表(数据、元数据和其他元数据),请执行以下更改表查询:
    用于更改数据表的SQL语句
    ALTER TABLE `data` CHANGE `owner` `owner` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
    
    用于更改元数据表的SQL语句
    ALTER TABLE metadata add markedForDeletion varchar(45) DEFAULT NULL
    
    
    如果已运行ALTER TABLE元数据添加查询,并且表中存在markedforDeletion列,则该元数据添加操作将失败。
    ALTER TABLE metadata add agreementId varchar(255) DEFAULT NULL,
    add nextSigners varchar(255) DEFAULT NULL,
    add eSignStatus varchar(45) DEFAULT NULL,
    add pendingSignID varchar(45) DEFAULT NULL,
    add agreementDataId varchar(255) DEFAULT NULL,
    add enablePortalSubmit varchar(45) DEFAULT NULL,
    add submitType varchar(45) DEFAULT NULL,
    add dataType varchar(45) DEFAULT NULL;
    
    
    ALTER TABLE `metadata` CHANGE `formPath` `formPath` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `formType` `formType` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `description` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `formName` `formName` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `owner` `owner` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `renderPath` `renderPath` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `showDorClass` `showDorClass` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `sling:resourceType` `sling:resourceType` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `profile` `profile` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `submitUrl` `submitUrl` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    CHANGE `xdpRef` `xdpRef` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
    
    
    用于更改附加元数据表的SQL语句
    ALTER TABLE `additionalmetadatatable` CHANGE `value` `value` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, CHANGE `key` `key` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
    
    
现在已配置示例实现,您可以使用它列表草稿和提交内容,同时将所有数据和元数据存储在数据库中。 现在,让我们在范例中了解数据和元数据服务的配置方式。

安装mysql-connector-java-5.1.39-bin.jar文件

对所有作者实例和发布实例执行以下步骤以安装mysql-connector-java-5.1.39-bin.jar文件:
  1. 导航 https://'[server]:[port]'/system/console/depfinder 到com.mysql.jdbc包并搜索。
  2. 在“导出依据”列中,检查包是否由任何捆绑导出。
    如果包未由任何包导出,请继续。
  3. 导航到并 https://'[server]:[port]'/system/console/bundles 单击“ 安装/更新”
  4. 击“选 择文件”并浏览以选择mysql-connector-java-5.1.39-bin.jar文件。 另外,选择 开始包 和刷 新包复选 框。
  5. 单击 安装或更新 。 完成后,重新启动服务器。
  6. ( 仅限Windows )关闭操作系统的系统防火墙。

表单门户数据和元数据服务的示例代码

以下zip包含数 FormsPortalSampleDataServiceImpl FormsPortalSampleMetadataServiceImpl 和元数据服务接口的和(实现类)。 此外,它包含编译上述实现类所需的所有类。

验证文件名的长度

Forms Portal的数据库实现使用其他元数据表。 表具有基于表的键和id列的组合主键。 MySQL允许最长255个字符的主键。 您可以使用以下客户端验证脚本验证附加到文件构件的文件名的长度。 附加文件时将运行验证。 当文件名大于150(包括扩展名)时,下面过程中提供的脚本会显示一条消息。 您可以修改脚本以检查其中是否有不同数量的字符。
请执行以下步骤来创 建客户端库 ,并使用该脚本:
  1. 登录CRXDE并导航到/etc/clientlibs/
  2. 创建cq:ClientLibraryFolder 类型的节点 ,并提供该节点的名称。 For example, validation .
    单击“ 全部保存 ”。
  3. 右键单击节点,单 击新建文件 ,然后创建扩展名为。txt的文件。 例如,将 js.txt 以下代码添加到新创建的。txt文件,然后单击“全 部保存”
    #base=util
     util.js
    
    
    在上面的代 util 码中,是文件夹的名称 util.js 和文件夹中的文件的 util 名称。 文件 util 夹和文 util.js 件是按照以下步骤创建的。
  4. 右键单击在步骤2 cq:ClientLibraryFolder 中创建的节点,选择“创建”>“创建文件夹”。 创建名为的文件夹 util 。 单击“ 全部保存 ”。 右键单击文件夹, util 选择“创建”>“创建文件”。 创建名为的文件 util.js 。 单击“ 全部保存 ”。
  5. 将以下代码添加到util.js文件,然后单击“全 部保存” 。 代码验证文件名的长度。
    /*
     * ADOBE CONFIDENTIAL
     * ___________________
     *
     * Copyright 2016 Adobe Systems Incorporated
     * All Rights Reserved.
     *
     * NOTICE:  All information contained herein is, and remains
     * the property of Adobe Systems Incorporated and its suppliers,
     * if any.  The intellectual and technical concepts contained
     * herein are proprietary to Adobe Systems Incorporated and its
     * suppliers and may be covered by U.S. and Foreign Patents,
     * patents in process, and are protected by trade secret or copyright law.
     * Dissemination of this information or reproduction of this material
     * is strictly forbidden unless prior written permission is obtained
     * from Adobe Systems Incorporated.
     *
     */
    (function () {
        var connectWithGuideBridge = function (gb) {
            gb.connect(function () {
                //For first time load
                window.guideBridge.on("elementValueChanged" , function(event, payload) {
            var component = payload.target; // Field whose value has changed
                    if(component.name == 'fileAttachment' && component.parent) {
                        var fileItems = $('#'+payload.target.parent.id).find(".guide-fu-fileItem");
                        for (i = 0;i<fileItems.length;i++) {
                            var filename = $(fileItems[i]).find(".guide-fu-fileName").text();
                            //check whether it is previously attached file or a newly  attached one
                            if(filename.length > 150 && filename.indexOf("fp.attach.jsp") < 0) {
                                window.alert("filename is larger than 150 : "+filename);
                                 $(fileItems[i]).find(".guide-fu-fileClose.close").click();
                            }
                        }
                    }
    
       });
            });
        };
    
        if (window.guideBridge) {
            connectWithGuideBridge(window.guideBridge);
        } else {
            window.addEventListener("bridgeInitializeStart", function (event) {
                connectWithGuideBridge(event.detail.guideBridge);
            });
        }
    })();
    
    
    此脚本适用于开箱即用(OOTB)附件构件组件。 如果已自定义OOTB附件构件,则更改上述脚本以合并各项更改。
  6. 将以下属性添加到在步骤2中创建的文件夹,然后单击“全 部保存”
    • 名称: 类别
    • 类型: 字符串
    • 值: fp.validation
    • 多选项: 已启用
  7. 导航到 /libs/fd/af/runtime/clientlibs/guideRuntime 嵌入属 fp.validation 性并附加该值。
  8. 导航到/libs/fd/af/runtime/clientlibs/guideRuntimeWithXFA并将值附 fp.validation 加到embed属性后。
    如果您使用的是自定义客户端库,而不是guideRuntime和guideRuntimeWithXfa客户端库,请使用类别名将在此过程中创建的客户端库嵌入到运行时加载的自定义库中。
  9. 单击“ 全部保存”。 现在,当文件名大于150(包括扩展名)字符时,将显示一条消息。