工作流组件
最近更新: 2025年3月24日
- 适用对象:
- Experience Manager 6.5
- 主题:
- 自适应表单
创建对象:
- 初学者
- 开发人员
工作流组件捕获与页面相关的信息,该页面列出诸如页面模板、组件资源类型和用于存储所生成页面的基本文件夹等资产。
工作流流程实施
以下Java代码与工作流组件关联。 代码将创建欢迎套件页面,并从工作流变量(submitterName和documentsSelected)中提取值。 然后,将这些值设置为页面中使用的组件的属性。 该代码还会设置工作流进程变量 welcomekiturl 的值。
package com.welcomekit.core.workflowprocess;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowData;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.commons.Externalizer;
import com.day.cq.commons.jcr.JcrUtil;
import com.day.cq.search.PredicateGroup;
import com.day.cq.search.Query;
import com.day.cq.search.QueryBuilder;
import com.day.cq.search.result.SearchResult;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.WCMException;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import static org.apache.sling.jcr.resource.api.JcrResourceConstants.*;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component
public class CreatePage implements WorkflowProcess {
private static final String WORKFLOW_WELCOME_KIT_PAGE_TEMPLATE_PATH = "WELCOME_KIT_PAGE_TEMPLATE_PATH";
private static final String WORKFLOW_WELCOME_KIT_COMPONENT_RESOURCE_TYPE = "WELCOME_KIT_COMPONENT_RESOURCE_TYPE";
private static final String WORKFLOW_ROOT_PAGE_PATH = "ROOT_PAGE_PATH";
String[] docummentNames = null;
@Reference
private QueryBuilder queryBuilder;
private Page createWelcomeKitPage(ResourceResolver resourceResolver, String welcomeKitId, String templatePath, String pageTitle) throws RepositoryException, WCMException {
final PageManager pageManager = resourceResolver.adaptTo(PageManager.class);
final Node node = JcrUtil.createPath(StringUtils.substringBeforeLast(welcomeKitId, "/"), NT_SLING_ORDERED_FOLDER, NT_SLING_ORDERED_FOLDER, resourceResolver.adaptTo(Session.class), false);
Page page = pageManager.create(node.getPath(), StringUtils.substringAfterLast(welcomeKitId, "/"), templatePath, pageTitle, true);
return page;
}
private < T > boolean persistData(WorkItem workItem, WorkflowSession workflowSession, String key, T val) {
WorkflowData data = workItem.getWorkflow().getWorkflowData();
if (data.getMetaDataMap() == null) {
return false;
}
data.getMetaDataMap().put(key, val);
workflowSession.updateWorkflowData(workItem.getWorkflow(), data);
return true;
}
private Resource findResourceByResourceType(Page page, String resourceType) throws RepositoryException {
final ResourceResolver resourceResolver = page.getContentResource().getResourceResolver();
final Map < String, String > map = new HashMap < > ();
map.put("path", page.getContentResource().getPath());
map.put("path.self", "true");
map.put("property", SLING_RESOURCE_TYPE_PROPERTY);
map.put("property.value", resourceType);
map.put("p.limit", "1");
final Query query = queryBuilder.createQuery(PredicateGroup.create(map), resourceResolver.adaptTo(Session.class));
final SearchResult result = query.getResult();
if (result.getHits().size() > 0) {
return resourceResolver.getResource(result.getHits().get(0).getPath());
} else {
return null;
}
}
private void updateComponentOnPage(Page page, String resourceType, String propertyName, String propertyValue) throws PersistenceException, RepositoryException {
final Resource resource = findResourceByResourceType(page, resourceType);
if (resource != null) {
final ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
if (propertyName.equalsIgnoreCase("paths")) {
properties.remove(propertyName);
String[] docummentNames = propertyValue.split(",");
properties.put(propertyName, docummentNames);
} else {
System.out.println("Finding resource type" + propertyName);
properties.remove(propertyName);
properties.put(propertyName, propertyValue);
}
}
}
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap) throws WorkflowException {
String docSelected = (String) workItem.getWorkflow().getWorkflowData().getMetaDataMap().get("documentsSelected");
String submitter = (String) workItem.getWorkflow().getWorkflowData().getMetaDataMap().get("submitter");
docummentNames = docSelected.split(",");
final ResourceResolver resourceResolver = workflowSession.adaptTo(ResourceResolver.class);
String templatePath = metaDataMap.get(WORKFLOW_WELCOME_KIT_PAGE_TEMPLATE_PATH, String.class);
String welcomeKitResourceType = metaDataMap.get(WORKFLOW_WELCOME_KIT_COMPONENT_RESOURCE_TYPE, String.class);
String rootPagePath = metaDataMap.get(WORKFLOW_ROOT_PAGE_PATH, "/content/welcome-kits");
// Get Asset Folder properties
final String welcomeKitId = rootPagePath + "/" + new SimpleDateFormat("yyyy/MM").format(new Date()) + "/" + UUID.randomUUID();
final String welcomeKitName = "Welcome Kit";
try {
// Get or create the press kit page
Page page = createWelcomeKitPage(resourceResolver, welcomeKitId, templatePath, welcomeKitName);
updateComponentOnPage(page, welcomeKitResourceType, "paths", docSelected);
updateComponentOnPage(page, "wcm/foundation/components/text", "text", "<p>Hello " + submitter + ".</p><p> Thank you for submitting your request. Please find the documents requested by you</p>");
resourceResolver.commit();
Externalizer externalizer = resourceResolver.adaptTo(Externalizer.class);
String myExternalizedUrl = externalizer.externalLink(resourceResolver, Externalizer.LOCAL, page.getPath()) + ".html";
persistData(workItem, workflowSession, "welcomekiturl", myExternalizedUrl);
} catch (WCMException | PersistenceException | RepositoryException e) {
throw new WorkflowException(String.format("Could not build Welcome Kit page for [ %s ]", "selected documents"), e);
}
}
}
Experience Manager
- 概述
- 应遵循的最佳实践
- 使用 AEM Author 设置 OKTA 身份验证
- 创建您的第一个自适应表单
- 表单提交处理
- 有用的集成
- 创建 OSGi 捆绑包
- 自适应表单
- 在 Windows 上安装 AEM Forms
- 在 Linux 上安装 32 位软件包
- 自适应表单中的预填服务
- 使用查询参数填充自适应表单
- AEM Forms 中的二维码
- 自适应表单中的自定义提交
- 自适应表单中的验证码
- 规则编辑器中的自定义函数
- 在网页中嵌入自适应表单
- 创建字符串数组
- AEM Forms 中的项目加载路径
- 在 OSGI 工作流中使用 XML 中的设置值
- 在 OSGI 工作流中使用 JSON 中的设置值
- AEM Forms 工作流中的发送电子邮件组件
- 使用 API 生成 DocumentOfRecord
- 显示内联图像
- 内联显示 DAM 图像
- 使用地理位置 API
- 使用交易报告
- AEM Forms 中的用户轮廓数据集成
- Microsoft Dynamics 与 AEM Forms
- 规则编辑器增强功能
- 限制对规则编辑器的访问
- 主题编辑器增强功能
- 表单编辑器增强功能
- 自适应表单的自动化测试
- 自适应表单的自动化测试
- 将 LDAP 与 AEM Forms 集成
- 在 AEM Forms 中使用服务用户
- 在自适应表单提交中标记和存储 DoR
- 使用表单数据模型服务调用的结果填充表格
- 捕获工作流程评论
- 将提交的表单数据存储在数据库中
- 在数据库中插入表单附件
- 修改数据源配置
- 覆盖表单数据模型属性
- AEM 6.4 工作流中的表单数据模型服务
- 处理表单数据模型服务步骤中的错误消息
- AEM 6.5.1 工作流中的表单数据模型服务
- 无数据源的表单数据模型
- 计算的表单数据模型元素
- 在 AEM Forms 中设置 JDBC 数据源
- 基于 JDBC 的表单数据模型
- 在表单数据模型中创建两个实体之间的关联
- 在规则编辑器中使用表单数据模型的调用服务
- 使用表单数据模型将二进制数据发布到 AEM DAM
- 创建可重复使用的工作流模型
- 自定义流程步骤 AEM 工作流
- 预填充 HTML5 表单
- 与 Salesforce 集成的表单数据模型
- 动态向选择组件添加项目
- 使用 ChatBot 填写 PDF 表单
- 基于核心组件的表单
- 选择并组装 DAM 文件夹内容
- 使用表单数据模型预填自适应表单
- UI 提示和技巧
- 自定义收件箱
- 电子邮件表单附件
- 使用数据和附件预填充表单
- 存储和检索自适应表单
- 从 pdf 文件导入数据
- 以 CSV 格式导出提交的数据
- HTML5 表单
- AEM Forms 和 Acrobat Sign
- 签署多个表单
- 自定义工作流步骤
- 自定义工作流组件
- AEM 工作流中的变量
- 审查表格数据
- 在 MySQL 数据库中存储和检索表单数据
- 提交 PDF 表单时触发 AEM 工作流
- 在提交移动表单时触发 AEM 工作流程
- 查询表单提交
- 在表单门户中列出自定义资产类型
- AEM Forms 与 Marketo
- AEM Forms 与 Adobe Campaign Standard 集成
- 欢迎套件
- Headless 表单 API
- 带有表单和 Acrobat Sign 的 React 应用程序
- 文档服务
- PDF 表单的类型
- 以自适应形式嵌入 PDF
- PDF 的轮播组件
- 在 AEM Forms 中使用组装服务
- 使用组装服务进行 XDP 拼接
- 在 AEM Forms 中使用监控文件夹
- 在 AEM Forms 中使用条形码服务
- 在 AEM Forms 中使用 PDFG 服务
- 使用权限密码加密 PDF
- 在 AEM Forms 中使用输出和表单服务
- 在输出服务中使用 xdp 片段
- 使用 ECMA 脚本生成包含片段的 PDF
- 从一个数据文件生成多个 pdf
- 在提交移动表单时生成 PDF
- 提交基于核心组件的表单时生成 PDF
- 从移动表单生成交互式 PDF
- 从自适应表单生成交互式 DoR
- 配置阅读器扩展凭据
- 将使用权限应用于 XDP 演绎版上的 PDF
- 将使用权限应用于上传的 PDF
- 认证文件
- 组合表单附件
- 实用的基础服务
- 表单设计器
- AEM Forms Workbench
- 印刷渠道的交互式通信
- 保存并检索草稿信件
- 交互式通信
- Web 渠道的交互式通信
- 疑难解答
- 文档服务:解决 DDX 相关问题的步骤
- 文档服务:解决 PDFA 转化问题的步骤
- 文档服务:如何调试表单和输出服务的字体相关问题
- 文档服务:如何为表单和输出服务嵌入字体
- 文档服务:如何启用性能日志来调试表单和输出服务
- 文档服务:如何增加转换大文件时的 Aries 事务超时时间
- 文档服务:如何使用 FormsIVS 和 OutputIVS 运行负载测试
- 文档服务:如何在 FormsIVS 和 OutputIVS 中更新自定义 XDP 和数据文件
- 文档服务:启用详细 ORB 跟踪的步骤
- 文档服务:调整 XMLFormService 的 bmc 池大小的步骤(第一部分)
- 文档服务:调整 XMLFormService 的 bmc 池大小的步骤(第二部分)
- 文档服务:在 JMX 控制台上调整参数的步骤
- 启用大型 XML 数据文件与模板的合并
- PDFG:如何更改 PDFG 中的事务超时
- PDFG:如何在 PDFG 中更新 CORBA 超时
- PDFG:如何更新 PDFG 中的超时
- PDFG:在 Windows 服务器 2016 中添加 PDFG 用户的步骤
- PDFG:检查并安装 32 位库及其依赖项的步骤
- PDFG:检查 Windows 服务器 2016 上的文件夹权限的步骤
- PDFG:在 Unix 上启用 strace 的步骤
- PDFG:安装所需的 32 位 Microsoft Visual C++ 可再发行组件的步骤
- PDFG:运行系统准备工具及解析输出结果的步骤
- PDFG:解决 Acrobat 特定问题的步骤
- PDFG:解决 Windows 上的 HtmltoPDF 问题的步骤
- PDFG:解决 Unix (PhantomJS) 上 HtmltoPDF 特定问题的步骤
- PDFG:解决 Unix(WebKit 转化)上 HtmltoPDF 特定问题的步骤
- PDFG:在 Unix 上排查多用户 PDFG 转化问题的步骤
- PDFG:在 Windows 上排查多用户 PDFG 转化问题的步骤
- PDFG:解决 Unix 上 OpenOffice 特定问题的步骤
- PDFG:解决 Windows 上 OpenOffice 特定问题的步骤
- 文档安全:如何在 Acrobat 中应用通过文档安全模块创建的策略
- 用户管理:如何在 AEM Forms JEE 中添加用户或群组
- 用户管理:如何增加 UM 会话超时时间
- 工作台:使用 https 连接工作台
- 工作台:通过帮助菜单收集工作台日志
- 工作台:如何启用工作台的调试输出
- 工作台:如何调整工作台内存参数
- 工作台:如何调整工作台性能参数
- 设计器:设计器对 C++ 可再发行组件的依赖
- 设计器:如何启用 HTML 预览
- 设计器:如何启用 PDF 预览
- 设计器:如何安装设计器补丁
- JEE Foundation:如何修改熵值
- JEE Foundation:如何更改 AEM Forms JEE 中任何服务的事务超时时间
- JEE Foundation:如何从作业管理器表中清除流程记录
- JEE Foundation:如何通过命令行运行流程清理
- JEE Foundation:手动引导的操作步骤
- JEE Foundation:捕获移动表单调试日志的步骤
- JEE Foundation:缓解 ForcedDisconnectException 的步骤
- 通用:如何为 JBoss 管理控制台添加管理用户
- 通用:如何捕获 HAR 日志
- 通用:如何在 Unix 服务器上捕获 JVM 的堆转储
- 通用:如何在 Windows 服务器上捕获 JVM 的堆转储
- 通用:如何捕获网络日志
- 通用:如何在 Unix 服务器上捕获 JVM 的线程转储
- 通用:如何在 Windows 服务器上捕获 JVM 的线程转储
- 通用:如何生成自签名证书
- 通用:如何从 HTML5 表单发起 Web 服务调用
- 通用:为 AEM Forms OSGI 中的任意类启用调试日志记录的步骤
- 通用:为 JBOSS 应用服务器中的任何类启用调试日志记录的步骤
- 通用:为 Websphere 应用服务器中的任何类启用调试日志记录的步骤
- 通用:为 AEM Forms OSGi 启用 SSL 的步骤
- 通用:加密 lc_turnkey.xml 中使用的密钥库密码的步骤
- 通用:Steps-to-reset-default-password-for-users-in-AEM-Forms-JEE
- 通用:Steps-to-reset-default-password-for-users-in-AEM-Forms-OSGI
- 通用:在群集中设置 gemfire 定位器并执行相关配置的步骤