【问题标题】:AEM Workflow - set values in a custom dialog from with data gathered in previous process stepAEM Workflow - 在自定义对话框中设置值,使用在先前流程步骤中收集的数据
【发布时间】:2024-01-05 23:33:01
【问题描述】:

我的总体目标是:启动一个流程步骤,该流程步骤运行一个收集列表的 java 类,然后在下一个工作流程步骤中,该列表需要显示在自定义对话框中。

这是我目前所拥有的:

  • 使用元数据 put 并将列表保存到元数据中的 Java 类
  • 使用文本区域创建的自定义对话框是需要显示此列表的位置
  • 另一个检索从元数据中获取列表的 Java 类

我现在遇到的问题是:如何从元数据中获取列表以显示在我的自定义对话框中?

我找了很久,好像从来没有人做过

【问题讨论】:

  • 你能分享你到目前为止所做的包和源代码吗?或者更简单的版本?我相信我可能有办法做到你的要求,但我想先测试一下。
  • 我暂时没有写什么特别的东西,这是一个概念证明,我们只是想看看它是否可能。 2个java文件,一个使用put workItem.getWorkflowData().getMetaDataMap().put("referencingList", "testValueForDialog");,另一个使用get:String value = workItem.getWorkflowData().getMetaDataMap().get("referencingList", java.lang.String.class);
  • 应该是可能的,花岗岩 UI 小部件为组件填充的方式实际上是通过从预先填充的请求属性中获取值,即“granite.ui.form.values”。因此,基本上,如果您在值映射中设置所有值并将其设置为请求属性“granite.ui.form.values”,然后再处理任何花岗岩小部件,您将有效地预填充对话框。如果你能产生一个骨架工作流,我可以把它变成一个工作的形状。

标签: adobe aem


【解决方案1】:

请注意:此答案是在 AEM 6.3 上测试和开发的

这是一个简单的花岗岩 UI 小部件,用于显示当前工作流程 MetaDataMap 中的所有键/值对(包括在之前的工作流程步骤中设置的那些)

首先,让我们创建工作流对话框:

在apps下创建组件:/apps/so-wf-test/wf-components/wf-metadata

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" 
    componentGroup=".hidden"
    jcr:primaryType="cq:Component"
    jcr:title="A dummy component needed for the dialog"
    sling:resourceSuperType="foundation/components/parbase"/>

创建对话框:/apps/so-wf-test/wf-components/wf-metadata/cq:dialog

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
    jcr:primaryType="nt:unstructured"
    jcr:title="Display all workflow metadata"
    sling:resourceType="cq/gui/components/authoring/dialog">
    <content
        jcr:primaryType="nt:unstructured"
        sling:resourceType="granite/ui/components/foundation/container">
        <layout
            jcr:primaryType="nt:unstructured"
            sling:resourceType="granite/ui/components/foundation/layouts/fixedcolumns"/>
        <items jcr:primaryType="nt:unstructured">
            <columns
                jcr:primaryType="nt:unstructured"
                sling:resourceType="granite/ui/components/foundation/container">
                <items jcr:primaryType="nt:unstructured">
                    <metadataList
                       jcr:primaryType="nt:unstructured"
                       sling:resourceType="/apps/so-wf-test/wf-granite-widgets/wf-metadata-list"/>
                </items>
            </columns>
        </items>
    </content>
</jcr:root>

请注意,上面的对话框包含一个自定义花岗岩小部件以显示元数据列表:&lt;metadataList jcr:primaryType="nt:unstructured" sling:resourceType="/apps/so-wf-test/wf-granite-widgets/wf-metadata-list"/&gt;

现在花岗岩小部件 JSP

创建吊索文件夹:/apps/so-wf-test/wf-granite-widgets/wf-metadata-list

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
    jcr:primaryType="sling:Folder"/>

在里面创建wf-metadata-list.jsp:

这可以通过使用 API 或带有 HTL 的吊索模型或通过 servlet 来完成。出于此答案的目的,我使用 JSP 寻求快速解决方案。

<%@include file="/libs/granite/ui/global.jsp"%><%
%><%@page import="com.adobe.granite.workflow.WorkflowSession,
                  com.adobe.granite.workflow.exec.WorkItem,
                  com.adobe.granite.workflow.exec.WorkflowData,
                  com.adobe.granite.workflow.metadata.MetaDataMap,
                  org.slf4j.Logger,
                  org.slf4j.LoggerFactory"%>
<%
    // get a logger
    Logger logger = LoggerFactory.getLogger(this.getClass());

    // when a workflow dialog is requested, the workitem id is passed as an attribute "item"
    String workitemId = request.getParameter("item");

    // get workflow session
    WorkflowSession wfSession = resourceResolver.adaptTo(WorkflowSession.class);

    // get the current workitem
    WorkItem workitem = wfSession.getWorkItem(workitemId);

    // get workflow data
    WorkflowData workflowData = workitem.getWorkflowData();

    // get metadata map 
    MetaDataMap metaDataMap = workflowData.getMetaDataMap();

%>
    <h1>MetaDataMap Values:</h1>
<ul>
    <% 
       // Iterate over metaDataMap and print all key/val pairs to a list item
       for (Object entry : metaDataMap.keySet())
       {
          Object objVal = metaDataMap.get(entry);
          String val =  objVal == null ? "" : objVal.toString();
          
          %>
        <li><h3><%=entry%>:  <%=val%></h3></li>
          <%
       }
    %>
</ul>

** 现在只需将对话框连接到您的对话框工作流程步骤 ** 使用路径/apps/so-wf-test/dialogs/wf-dialog/cq:dialog"

一旦工作流到达对话步骤,您将看到元数据项列表。

示例:

我创建了一个具有简单步骤的工作示例

  • 第 1 步:将 "someKey"="SOME VALUE" 添加到 MetaDataMap
  • 第 2 步:获取 "someKey" 并打印出来
  • 第 3 步:指向上方对话框的对话框步骤

这是对话框的截图:

这是一个你可以下载和安装的包

https://drive.google.com/file/d/0B-_At1NXpw0EOFNaUVdYcGVHNnM/view?usp=sharing&resourcekey=0-a_8b0SoC25dxwTTCHw2vRg

【讨论】:

  • 嘿@Ahmed,你知道如何在MetaDataMap 中设置自定义对象(Asset 对象)吗?因为我做不到,我只能包含字符串。
  • @Phoenix_uy 此解决方案显式返回下拉列表的字符串。在您的情况下,我会将资产路径添加到下拉项值中,然后在下一步 wf 步骤中从路径中解析该资产。
  • @AhmedMusallam 我的解决方案只是显示未发布的资产,这就是为什么我在第一个工作流程步骤中将资产设置在列表中,而在第二个中我想在自定义中显示这些图像对话框.. 无法在 MetaDataMap 中发送自定义对象?
  • 我可能错过了你的观点......但如果你只想显示资产图像,那么只需将资产路径添加到 MetaDataMap。然后从路径解析该资产并将&lt;img src="path/to/my/asset/image"/&gt; 添加到标记以显示该资产。另外,您是否尝试过简单的 POJO 而不是 Asset?
  • 在 AEM 中引用上一个工作流步骤中引入的数据的困难令人愤怒。