构建向导以编辑单个对象
目标
您需要开发一个向导,以允许用户编辑 Windchill 业务对象的属性并更新数据库中的对象。
背景
对象编辑向导通常由标记为“编辑”或“检出并编辑”的操作启动。
开发用于编辑业务对象的向导与开发创建该业务对象的向导的过程非常相似。您要使用的许多组件都是相同的。但是,创建向导和编辑向导之间存在一些不同之处,其中一些需要不同的组件或不同的组件配置。具体差异如下:
• 编辑向导不允许用户更改对象的容器上下文、拥有组织、文件夹位置或类型
• 某些编辑向导不允许用户更改对象主数据的标识属性 (例如:名称和/或编号)。此类更改必须通过“重命名”或“编辑公用属性”客户端进行。其他主属性也可能不可编辑。
• 如果正在编辑的对象是可用的,且在启动编辑向导时用户未将其检出,则向导应自动检出该对象。
• 编辑向导中的属性输入字段预先填充了对象数据库中存在的值,而不是在 Java 类或“属性”和“类型和属性管理”实用程序中定义的默认值。
• 可操作项的编辑向导具有不同的导航按钮。它们具有“保存和检入”按钮,而不是“确定”按钮。前者将更改保存到对象的工作副本,而无需检入或迭代。后者创建并检入对象的新的小版本。此外,“取消”按钮会弹出一条消息,提醒用户对象将保持检出状态。
可专门用于编辑的组件如下:
• 多个向导共用的向导步骤的 jsp 和 jspf 文件
• 用于管理向导数据和在页面上显示元素的自定义 HTML 标记
• 用于在用户提交向导后处理向导数据的 Java 类
范围/适用性/假设
本节假设您已创建自定义可持续业务对象类或子类型,并且您希望开发一个允许用户编辑该对象类型的某个实例的属性的向导。
本文档中的信息适用于编辑可操作和不可操作对象以及类型化和未类型化的对象。
本文档介绍了大多数 Windchill 编辑向导所基于的可重用公用组件。如果自定义类型扩展了现有 Windchill 业务类 (如 WTPart、WTDocument 或 WTChangeIssue),则可能会有一些更特定于这些类的组件,可使用或应使用这些组件来代替此处所述的组件。这些特定于类的组件是基于本文档中所述的公用组件而构建的。对于这些特定于类的组件的讨论超出了本文档所述的范围。
请注意,您不一定需要开发自己的向导来编辑自定义类型的实例。如果您的类型是 Windchill 业务类 (例如 WTPart、WTDocument 或问题报告 (WTChangeIssue)) 的模型化或可变子类型,则可以使用预设编辑向导来实现您的目的。预设向导将自动在“设置属性”步骤中显示自定义子类型的不可变属性和全局属性的输入字段。
表格中的属性将按如下方式排序:
• JSP 文件中列出的预设属性
• 自定义模型化属性,按显示名称的字母顺序排序
• 自定义全局属性,按显示名称的字母顺序排序
如果要对此步骤中的属性进行另一种排序或需要此步骤中的其他字段,则需要在此步骤中专为子类型创建新的 jsp。不过,您仍可使用“编辑部件”向导。
如果要将其他步骤添加到现有向导,则需要开发自定义向导,但可以重新使用现有向导的多个步骤/组件。
预期结果
向产品中添加一个或多个步骤 HTML 向导,以允许用户更新数据库中的业务对象。向导中的步骤安排和属性显示应与其他 Windchill 向导类似,以提供一致的用户体验。
解决方案
使用建立在 jsp 向导框架之上的通用 jsp、标记、JavaScript 和 Java 类组件创建向导,用于捕获用户输入、处理该输入并在数据库中创建对象。
必备知识
要实现此目标,您需要熟悉
构建向导以创建单个对象主题,尤其是“必备知识”一节。
解决方案元素
元素
|
类型
|
说明
|
标记
|
autoCheckOutItem
|
Tag
|
如果对象尚未检出,则将其检出到当前用户。在工作副本中添加一个对象参考,作为当前 HTTPRequest 的属性、NmCommandBean 的 HTTPRequestData 参数映射中的参数,以及作为 DOM 中的隐藏字段。工作副本值的键为 CreateAndEditWizBean.WORKING_COPY_REF_PARAMETER_NAME。
此标记应放在向导的主 JSP 中,紧跟在 initializeItem 标记的正下方。
标记库:<Windchill>\codebase\WEB-INF\tlds\workinprogress.tld
标记处理程序:com.ptc.windchill.enterprise.wip.tags.AutoCheckOutObjectTag
|
Bean
|
CreateAndEditWizBean
|
Java 类
|
如果包括 includeWizBean jspf 文件,则此 bean 可用于您的 jsp。它具有向导数据的 getter 方法,例如操作 (创建或编辑) 和工作副本对象参考。
|
Java 类
|
|
您可以使用下面的类来帮助创建和处理向导。这些类位于 <Windchill>\codebase\WEB-INF\lib\wncWeb.jar 文件中。
|
CreateAndEditModelGetter
|
Java 类
|
可通过 getModel 标记进行调用以在编辑向导中为特性面板和属性表生成数据的类。
|
DefaultEditFormProcessor
|
Java 类
|
可使用或扩展以处理不可操作对象的向导表单数据的类。拓展 DefaultObjectFormProcessor。
|
EditWorkableFormProcessor
|
Java 类
|
可使用或扩展以处理可操作对象的向导表单数据的类。拓展 DefaultObjectFormProcessor。
|
过程 - 创建编辑向导
要创建向导,需要执行以下任务:
• 为向导创建操作 (必需)。
• 为向导创建主 jsp (必需)。
• 根据需要创建自定义步骤
• 选择可重用步骤
根据需要显示的任务始终为必需。根据向导的要求,可能还需要其他任务,也可能不需要。
如果向导中存在无法通过标准 Windchill dataUtilties、GUI 组件和呈现器显示的属性,则可能还需要为这些函数编写 Java 类。
为向导创建操作
启动向导时需要执行某一操作。此任务非常类似于为创建向导创建操作。唯一的区别在于,在命令标记的类属性上指定的表单处理器通常是“解决方案元素”一节中所列的处理器之一,或是其中一个类的子类。
有关此操作的可用选项的详细信息,请参阅
Windchill 客户端体系结构向导中的“<action>.xml 属性”部分。简单的操作可能如下所示:
<objecttype name="FakeLiterature">
<action name="editLiterature">
<command class="com.ptc.core.components.forms.EditWorkableFormProcessor"
method="execute"
url="netmarkets/jsp/carambola/customization/examples/
wizard/exampleLiteratureEdit.jsp"
windowType="popup"/>
</action>
</objecttype>
建议将操作 (和主向导 jsp 文件) 命名为 "edit"。如果基于启动点或其他条件的 objecttype 有多个编辑操作,请为操作名称添加一个后缀以对其进行限定,如下所示:
editFrom<启动页面或表格>
|
例如:editFromAttributesTable
|
edit<正在编辑的属性子集的名称>
|
例如:editAnnotations
|
将此操作添加到操作模型,以便可在 Windchill 系统中对其进行访问。
为向导创建主 jsp
接下来,创建用于描述编辑向导的 jsp。至少,通常只需将一个步骤用于编辑属性。有关编辑属性步骤高级配置的详细信息,请参阅
自定义可重用向导步骤。
<%-- This wizard is an example of using a read-only attributes panel in
an Edit wizard. --%>
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ include file="/netmarkets/jsp/components/includeWizBean.jspf"%>
<%@ taglib prefix="jca"
uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ taglib prefix="wip"
uri="http://www.ptc.com/windchill/taglib/workinprogress"%>
<%-- This tag checks out the document and sets magical form inputs
and data on the command bean. This makes sure that the command
bean's get oid methods return the oid of the working copy. --%>
<wip:autoCheckOutItem />
<jca:initializeItem operation="${createBean.edit}"/>
<jca:wizard buttonList="EditWizardButtons"
helpSelectorKey="DocMgmtDocEdit"
title="Example Literature Edit with Attribute Panels">
<jca:wizardStep action="editAttributesWizStep"
type="object" embeddedHelp="This is an example of a
simple Edit wizard. This wizard demonstrates how to
change the attributes in the read only
attribute panel."/>
</jca:wizard>
<%@include file="/netmarkets/jsp/util/end.jspf"%>
AutoCheckOutItem 标记
如果目标对象是可操作对象,并且您的向导可针对尚未通过“检出并编辑”或其他操作检出的对象启动,则应将主 jsp 中的 autoCheckOutItem 标记包括在 initializeItemTag 的正下方。
<%@ taglib prefix="wip"
uri="http://www.ptc.com/windchill/taglib/workinprogress"%>
...
<wip:autoCheckOutItem/>
在打开向导之前,此标记会将对象检出到当前用户。
按钮集
通常,用于编辑可操作对象的向导将使用以下两个按钮集之一:
• "EditWizardButtons" (多步向导)
• "NoStepsEditWizardButtons" (单步向导)
其中包括“保存和检入”按钮。
编辑 nonWorkable 对象时,通常使用以下其中一项:
• DefaultWizardButtonsNoApply (多步向导)
• NoStepsWizardButtons (单步向导)
这些项都是在 <Windchill>/codebase/config/actions/actionmodels.xml. 中定义的
根据需要创建自定义步骤
也可以使用
向导处理和
构建向导以创建单个对象中所述的方法为编辑向导创建自定义步骤。
选择可重用步骤
在“为向导创建主 jsp”一节中,我们已经选择了可重用步骤来编辑对象属性。有关自定义此步骤的详细信息,以及有关所提供的其他可重用步骤的信息,请参阅
自定义可重用向导步骤。
自定义点
创建表单处理器和表单处理器委派
编辑向导可使用两个表单处理器类:
com.ptc.core.components.forms.DefaultEditFormProcessor - for nonWorkable objects
com.ptc.core.components.forms.EditWorkableFormProcessor- for Workable objects
这些类可能会根据需要进行扩展以满足您的需求。
这两个处理器都会执行以下操作:
preProcess() 方法
• 除了会为持续对象创建 TypeInstance 外,与 preprocess() 的 CreateObjectFormProcessor 方法相同
doOperation() 方法
• 调用 super.doOperation() 以调用针对向导注册的任何 FormProcessorDelegates 的 doOperation() 方法
• 调用 PersistenceHelper.manager.save() 以将可持续对象存储在数据库中
setResultNextAction() 方法已停用。相反,FormProcessor 应返回受操作影响的 OID 列表 (如果存在),并让 UI 请求中显示的组件根据需要从服务器进行更新。
如果要扩展现有 Windchill 业务类的可变类型,可能存在特定于该类的处理器,您应使用或扩展该处理器,而不是 DefaultEditFormProcessor 或 EditWorkableFormProcessor。如下表所示。有关这些类的行为的详细信息,请参阅其相关 javadoc。
如果扩展类: | 使用处理器类: |
---|
WTChangeIssue | com.ptc.windchill.enterprise.change2.forms.processors.EditProblemReportFormProcessor |
WTChangeRequest2 | com.ptc.windchill.enterprise.change2.forms.processors.EditChangeRequestFormProcessor |
WTChangeOrder2 | com.ptc.windchill.enterprise.change2.forms.processors.EditChangeNoticeFormProcessor |
WTChangeActivity2 | com.ptc.windchill.enterprise.change2.forms.processors.EditChangeTaskFormProcessor |
WTVariance | com.ptc.windchill.enterprise.change2.forms.processors.EditVarianceFormProcessor |
如果提供的表单处理器之一满足您的需求,则不需要编写自己的处理器,而只需将处理器指定为向导操作命令子标记的 class 属性值即可。如果这些表单处理器无法满足您的需求,则应编写其中一个表单处理器的子类来处理向导表单数据。有关可能需要实现用户自己的
processor.netmarkets/jsp/components/beginWizard.jspf 情况的示例,请参阅
构建向导以创建单个对象中的“创建表单处理器和表单处理器委派”一节。
如果创建自己的处理器,请注意,每个向导步骤后的标准验证器类将调用其 preProcess() 方法。确保您未修改此方法中的数据库。
示例代码
编辑产品向导的主 JSP
文件名:<Windchill>\codebase\netmarkets\jsp\product\editProductWizard.jsp
注释:这是一个单步向导
<%@ page
import="com.ptc.windchill.enterprise.product.ProductClientRB"
%>
<%@ taglib prefix="jca"
uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ include
file="/netmarkets/jsp/components/includeWizBean.jspf"%>
<%@ include
file="/netmarkets/jsp/components/createEditUIText.jspf"%>
<%--> Get resource bundle. <--%>
<fmt:setLocale value="${localeBean.locale}"/>
<fmt:setBundle
basename="com.ptc.windchill.enterprise.product.productResource
Client" />
<fmt:message var="attributeStepLabel"
key="product.editProductAttributesWizStep.title" />
<jca:initializeItem operation="${createBean.edit}"/>
<jca:wizard buttonList="NoStepsWizardButtons"
helpSelectorKey="PDMAdminProdEdit_help">
<%-->
This step uses the common action definition. The JSP file for
the step is, however, product-specific and hooked up using
PartManagement-typedservices-properties.xconf
<--%>
<jca:wizardStep action="editAttributesWizStep" type="object"
label="${attributeStepLabel}"/>
</jca:wizard>
%@include file="/netmarkets/jsp/util/end.jspf"%
编辑部件向导的主 JSP
文件名:<Windchill>/codebase/netmarkets/jsp/part/edit.jsp
注释:
• 这可以是单步向导,也可以是多步向导,具体取决于安装的产品模块
• 说明如何包含“设置分类属性”和“设置附件”步骤。
• 此页面加载时,将调用 js 函数 "onloadEditPart"。如果部件已分类,则此函数将调用 "loadClassificationStep" 以加载分类步骤,并且可能会根据向导启动点执行某些其他 UI 配置。
<%@ page import="wt.content.ContentHolder" %>
<%@ page import="wt.access.AccessPermission" %>
<%@ page import="com.ptc.windchill.enterprise.attachments.server.AttachmentsHelper" %>
<%@ taglib prefix="jca" uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ taglib prefix="wip" uri="http://www.ptc.com/windchill/taglib/workinprogress"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt" prefix="fmt"%>
<%@ taglib prefix="wctags" tagdir="/WEB-INF/tags" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ include file="/netmarkets/jsp/components/includeWizBean.jspf"%>
<%-->
PartHelper.js below is required dynamically insert/remove the classification step
<--%>
<script language="JavaScript" src="netmarkets/javascript/part/PartHelper.js"></script>
<fmt:setBundle basename="com.ptc.windchill.enterprise.part.partResource"/>
<%--> Reuse the same labels as for create part <--%>
<fmt:message var="editAttributesWizStepLabel" key="part.createPartWizard.SET_ATTRIBUTES_WIZ_STEP_LABEL" />
<%
if (InstalledProperties.isInstalled(InstalledProperties.PARTSLINK)) {
%>
<jca:initializeItem operation="${createBean.edit}" attributePopulatorClass="com.ptc.windchill.partslink.part.forms.EditPartAttributePopulator"/>
<%} else { %>
<jca:initializeItem operation="${createBean.edit}"/>
<% } %>
<% if (request.getParameter("newInWorkspace") == null) { %>
<%--> The part is not new in workspace. Do autoCheckout <--%>
<wip:autoCheckOutItem/>
<% } %>
<% if ((request.getParameter("newInWorkspace") != null) || (request.getParameter("checkedOutInWorkspace") != null)) { %>
<script language="Javascript">newOrCheckedOutInWorkspace=true</script>
<% } %>
<%
boolean bPermit = false;
Object context = commandBean.getPageOid().getRef();
bPermit = (context instanceof ContentHolder) && AttachmentsHelper.hasPermission((ContentHolder) context, AccessPermission.MODIFY_CONTENT);
%>
<%-->If SoftwareLink, PartsLink, or PDMLink is installed then use button set with Back and Next buttons<--%>
<% if (InstalledProperties.isInstalled(InstalledProperties.PARTSLINK) ||
InstalledProperties.isInstalled(InstalledProperties.PDMLINK) ){ %>
<c:set var="buttonSet" value="EditWizardButtons"/>
<% } else { %>
<c:set var="buttonSet" value="NoStepsEditWizardButtons"/>
<% } %>
<% if (bPermit) { %>
<jca:wizard buttonList="${buttonSet}" helpSelectorKey="PartEdit_help">
<%-->
The type for the editAttributes step below
must be 'object' and not 'part'. This needs to be done so that
we pick up the common component action definitions for this
step.
Updated the editAttributes step type to 'part' for adding attachments step. B-91021
<--%>
<jca:wizardStep action="editAttributesWizStep" label="${editAttributesWizStepLabel}" type="part"/>
<jca:wizardStep action="setClassificationAttributesWizStep" type="classification"/>
<jca:wizardStep action="attachments_step" type="attachments" />
</jca:wizard>
<% } else { %>
<jca:wizard buttonList="${buttonSet}" helpSelectorKey="PartEdit_help">
<jca:wizardStep action="editAttributesWizStep" label="${editAttributesWizStepLabel}" type="part"/>
<jca:wizardStep action="setClassificationAttributesWizStep" type="classification"/>
</jca:wizard>
<% } // end if bPermit %>
<%--- If we are not DTI then add the applet for doing file browsing and file uploads --%>
<wctags:fileSelectionAndUploadAppletUnlessMSOI forceApplet='${param.addAttachments != null }'/>
<%-- It will load classificationHelper.js file which used for classification functionality --%>
<wctags:loadEditClassificationScript isMultiObject="false"/>
<wctags:initClassification enforceAutonamingRule="true" notifySimilarObject="true"/>
<script lang="Javascript">
PTC.onReady(onloadEditPartWizard);
PTC.onReady(initClassificationOnEditWizard);
</script>
<%@include file="/netmarkets/jsp/util/end.jspf"%>
更多资源
相关的包/类 Javadoc
com.ptc.core.components.forms.DefaultEditFormProcessor
com.ptc.core.components.forms.EditWorkableFormProcessor
另请参阅
构建向导以创建单个对象中的“示例代码”一节。