构建向导以创建单个对象
目标
您需要开发一个向导来捕获用户输入,并通过该输入在数据库中创建一个 Windchill 业务对象。
背景
Windchill 提供用于创建向导和在向导步骤之间导航的框架。它还提供了用于在向导 JSP 中创建输入元素的数据实用程序、GUI 组件、呈现器和验证器。最后,它提供了一个框架,用于在提交向导表单时处理发送至服务器的数据。这些框架和组件将在“必备知识”一节中列出的其他文档中进行介绍。
本文档基于该信息构建,旨在描述如何开发和处理专门为创建 Windchill 对象而设计的向导。它将向您介绍如何使用系统预设组件作为构建块来创建您自己的向导。通常情况下,您会用到的组件包括:
多个向导共用的向导步骤的操作定义
多个向导共用的向导步骤的 jsp 和 jspf 文件
用于管理向导数据和在页面上显示元素的自定义标记
用于在用户提交向导后处理向导数据的 Java 类
范围/适用性/假设
假设您已创建自定义 Windchill 业务对象类或子类型,并且您想要开发一个向导,以帮助用户在数据库中创建该对象类型的实例。
要创建的对象应为可持续对象。实现 Typed、Foldered 和/或 Iterated 接口与否均可。当本文档引用的属性不适用于您的对象类型时,则正确的做法是忽略这些实现详情。
本文档介绍了如何创建一个用于创建对象的基本向导。系统预设了许多可复用步骤供您使用。有关将这些步骤添加到向导的详情,请参阅自定义可复用向导步骤
请注意,可能不需要您自行开发自定义向导来创建自定义类型的实例。如果类型是 Windchill 业务类,并且可使用具有类型选取器的向导,则可以针对该类型使用预设向导。预设向导将自动查找给定基本类型 (如 WTPart 或 WTDocument) 的子类和子类型,并在类型选取器中显示这些子类型,以便用户可以为其创建实例。例如,如果已创建名为 PBPart 的 WTPart 可变子类型,则它将按如下方式显示在“新建部件”向导中:
您需要在“类型和属性管理”实用程序布局中指定为子类型定义的任何非关联属性,以使其在非驱动属性表中显示为“输入”字段。属性将完全按照您在“类型和属性管理”实用程序中指定的方式显示在 UI 中。
如果希望以不同方式对此步骤中的属性进行排序,则需要为此步骤创建专用于您的子类型的新 jsp,但您仍可以使用“新建部件”向导。
但是,如果需要将其他对象关联到新对象或需要其他向导步骤,则可能需要开发自定义向导。
本文档介绍了开发用于创建单个对象的向导的过程。有关构造用于编辑对象的向导的信息,请参阅构建向导以编辑单个对象
预期结果
针对允许用户在数据库中创建业务对象的产品添加单步骤或多步骤 HTML 向导。向导中的步骤安排和属性显示应与其他 Windchill 向导类似,以提供一致的用户体验。
解决方案
使用建立在 jsp 向导框架之上的通用 jsp、标记、JavaScript 和 Java 类组件创建向导,用于捕获用户输入、处理该输入并在数据库中创建对象。
必备知识
要应用此过程,需要了解以下内容:
Java 编程
使用 JSP、自定义标记和 HTML 表单的基本 web 开发
如何创建可变 Windchill 业务对象类型。
有关创建子类型和属性的详情,请参阅使用“类型和属性管理”实用程序
使用操作来启动 jsp 页面和向导。
有关如何创建操作的信息,请参阅 Windchill 操作框架
Windchill 框架用于创建向导和处理向导数据。有关此主题的详情,请参阅构造向导
使用表格和特性面板在 UI 中显示信息以及获取适用于这些组件的数据的方法。有关详情,请参阅使用 Windchill JSP 框架自定义 HTML 客户端
Windchill 服务 API 或执行数据处理任务所需的其他 API 适用于向导
本节中所使用术语的定义
术语
定义
基本类型
作为向导类型选取器根类型的子类型类。如果向导没有类型选取器,则其为将要创建的对象类型。基本类型用于为不同子类型具有不同 jsp 变型的向导步骤查找正确的 JSP,直到用户选择特定类型为止。
依存属性
此属性的值和/或显示特征将由另一个属性的值 (称为“驱动属性”) 通过对象初始化规则 (OIR)、访问控制策略或其他机制完全或部分确定。
驱动属性
此属性的值通过对象初始化规则 (OIR)、访问控制策略或其他机制驱动另一个属性 (称为“依存”属性) 的值和/或显示特征。
对象类型
用于定义要创建的业务对象的属性和行为的 Java 类或子类型。
全局属性
Windchill 类型和属性管理 客户端中定义的对象属性。这些属性不是在 Java 业务对象类中定义,而是存储在数据库表中,与业务类的表分开存储。
子类型
使用“类型和属性管理”实用程序而不是在 Java 类中定义的对象类型。子类型可扩展其他可变类型,但其根类型均为不可变类型。
目标对象
将在向导中创建的对象。
解决方案元素
元素
类型
说明
JSP
以下 jsp 和 jspf 文件可用于创建和显示许多创建向导所共用的组件。除非另有说明,否则这些文件位于 <WT_HOME>/codebase/netmarkets/jsp/object<WT_HOME>/codebase/netmarkets/jsp/components 目录下。
createEditUIText
JSP 文件
包含创建和编辑向导通用的一些 UI 文本。
includeWizBean
JSP 文件
用于定义在生成访问向导数据的 jsp 页面期间调用的 CreateAndEditWizBean。
Bean
CreateAndEditWizBean
Java 类
如果包括 includeWizBean jspf 文件,则此 bean 可用于您的 jsp。它具有由 initializeItem 标记 (如操作、默认容器、基本类型等) 所设置的向导数据 getter 方法。
Javascript
validateCreateLocation
对于可从文件夹浏览器工具栏中启动的向导,可在向导操作的 onClick 参数上指定此 javascript 方法。此检查用于确保用户未选中多个文件夹,并且用户未选中非文件夹对象。如果出现上述任一情况,则会弹出错误消息。
位置:<WT_HOME>/codebase/netmarkets/javascript/util
Java 类
您可以使用下面的类来帮助创建和处理向导。这些类位于 <WT_HOME>/codebase/WEB-INF/lib/wncWeb.jar 文件中。
CreateAndEditModelGetter
Java 类
可通过 getModel 标记进行调用以在创建向导中为特性面板和属性表生成数据的类。
CreateObjectFormProcessor
Java 类
可使用或扩展此类来处理您的向导表单数据。扩展 DefaultObjectFormProcessor。
DefaultObjectFormProcessorDelegate
Java 类
可进行扩展以实现各种不同处理子任务的类。
ObjectBean
Java 类
此容器适用于特定于一个目标对象的表单数据且适用于所有对象通用的数据。提供用于检索关联对象的表单数据的方法。仅创建一个对象的向导将只有一个 ObjectBean。
FormResult
Java 类;在方法服务器和客户端中运行
此类用于在服务器处理器方法之间传递方法结果以及将方法结果从服务器传递到 WizardServlet。
用于自定义的模块化结构
<customizationRootDirectory>
├── configurations
│ ├── deploy.xml
│ ├── loadFiles
│ │ └── custom
│ │ ├── acmePart
│ │ │ └── WTPart_AcmePart.xml
│ │ └── loadFileSet.xml
│ └── xconf
│ └── custom.site.xconf
├── generated
│ └── BAC
│ └── CustomAcmePart\ 2023-02-27-09-17-27_PTC\ BAC\ Target_0000000001.zip
└── New-WizardModule
├── descriptor.xml
└── main
├── resources
│ └── Acme-actions
│ ├── AcmePartClient-actionmodels.xml
│ └── AcmePartClient-actions.xml
├── src
│ └── com
│ └── acme
│ ├── custompart
│ │ ├── CustomPartResource.java
│ │ └── forms
│ │ └── CreateCustomPartFormProcessor.java
│ └── wizard
│ └── mvc
│ └── builders
│ └── custompart
│ ├── AcmeCustomAttributesBuilder.java
│ └── CustomPartDefineItemAttributesWizStepBuilder.java
└── src_web
├── custom
│ └── newwizard
│ └── javascript
│ └── customWizard.js
├── netmarkets
│ └── jsp
│ ├── custom
│ │ └── custompart
│ │ ├── createCustomPartWizard.jsp
│ │ ├── createCustomPartWizardView.jsp
│ │ └── customDefineItem.jspf
└── WEB-INF
└── jsp
└── custom
└── newwizard
└── custompart
└── defineCustomItemAttributesWizStep.jsp
在开发环境中部署自定义
有关 CCD 部署过程的信息,请参阅在开发环境中部署自定义
准备要升级的 CCD 包
1. 导入针对此自定义导入 BAC 时所需的类型。例如,com.ptc.ptcnet.CustomType
2. 将导入的 zip 文件复制到 <customizationRootDirectory>/generated/BAC/ 目录下。
有关升级 CCD 进程的信息,请参阅部署代码和配置包
过程 - 创建向导
您需要执行以下任务来创建向导:
为向导创建操作
为向导创建主 jsp 文件
创建第一个自定义步骤
选择可复用步骤
为向导创建操作
您需要一个操作来启动新向导。有关此操作的可用选项的详情,请参阅向导处理。简单的操作可能如下所示:
<objecttype name="Novel">
<action name="create">
<command class="com.ptc.core.components.forms.CreateObjectFormProcessor"
method="execute"
url="netmarkets/jsp/carambola/customization/examples/wizard/
wizardExampleTwo.jsp"
windowType="popup"/>
</action>
</objecttype>
* 
如果您遵循操作的标准命名约定,并将 jsp 放在 <objecttype>\<actionname>.jsp 中,则不需要 url 参数。为避免与系统对象类型混淆,示例中假设的对象类型未遵循标准命名约定。
建议您将操作 (和主向导 jsp 文件) 命名为 "create"。如果根据启动点或其他条件,需要为 objecttype 设置多个创建操作,则可以为操作名称添加一个后缀以对其进行限定,如下所示:
createFrom<启动点>
示例:createFromWorkspace
create<对象类型>
示例:createSharedDocument
将此操作添加到操作模型,以便在系统中对其进行访问。
为向导创建主 jsp 文件
您需要创建一个描述创建向导的 jsp。首先,我们仅放入向导标记。如此指定的信息不足以让向导正常运行,但此时单击该操作,可看到向导处于“未结束”状态。
<%@ taglib prefix="jca" uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt" prefix="fmt"%>
<%@ 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"%>
<jca:wizard title="Create Literature">
</jca:wizard>
<%@include file="/netmarkets/jsp/util/end.jspf"%>
此时,如果您启动向导,则应该会看到内容为“没有可显示的有效操作”的消息,因为我们尚未定义任何步骤。
有关可对主向导 jsp 进行的自定义的详情,请参阅向导处理和“示例代码”。
创建第一个自定义步骤
自定义向导步骤也是由操作和 jsp 组成。
操作:
<action name="createNovelStep">
<label>Welcome to your Create Novel Wizard</label>
<command url="netmarkets/jsp/carambola/customization/examples/wizard/createNovelStep.jsp"
windowType="wizard_step"/>
</action>
初始 JSP 内容:Hello World。
更新 WizardTag 以包括您的步骤:
<jca:wizard title="Create Literature">
<jca:wizardStep action="createLiteratureStep" type="fakeLiterature"/>
</jca:wizard>
此时,您已创建一个简单向导,如果启动该向导,您应该会看到:
现在,您可以为单步骤向导开发自己的 jsp 文件,方法是使用与通用步骤 jsp 文件中相同的表格、特性面板和 javascript 组件。
选择可复用步骤
当无法针对您的对象类型使用某个预设向导时,仍可复用某些预设步骤。
在本示例中,我们将添加 defineItemAttributesWizStep 和附加步骤。有关适用于这些步骤的所有选项的完整详情,请参阅和自定义可重用向导步骤
更新 create.jsp 以包括以下步骤:
<%@ taglib prefix="jca" uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt" prefix="fmt"%>
<%@ 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"%>
<jca:initializeItem operation="${createBean.create}" baseTypeName=
"wt.doc.WTDocument|org.example.FakeLiterature"/>
<jca:wizard buttonList="DefaultWizardButtons" helpSelectorKey="AssignView_help"
title="Create Literature">
<jca:wizardStep action="createLiteratureStep" type="fakeLiterature"/>
<jca:wizardStep action="defineItemAttributesWizStep" type="object"/>
<jca:wizardStep action="attachments_step" type="attachments" />
</jca:wizard>
<%@include file="/netmarkets/jsp/util/end.jspf"%>
* 
对于 defineItemAttributesWizStep,我们还必须包括 initializeItem 标记,以设置将创建的类型。有关此标记以及使用此步骤时可用的其他选项的详情,请参阅自定义可重用向导步骤
此时,您的向导可以创建 FakeLiterature 对象。这一基本设置有很多变体。有关详情,请参阅下面的自定义、示例代码、自定义可重用向导步骤向导处理
自定义点
创建表单处理器和表单处理器委派
本节假设您已熟悉向导处理中所述的标准向导处理框架。
对于用于创建可持续对象的向导,可将类 com.ptc.core.components.forms.CreateObjectFormProcessor 用作默认表单处理器。您也可以根据需要对此类进行扩展,以达到特定目的。
CreateObjectFormProcessor 具有以下功能:
preprocess() method
提取所有具有特殊名称属性的 ObjectBean 表单数据。
为新对象创建 TypeInstance,将表单中的属性值应用到此对象,并根据针对“类型和属性管理”实用程序中的属性所定义的任何约束验证此值。
将 TypeInstance 转换为 Persistable,并将其设置为 ObjectBean 上的 "object" 属性
调用 super.preProcess() 以调用为向导注册的任何 FormProcessorDelegates 的 preprocess() 方法
doOperation() 方法
调用 super.doOperation() 以调用为向导注册的任何 FormProcessorDelegates 的 doOperation() 方法
调用 PersistenceHelper.manager.store() 以将可持续对象存储在数据库中
getSuccessFeedbackMessage() 方法 (由 setResultNextAction() 调用)
FormResult 为 SUCCESS 时,将调用此方法。这将构造 FeedbackMessage,有关配置消息内容的详情,请参阅“内联消息”。
对于单一对象创建,UI 中的内联消息如下所示:
对于多个对象创建,UI 如下所示:
请注意,CreateObjectFormProcessor 不会实现 postProcess() 或 postTransactionProcess() 方法,因此这两种方法将从 DefaultObjectFormProcessor 继承。有关详情,请参阅 Javadoc。
可能存在特定于预设模型化对象的处理器,您应该使用或扩展该处理器而非 CreateObjectFormProcessor。如下表所示。有关这些类的行为的详情,请参阅其相关 javadoc。
可变类型源自:
使用处理器类:
WTPart
如果创建从工作区启动的向导:
com.ptc.windchill.enterprise.part.forms.CreatePartFromWorkspaceFormProcessor
如果创建从“编辑结构”客户端启动的向导:
com.ptc.windchill.enterprise.part.forms.CreatePartFromTabularInputProcessor
所有其他单一对象创建向导:
com.ptc.windchill.enterprise.part.forms.CreatePartFormProcessor
WTDocument
用于通过模板创建文档:
com.ptc.windchill.enterprise.doc.forms.CreateDocFromTemplateFormProcessor
用于创建文档模板:
com.ptc.windchill.enterprise.doc.forms.CreateDocTemplateFormProcessor
对于所有其他单一对象创建向导:
com.ptc.core.windchill.enterprise.doc.forms.CreateDocFormProcessor
WTChangeIssues
com.ptc.windchill.enterprise.change2.forms.processors.CreateProblemReportFormProcessor
WTChangeRequest2
com.ptc.windchill.enterprise.change2.forms.processors.CreateChangeRequestFormProcessor
WTChangeOrder2
com.ptc.windchill.enterprise.change2.forms.processors.CreateChangeNoticeFormProcessor
WTChangeActivity2
com.ptc.windchill.enterprise.change2.forms.processors.CreateChangeTaskFormProcessor
如果所提供的任一表单处理器的行为可满足您的需求,则您无需编写自己的处理器,只需将该处理器指定为向导操作的命令子标记的类属性值即可。如果表单处理器不能满足您的需求,则应编写其子类来处理向导表单数据。请知悉,如果只是希望提供特殊代码来设置属性,则无需创建自有处理器。在这种情况下,只需编写一个 FormProcessorDelegate 来处理此任务。切记在隐藏的表单字段中注册 FormProcessorDelegate,并确保属性输入字段没有可被 CreateObjectFormProcessor 识别的特殊名称属性。
FormProcessorDelegate 应从 DefaultObjectFormProcessorDelegate 扩展。NumberPropertyProcessor 和 KeepCheckedOutDelegate 是预设的自定义 FormProcessorDelegates 示例。FormProcessorDelegates 的类结构如下所示。
如果您创建自己的处理器,请注意,每个向导步骤后的标准验证器类将调用其 preProcess() 方法。确保您未修改此方法中的数据库。
以下是一些较常见的用例,其中可能需要您编写自己的 ObjectFormProcessor 类以及需要改写某些方法以对其进行处理:
用例 1:需要在关闭向导时执行其他操作。
例如,您可能需要在向导关闭时加载新页面,而不是刷新启动页面。或者,也许您可以从多个位置点启动您的向导,并且在一个用例中,您需要刷新启动页面,而在另一个用例中,您需要加载新页面。
Solution:将预设处理器设置为子类,并改写 setResultNextAction 方法。在 NmCommand.getCompContext() 方法中,您可以获取有关向导启动上下文的信息。以下是如何为创建基线客户端执行此操作的示例:
String compContext = cb.getCompContext();
if (compContext != null) {
try {
NmContext compContextObj = NmContext.fromString(compContext);
Stack<NmContextItem> contextItems = compContextObj.getContextItems();
for (NmContextItem contextItem : contextItems) {
String action = contextItem.getAction();
if ("addToBaseline".equals(action) ||
"addToBaselineSingle".equals(action) ||
"addToBaselineStep".equals(action)) {

< set some next action >
}
}
.
.
.
请知悉,如果从表格启动您的向导,并且您已在向导操作中指定了 "ajax="row"",则必须对 FormResult 设置 refreshInfo 属性,以告知系统要刷新的行。通常,DynamicRefreshInfo 对象的属性如下所示:
action = NmCommandBean.DYNAMIC_ADD
oid = 所创建对象的 NmOid
location = 包含新行的表对象的 NmOid。通常,这会是一个文件夹。
如果已使用“页面”或“组件”的 ajax 属性,则无需设置 refreshInfo 属性。
有关详情,请参阅一章中的使用 Windchill JSP 框架自定义 HTML 客户端一节以及 FormResult 和 FormProcessingStatus 类的 javadoc。
用例 2:将对象持久化之后,您需要执行一些后处理。
例如,变更对象向导具有一个对话框,允许用户在创建后立即将对象提交至工作流。为此,用户需要在创建对象后执行另一操作。在某些情况下,可以通过为输入字段创建 ObjectFormProcessorDelegate,并对其执行 postProcess() 或 postTransactionProcess() 方法来处理此类需求,基础结构将自动调用该类。但是,在其他情况下,您可能更喜欢使用表单处理器来处理这种情况。例如,您无法控制 FormProcessorDelegates 的调用顺序,因此,如果需要进行操作排序,则必须在表单处理器中执行这些操作。
Solution:为 CreateObjectFormProcessor 设置子类并改写 (从 DefaultObjectFormProcessor 继承的) postProcess() 或 postTransactionProcess() 方法以执行操作。
(请知悉,如果您通过包括 keepCheckedOutCheckbox.jspf 文件在向导中放置“‘保持检出’复选框”,则 KeepCheckedOutDelegate 会自动处理此情况。您无需自行处理)。
用例 3:您需要使用特殊的 API 来持续化对象。
例如,变更对象将使用 StandardChangeService2 类进行持久化,除了可持久化对象外,该类还会处理某些生命周期和入夹任务。
Solution:为预设处理器设置子类,并改写 doOperation() 方法。在您的方法中,您不能调用超级方法,但仍应确保调用任何已注册 FormProcessorDelegates 的 doOperation() 方法。可通过调用从 DefaultObjectFormProcessor 继承的 processDelegates() 方法来完成此操作。例如:
FormResult doOperationResult = new FormResult();
doOperationResult.setStatus(FormProcessingStatus.SUCCESS);
doOperationResult = processDelegates (DO_OPERATION, clientData,
objectBeanList);
if (!continueProcessing(doOperationResult)) {
return doOperationResult;
}
try
{
< persist the object >
}
catch(WTException e)
{
< do error handling >
}
return doOperationResult;
请知悉,在大多数处理阶段中,将在表单处理器任务后调用委派,但在 doOperation 阶段,应在表单处理器执行任务前调用委派。目的是允许委派在所有属性均已设置但在对象持久化之前执行操作。
用例 4:需要以编程方式设置新对象的属性
您可能具有需要在对象未持久化且未显示在 UI 中时针对该对象设置的属性。
Solution:提供了用于处理此操作的其他方法。
创建 FormProcessorDelegate 并实现其 preProcess() 方法。在该方法中,在 ObjectBean 中设置对象的属性值。将隐藏的表单字段添加到您的向导 jsp 中,以指定您的委派名称,框架会自动对其进行实例化。例如:
<input type="hidden" name="
${createBean.formProcessorDelegateConstant}" value=" <path name
of your delegate
> ">
为预设处理器设置子类,并改写 preProcess() 方法。您可以调用超级类的 createItemInstance() 方法来为您创建可持续对象,然后针对可持续对象设置所需的属性。例如:
FormResult preProcessResult = new
FormResult(FormProcessingStatus.SUCCESS);
for (ObjectBean objBean: objectBeans) {
FormResult objectResult =
new FormResult(FormProcessingStatus.SUCCESS);
objBean.setObject(createItemInstance(clientData,
objBean, objectResult));
preProcessResult =
mergeIntermediateResult(phaseResult, objectResult);
if (!continueProcessing(preProcessResult)) {
return preProcessResult;
}
Object newObj = objBean.getObject();
< set additional attributes on the new object here>
}
// Call processDelegates() which will call registered
processor delegates
delegatesResult = processDelegates(DO_OPERATION,
clientData, objectBeanList);
preProcessResult =
mergeIntermediateResult(preProcessResult, delegatesResult);
if (!continueProcessing(preProcessResult)) {
return preProcessResult;
}
请知悉,已编写上面的示例,因此处理器可用于旨在创建多个对象的向导。
通常,最好使用委派方法而不是设置子类的方法来设置属性,因为将来可能会阻止对 CreateObjectFormProcessor preprocess() 方法做出任何修改。
限制
在布置 Windchill 对象创建向导的步骤和属性时,切记对象类型、容器上下文、组织上下文、文件夹位置、默认生命周期和新对象的其他属性之间的依存关系很重要。这些依存关系可能通过以下内容产生:
类型定义
对象初始化规则 (OIR)
访问控制策略 (ACL)
类型定义
许多向导允许用户创建从给定基本类型衍生而来的多个对象子类型之一。您可以在组织或站点级别的“属性”以及“类型和属性管理”实用程序中定义可变子类型和全局属性。这意味着,在显示可用对象类型列表并呈现全局属性的输入字段之前,必须知道对象的组织容器。此外,某些 Windchill 业务类型的默认类型由可在容器、组织和站点级别设置的首选项确定,因此这些也必须已知
访问控制策略
给定用户有权创建的对象类型由对象所属的管理域和专用规则的访问控制策略定义。管理域通常但并不总是由对象的文件夹确定。此外,可根据对象类型默认生命周期的初始状态来进一步细化访问规则。
对象初始化规则
对象初始化规则由对象类型在站点、组织和/或容器级别定义。此类规则可指示属性值由服务器分配还是由用户输入;属性的默认值是什么 (如果有);值是否可编辑,以及属性的其他显示特征。在系统预设产品中定义了 OIR 的属性包括:
组织
编号
名称 (仅限变型部件)
文件夹位置
生命周期模板
团队模板
版本控制方案
这些 OIR 可以由定制器修改或删除,其他属性的其他 OIR 可能由定制器写入。这些特性之间实际和潜在的关系在下图中进行了说明,其中着色的框代表向导元素。
正如您在此图中看到的那样,各个对象特性之间可能会变为复杂且循环的关系。例如,要显示文件夹位置的输入字段,您必须知道由 OIR 设置的默认文件夹,这需要了解所创建的对象类型。但是,要显示具有可用对象类型的选取器,您必须知道由文件夹确定的管理域。
本文档将影响其他属性值的属性称为“驱动属性”。受影响的属性将被称为“依存属性”。驱动属性值必须一定是依存于它的属性值的“上游”。“上游”一词表示:用户在上一向导步骤中输入的向导启动上下文,或者在某些情况下,用户在同一步骤中通过表格或面板但在依存属性上方输入的向导启动上下文。无论何时对驱动属性值进行更改,如果向导的下游部件包含依存属性并已预先加载,则必须对其进行刷新。(有关预先加载和非预先加载步骤的信息,请参阅访问向导步骤内容时对其进行加载。)
属性之间相互关系的确切性质取决于站点定义其 OIR 和访问控制策略的方式。由 PTC 交付的向导已设置为按照预设访问控制规则和 OIR 定义的顺序收集属性信息,并包含预期的常用自定义。已对客户站点如何设置其 OIR 和 ACL 做出了一定的假设。这包括:
具有 OIR 的站点用于定义不同对象类型的默认生命周期
OIR 仅对基本类型 (如 WTPart 或 WTDocument) 进行了定义,对基本类型的子类型没有提供不同定义
如果这些假设不成立,或者您的站点通过其 OIR 或访问控制策略引入了附加属性依存关系,则可能需要自定义向导步骤和属性的布局,以确保驱动属性总是在其依存属性的上游。
示例代码
新建基线向导的主 JSP
文件名:<WT_HOME>/codebase/netmarkets/jsp/baseline/createBaseline.jsp
该向导为单步向导,因此使用 <WT_HOME>/codebase/actionmodels.xml 中定义的 "NoStepsWizardButtons" 操作模型。
<%@ 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"%>
<script src='netmarkets/javascript/baseline/baseline.js'></script>
<jca:initializeItem operation="${createBean.create}"
baseTypeName="wt.vc.baseline.ManagedBaseline"/>
<jca:wizard buttonList="NoStepsWizardButtons"
helpSelectorKey="baseline.createHelp">
<jca:wizardStep action="setBaselineAttributesStep"
type="baseline" />
</jca:wizard>
%@include file="/netmarkets/jsp/util/end.jspf"%
新建产品向导的主 JSP
文件名:\codebase\netmarkets\jsp\baseline\create.jsp
<%@ taglib uri="http://www.ptc.com/windchill/taglib/components"
prefix="jca"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt"
prefix="fmt"%>
<%@ page import="com.ptc.windchill.enterprise.part.PartConstants"
%>
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ include
file="/netmarkets/jsp/components/includeWizBean.jspf"%>
<fmt:setBundle
basename="com.ptc.windchill.enterprise.product.productResourceClie
nt"/>
<jca:initializeItem operation="${createBean.create}"
baseTypeName="wt.pdmlink.PDMLinkProduct"
<jca:wizard helpSelectorKey="PDMAdminProdCreate_Help"
buttonList="DefaultWizardButtonsNoApply">
<jca:wizardStep action="defineItemWizStep" type="object" />
<jca:wizardStep action="setAttributesWizStep" type="object" />
</jca:wizard>
<SCRIPT language="javascript">
.
.
.
</SCRIPT>
<%@ include file="/netmarkets/jsp/util/end.jspf"%>
这对您有帮助吗?