有没有办法在 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 的版本