有没有办法在 Liferay 中获取工作流提交的表单字段?

Posted

技术标签:

【中文标题】有没有办法在 Liferay 中获取工作流提交的表单字段?【英文标题】:Is there a way to get the fields of a form submitted by workflow in Liferay? 【发布时间】:2021-03-25 21:32:39 【问题描述】:

我正在使用 Liferay 7.2。

我正在尝试通过工作流程获取通过通知发送给用户的表单字段,它是由 liferay 创建的表单(内容和数据 -> 表单)。我开发了以下代码:

    import com.liferay.portal.kernel.util.GetterUtil;
    import com.liferay.portal.kernel.workflow.WorkflowConstants;
    import com.liferay.portal.kernel.workflow.WorkflowHandler;
    import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
    import com.liferay.asset.kernel.model.AssetCategory;
    import com.liferay.asset.kernel.model.AssetEntry;
    import com.liferay.asset.kernel.model.AssetRenderer;
    import com.liferay.asset.kernel.model.AssetRendererFactory;
    import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil;
    import com.liferay.dynamic.data.mapping.kernel.DDMForm;

    import java.util.List;

    String className = (String)workflowContext.get(
        WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME);

    WorkflowHandler workflowHandler =
        WorkflowHandlerRegistryUtil.getWorkflowHandler(className);

    AssetRendererFactory assetRendererFactory =
        workflowHandler.getAssetRendererFactory();

    long classPK =
        GetterUtil.getLong((String)workflowContext.get
        (WorkflowConstants.CONTEXT_ENTRY_CLASS_PK));

    AssetRenderer assetRenderer =
        workflowHandler.getAssetRenderer(classPK);

    AssetEntry assetEntry = assetRendererFactory.getAssetEntry(
        assetRendererFactory.getClassName(), assetRenderer.getClassPK());

    List<AssetCategory> assetCategories = assetEntry.getCategories();
    returnValue = "Default Review";
    System.out.println(assetCategories);
    System.out.println(assetEntry);
    System.out.println(assetRenderer.getAssetObject());
    

输出是,但我看不到字段在哪里:

[]

entryId=56712, groupId=11555, companyId=11552, userId=11561, userName=Test Test, createDate=Tue Dec 15 08:30:19 GMT 2020, modifiedDate=Tue Dec 15 08:30:19 GMT 2020, classNameId=33012, classPK=56708, classUuid=ab012e7a-12387-a7b1-4481-44ab98a6a123, classTypeId=0, listable=true, visible=true, startDate=null, endDate=null, publishDate=null, expirationDate=null, mimeType=text/html, title=Form Record for Form: Send email, description=, summary=, url=, layoutUuid=, height=0, width=0, priority=0.0, viewCount=0

mvccVersion=1, uuid=ab012e7a-12387-a7b1-4481-44ab98a6a123, formInstanceRecordId=56708, groupId=11555, companyId=11552, userId=11561, userName=Test Test, versionUserId=11561, versionUserName=Test Test, createDate=Tue Dec 15 08:30:19 GMT 2020, modifiedDate=Tue Dec 15 08:30:19 GMT 2020, formInstanceId=65521, formInstanceVersion=1.46, storageId=40512, version=1.0, lastPublishDate=null

形式为:

我想我已经接近了,但我仍然无法访问表单字段。在这种情况下,我想获得“电子邮件”字段。 你可以帮帮我吗?非常感谢!

【问题讨论】:

【参考方案1】:

不幸的是,您必须更深入地研究 API,但看起来您走在正确的道路上:

assetRenderer.getAssetObject() 揭示了一个看起来非常像与形式相关的对象,但它不会是一个包含所有你期望的 getter 和 setter 的单个 bean:它们在编译时是未知的,因此你将拥有用它来查询它的属性。

如果您查看assetRenderer.getAssetObject().getClass().getName(),您会发现手头有什么,并且可以根据其接口(以及表单字段的相关 API)进一步挖掘。

我没有在代码级别使用过表单,所以我无法提供完整的解决方案。也许其他人会这样做,但在此之前你有一个寻找的方向。

【讨论】:

感谢您的回答!我做了:System.out.println(assetRenderer.getAssetObject().getClass()); System.out.println(assetRenderer.getAssetObject().getClass().getName()); 因为我想看看它给了我什么变量,以及它是否给了我字段的值。输出为:class com.liferay.dynamic.data.mapping.model.impl.DDMFormInstanceRecordImpl com.liferay.dynamic.data.mapping.model.impl.DDMFormInstanceRecordImpl。我会继续调查,如果您有任何建议,我会很高兴听到他们的意见。再次非常感谢您。 谢谢!正是通过这种方式来实现表单域的价值。值:assetRenderer.getAssetObject().getDDMFormValues().getDDMFormFieldValues()[0].getValue().getString(Locale.ENGLISH) 和字段名称:assetRenderer.getAssetObject().getDDMFormValues().getDDMFormFieldValues().get(0).getDDMFormField().getName()

以上是关于有没有办法在 Liferay 中获取工作流提交的表单字段?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式获取在 Liferay 7.2 中部署的 Portlet 列表

从 Gogo Shell,获取 com.liferay.portal.kernel 的版本

liferay6关于liferay中使用requestMapping映射地址提交表单

Liferay 获取组织角色的所有用户(按组织角色名称)

有没有办法从 BigQuery 的表中获取所有列的不同值?

CustomSQLUtil 在使用 Liferay 7 进行查询检索期间获取空值