Windchill 客户端体系结构向导
目标
您想要通过分步收集信息来创建对象或对对象执行操作。
背景
向导是一些弹出窗口,可用于指导您分步完成创建对象或对对象执行操作的过程。向导是由一系列步骤组成的用户界面,这些步骤可引导用户完成特定任务 (每次执行一个步骤),用户单击“下一步”即可在步骤中移动。您可能无需完成向导中出现的所有步骤。提供必需的信息后,您可以单击“完成”/“确定”按钮将数据提交至服务器。向导可以包含一个或多个必须以特定顺序完成的步骤。
文书是由包含两个或多个选项卡的选项卡控件组成的用户界面。用户可以输入数据,还可以按任意顺序完成选项卡。即使未完成当前选项卡,用户也可以自由地从一个选项卡移动到另一个选项卡。文书不会指导用户按顺序完成任务,因此通常用于经常性且易于完成的任务。
单个步骤向导和多个步骤向导的布局将有所不同。单个步骤向导将不具有“步骤图标”、“步骤链接”和“上一个/下一个导航按钮”。
范围/适用性/假设
• 当您需要创建/编辑对象 (方法是在以特定的系统方式收集必须的信息后,对对象执行任何操作) 时,应使用这种向导。
• 在向导中呈现的表格是 JCA 表格,而在选取器中呈现的表格则是 JSCA 表。
• 在大多数情况下,文书的实现方式与向导相同,并且本文档中的说明适用于两者。将记录所有差异。否则,术语“向导”应解释为向导或文书,“向导步骤”应解释为向导步骤或文书选项卡。
解决方案
使用 Wizard 或 Clerk 组件。
必备知识
要实现此目标,需要了解以下内容:
• 涉及 HTML、JSP、Java、JavaScript 和自定义 taglib 的基本开发。
• Windchill 客户端体系结构标记概述。
• Windchill 客户端体系结构中的操作框架。
• 操作验证框架。
解决方案元素
元素 | 类型 | 说明 |
---|
components.tld | tld | 标记库描述符 (TLD) 文件,其中包含向导标记和向导步骤标记定义 运行时位置: <Windchill>\codebase\WEB-INF\tlds\ |
wizard.js | JS | 包含如何从一个步骤移动到另一个步骤以及如何调用为每个步骤定义的方法的所有必要逻辑。 运行时位置: <Windchill>\codebase\netmarkets\tlds\javascript\components |
<您的_向导_页面>.jsp | JSP | 在其中定义向导实现的 jsp 文件。 |
<您的_向导_步骤>.jsp | JSP | 包含向导步骤内容的 jsp 文件。 |
<*-actions>.xml | XML | 此 XML 文件中定义了向导的操作以及每个向导步骤。 |
actionmodels.xml | XML | 在此 XML 文件中定义了要在向导底部 (即导航区域) 显示的按钮列表的模型。 |
<resourceBundle>.rbInfo | rbInfo | 此选项可用于为向导步骤和向导操作指定特定于区域设置的字符串和特性。 |
formProcessorController | Java | |
wizard | Tag | 指定指向向导的主 JSP 的操作,并定义向导中包含的步骤。标记处理程序:com/ptc/core/components/tags/components/WizardTag |
wizardStep | Tag | 指定指向步骤的主 JSP 的操作。 |
过程 - 配置向导组件
为向导和向导步骤创建操作
向导的每个步骤和向导本身都需要针对关联页面的操作声明。使用对象类型将操作分组在一起。这些对象类型在包含于任何一个 *actions.xml 文件中的 <listofactions> 标记内声明。有关操作方式的详细信息,请参阅
Windchill 客户端体系结构的操作框架。
Windchill 预期与此对象类型相关的所有 JSP 页面均位于 <WT_HOME>\codebase\netmarkets\jsp\<objecttype> 下。在以下指定示例中,这些页面将位于 <WT_HOME>\codebase\netmarkets\jsp\changeTask\ 下。
已为向导页面定义 "create" 操作。默认情况下,除非对 command 标记指定 url 属性,否则 action 的 name 属性指向向导中与
<WT_HOME>/codebase/netmarkets/jsp 关联的 JSP 主页面。因此,对于下面的操作,
Windchill 现预计 "
create.jsp" 将位于
<WT_HOME>\codebase\netmarkets\jsp\changeTask\ 文件夹中。由于此操作适用于向导,因此必须在
<command> 标记内将 windowType 指定为 "popup"。有关
windowType 属性的详细信息,请参阅
Windchill 客户端体系结构的操作框架。
已为向导步骤定义 "affectedAndResultingItemsStep" 操作。对应的 JSP 应位于 <WT_HOME>\codebase\netmarkets\jsp\changeTask\affectedAndResultingItemsStep.jsp 中。由于此操作适用于向导步骤,因此必须将 windowType 指定为 "wizard_step"。
<objecttype name="changeTask"
class="wt.change2.WTChangeActivity2">
<action name="create">
<command class=”<path to form processsor>" windowType="popup"/>
</action>
<action name="affectedAndResultingItemsStep">
<command="<path to command class>" windowType="wizard_step" />
</action>
</objecttype>
命令类是可用于处理向导数据的 java 类。通常,这将扩展 CreateObjectFormProcessor。
请知悉,如果表单处理器类扩展 DefaultObjectFormProcessor 或 CreateObjectFormProcessor,则无需在 command 标记中指定 "method" 属性。
请知悉,步骤 command 子标记的 "windowType" 属性应始终设置为 "wizard_step"。
可选的操作标记属性如下表所示。
操作标记属性 | 默认值 | 可能的值 | 说明 |
---|
ajax | 无 | page component row | 指定向导处理完成后应刷新父页面的哪个部分。 值 "page" 会刷新整个页面 (相当于未使用 ajax)。值 "component" 会刷新启动向导的表格。 值 "row" 会刷新一个或多个表格行。 要使用值 "row",您的表单处理器必须告知系统需要添加哪些行 (对象)。 |
UIComponent | 无 | | 参考 roleaccessprefs.xml (uic 名称) 中的条目 (用于指定对向导操作的基于角色的访问权限)。 |
以下是为 "MyPart" 对象启动创建向导的操作示例:
<objecttype name="myPart" class="ext.part.MyPart"
<action name="create" uicomponent="CREATE_MYPART" ajax="row">
<command class="com.ptc.windchill.enterprise.part.forms.
CreateMyPartFormProcessor"
onClick="validateCreateLocation(event)" windowType="popup"/>
</action>
上述操作中显示的 validateCreateLocation() javascript 方法适用于创建可从文件夹浏览器启动的向导。有关详细信息,请参阅
解决方案中的“解决方案元素”。
有关操作和命令标记属性的详细信息,请参阅
在 UI 中添加操作并进行挂接。
除了创建向导操作外,还需要为操作名称、向导窗口标题、操作工具提示等创建文本。该操作将于
在 UI 中添加操作并进行挂接中加以说明。
创建向导页面
在
<customizationRootDirectory>/module1/main/src_web/netmarkets/jsp/ 文件夹中创建新的 JSP 页面,并将其命名为
create.jsp。有关详细信息,请参阅
构建向导以创建单个对象一节中的“用于自定义的模块化结构”部分。
未预加载的向导步骤应在 JSP 页面的顶部包括以下指令:
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ include file="/netmarkets/jsp/components/includeWizBean.jspf"%>
大多数向导步骤也将使用 components.tld 标记库中的标记,因此还需要包括以下内容:
<%@ taglib prefix="jca" uri="http://www.ptc.com/windchill/taglib/components"%>
使用 <wizard> 标记定义向导。此向导的所有步骤都将在 <wizard> 使用标记的标记内定义 <wizardStep>。
如果预先加载了非必需步骤,则将其包括在内十分安全。非预先加载的步骤:
<%@ 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"%> <jca:wizard >
<jca:wizardStep action="defineItemWizStep" type="object"/>
<jca:wizardStep action="setAttributesWizStep" type="object" />
<jca:wizardStep action="affectedAndResultingItemsStep"
type="changeTask" />
</jca:wizard>
<%@ include file="/netmarkets/jsp/util/end.jspf"%>
定义文书
文书的定义过程与向导完全相同,唯一区别在于文书类型为 "clerk"。
<jca:wizard type="clerk">
<jca:wizardStep action="defineItemWizStep" type="object"/>
<jca:wizardStep action="setAttributesWizStep" type="object" />
<jca:wizardStep action="affectedAndResultingItemsStep" type="changeTask" />
</jca:wizard>
将向导类型定义为 "clerk" 后,向导将根据 Clerk UI 标准显示。将不显示步骤指示符,并且步骤标题将显示为选项卡。Clerk 不会显示“下一步”和“上一步”按钮。用户无需输入必填字段即可在任意步骤之间导航。当用户单击“确定”按钮时,系统将对必填字段进行验证。用户将收到一则关于必填字段的消息,并将转至未填充必填字段的相应步骤。
文书组件具有设置项,可供应用程序开发者调用其特定的验证逻辑。
例如:应用程序开发人员可以在 JSP 文件中编写以下代码,以通过“确定”按钮调用 javascript()。
<script>
Event.observe($("PJL_wizard_ok"), 'click', userdefinedjavascriptFunction );
</script>
为向导步骤和向导操作指定本地化字符串/特性
您可以在 <resourceBundle>.rbInfo 文件中指定本地化字符串/特性。
每个条目的格式均应为 <objectType>.<action>.<property>.<type> = <value>。例如,您可以使用以下特性指定将显示向导的弹出窗口的高度和宽度:changeTask.create.moreurlinfo.value=width=800,height=700
changeTask.create.description.value=New Change Task
changeTask.create.description.comment=Used as the label for the create action
changeTask.create.title.value=New Change Task
changeTask.create.title.comment=Used as the title for the create action
changeTask.create.tooltip.value=New Change Taskchange
Task.create.tooltip.comment=Used as the tooltip for the create action
changeTask.create.icon.value=../../wtcore/images/task_create.gif
changeTask.create.icon.comment=DO NOT TRANSLATE
changeTask.create.icon.pseudo=false
changeTask.create.moreurlinfo.value=width=800,height=700
changeTask.create.moreurlinfo.pseudo=false
创建向导步骤页面
页面可以为任何 JSP 页面,并且可以包含任何其他组件以及纯文本 HTML 内容。
如果已存在的步骤将起作用,则不必创建新步骤。有关可重用的步骤,请参阅
自定义可重用向导步骤。
自定义点
本部分包含以下主题:
<action>.xml 属性
参数 | 默认值 | 可能的值 | 必需? | 说明 |
---|
name | 无 | 任意字符串 | 是 | 操作的名称。用作向导步骤标记上的 "name" 属性。 |
id | <type>.<action> | 任意字符串 | 否 | 改写向导步骤的 id (默认值为 type.action)。用于标识某些 javascript 函数中的步骤。如果未指定参数,将使用 <action type>.<action name>。 |
afterJS | - | 任意字符串 | 否 | 指定 javascript 函数名称,以在完成步骤且用户单击向导步骤中的“下一步”、“确定”或“上一步”时调用向导步骤的客户端验证。可用于对表单数据进行客户端验证。 |
beforeJS | - | 任意字符串 | 否 | 指定 javascript 函数名称,以在加载步骤时调用向导步骤的客户端验证。 |
beforeVK | - | 任意字符串 | 否 | 指定服务器验证器名称,以在用户使用“上一步”或“下一步”按钮导航到步骤时加载步骤的情况下,调用向导步骤的服务器端验证。 |
afterVK | - | 任意字符串 | 否 | 指定服务器验证器名称,以调用在用户单击步骤中的“上一步”、“下一步”或“完成”后调用的向导步骤的服务器端验证。可用于对表单数据进行服务器端验证。 |
preloadWizardPage | true | false/true | 否 | 指定在启动向导时而不是在用户导航至步骤时将下载的向导步骤。预先加载向导步骤将使移动到下一步的速度更快。但是,请勿预先加载依赖于在上一步中收集的信息的向导步骤。 |
hidden | false | false/true | 否 | 指定首先隐藏向导步骤,或将操作呈现为不可单击状态。 |
required | false | false/true | 否 | 指定需要向导步骤。 |
<wizard> 标记属性
参数 | 默认值 | 可能的值 | 必需? | 说明 |
---|
buttonList | "Default WizardButtons" | 任意字符串 | 否 | 包含要在向导中显示的按钮列表的操作模型。默认设置为 DefaultWizardButtons 操作模型。另一个常用设置为 NoStepsWizardButtons (用于单步向导) 可在 actions.xml 中使用其他按钮集。也可定义自定义按钮集 |
formProcessorController | "DefaultFormProcessorController" | 任意字符串 | 否 | 提交 FormProcessorController 类时,应使用该类处理向导。 如果未指定,将使用 DefaultFormProcessorController。 |
title | - | 任意字符串 | 否 | 要显示改写标题,而不是 rbInfo 文件或 action.properties 文件中的默认标题。默认情况下,此标题不会进行本地化/国际化。您需要负责传递本地化标题。 |
helpSelectorKey | - | 任意字符串 | 否 | 用于从 services.properties 文件中标识帮助文件的选择器键。 |
type | wizard | Wizard/clerk/dialog | 否 | 标识向导是否属于 clerk 类型。如果指定 "clerk",将根据 Clerk UI 显示向导。 |
progressMessage | - | 任意字符串 | 否 | 这样便可使用 UI 标准在进度栏上方显示文本。 |
<wizardStep> 标记属性
参数 | 默认值 | 可能的值 | 必需? | 说明 |
---|
action | - | 任意字符串 | 是 | 要包含在向导父标记中的操作的名称。 |
type | - | 任意字符串 | 是 | 要包括在向导父标记中的操作的类型。 |
objectHandle | - | 任意字符串 | 否 | 用于标识此步骤对应的对象的对象句柄。 仅当向导需要创建多个对象时才需要此参数。 默认情况下,不需要任何对象句柄。 |
label | - | 任意字符串 | 否 | 步骤的标签。 注意:操作应已具有标签。 仅当要改写操作标签时,才会设置此属性。 |
embeddedHelp | - | 任意字符串 | 否 | 显示在向导步骤内容顶部的小文本帮助按钮。可选。 |
为向导提供用户定义的按钮
您可以更改/指定在向导底部 (即导航区域) 显示的不同类型的按钮。向导框架可提供默认按钮模型,该模型由类似于“下一步”、“上一步”、“确定”、“应用”和“取消”的按钮组成。但是,向导框架还使您能够指定自己的具有用户定义功能的按钮集。
在 <您的_向导_页面>.jsp 中
<jca:wizard buttonList="PreferenceWizardButtons" >
...
...
</jca:wizard>
您需要在 actionmodels.xml 文件中提供相应的条目:
<actionmodels>
<model name="PreferenceWizardButtons">
<action name="revertButton" type="object"/>
<action name="okButton" type="object"/>
<action name="cancelButton" type="object"/>
</model>
</actionmodels>
actionmodel 中的每个按钮都应具有针对 actions.xml 文件中的操作的相应条目。如果写入单独的 java 类以呈现该特定按钮,则您可以使用 <command> 标记的 "class" 和 "method" 属性来指定该类的名称及其方法 (包含呈现代码)。例如:
<action name="revertButton" id="PJL_wizard_revert_to_default">
<command class="" method="" windowType="page"
url="javascript:revertToDefault()"/>
</action>
| 对于文书,默认情况下仅显示“确定”和“取消”按钮。如果要配置新按钮,应配置相应的按钮模型。 |
提供用户定义的表单处理器控制器
您可以指定表单处理器控制器,当向导完成且用户单击“确定”、“完成”或“应用”按钮进行提交时,将执行该控制器。表单处理器控制器从向导框架中获取在所有向导步骤中指定的数据,并对其进行处理。处理数据后,表单处理器控制器将返回 FormResult 的对象以及状况。根据返回的状况 (SUCCESS/FAILURE),向导框架将决定进一步的操作。例如:
在 <您的_向导_页面>.jsp 中
<jca:wizard formProcessorController =
"com.mycompany.MyUniqueFormProcessorController">y
...
</jca:wizard>
在处理向导步骤之前/之后提供服务器端验证
通过使用特定的 java 类,并配置用于在处理向导步骤之前/之后执行验证的向导,您可以实现服务器端验证。可通过使用 <action> 标记的 "beforeVK" 和 "afterVK" 属性来实现此目的。您需要提供键,以将其作为这些属性的值。应在任何 <*-service>.properties 文件 (该文件可指定将执行验证并返回结果的 java 类) 中声明相应的键。例如:
<action name="setAttributesWizStepForCreateMultiPart" beforeVK =
"nameNumberValidation">
<command windowType="wizard_step"/>
</action>
或
<action name="setAttributesWizStepForCreateMultiPart" afterVK =
"nameNumberValidation">
<command windowType="wizard_step"/>
</action>
<Service context="default"
name="com.ptc.core.ui.validation.UIComponentValidator">
<Option requestor="null" selector="nameNumberValidation"
serviceClass="com.ptc.windchill.enterprise.part.validator.CreateMul
tiPartNameNumberValidator" />
</Service>
访问向导步骤内容时对其进行加载
默认情况下,在执行向导时下载所有向导步骤。
您可以配置向导,以便在首次初始化和加载向导时不会加载任何向导步骤的内容。您可以在尝试访问该步骤时加载向导步骤的内容。当步骤取决于从上一步收集的信息时,可能需要此功能。
您可以使用 <action> 标记的 "preloadWizardPage" 属性来实现此目的。此属性的默认值为 "true"。例如:
<action name="setClassificationAttributesWizStep
" preloadWizardPage="false">
<command windowType="wizard_step"/>
</action>
| 对于文书,默认情况下会加载所有步骤。文书不具有步骤的条件显示功能 (即隐藏步骤),因此将预先加载所有步骤。 |
将向导步骤标记为 "required"
您可以将向导步骤标记为 "required"。执行此操作后,除非至少访问必需的步骤一次,否则将无法提交向导。因此,仅在完成所有必需的步骤/至少访问所有必需的步骤一次后,才将启用提交按钮 (例如,“确定”、“完成”或“应用”)。例如:
<action name="setClassificationAttributesWizStep" required="true">
<command windowType="wizard_step"/>
</action>
您还可以在运行时将向导步骤标记为 "required"。您需要使用名为 "setStepRequired" 的 javascript 函数 (此函数在 main.js 文件中进行定义)。您需要传递步骤的 "id"。步骤的默认 id 采用格式 "<type>.<action>"。如果在定义向导步骤操作时明确定义了 "id" 属性的值,请使用该值。例如:
<table border="0">
<tr>
<td align="left" valign="top" NOWRAP>
<w:radioButton id="copy" name="<%=NmObjectHelper.CHOICE%>"
value="<%=NmObjectHelper.CB_COPY%>" checked="true"
onclick="setStepRequired(<type>.<action >);"/>
</td>
</tr>
</table>
隐藏向导步骤
隐藏向导步骤的方法有两种。首先,您可以在启动向导时隐藏向导步骤。其次,您可以在运行时根据特定条件或某些用户操作来隐藏向导步骤。在这两种情况下,在定义向导时必须注册向导步骤。
在 <您的_向导_页面>.jsp 中
<jca:wizard >
<jca:wizardStep action="defineItemWizStep" type="object"/>
<jca:wizardStep action=" setClassificationAttributesWizStep " type="object" />
<jca:wizardStep action="affectedAndResultingItemsStep" type="changeTask" />
</jca:wizard>
要使用第一种方法隐藏步骤,可以使用 <action> 标记的 "hidden" 属性。例如:
在 <*-actions>.xml 中
<action name="setClassificationAttributesWizStep" hidden="true">
<command windowType="wizard_step"/>
</action>
要在运行时隐藏向导步骤,您需要使用名为 "removeStep" 的 javascript 函数 (此函数在 main.js 文件中进行定义)。您需要传递需要移除的步骤的 "id"。步骤的默认 id 采用格式 "<type>.<action>"。如果在定义向导步骤操作时明确定义了 "id" 属性的值,请使用该值。例如:
在 <您的_向导步骤_页面>.jsp 中
<table border="0">
<tr>
<td align="left" valign="top" NOWRAP>
<w:radioButton id="copy" name="<%=NmObjectHelper.CHOICE%>"
value="<%=NmObjectHelper.CB_COPY%>" checked="true"
onclick="removeStep(<type>.<action >);"/>
</td>
</tr>
</table>
| 文书不使用步骤的条件显示功能 (即隐藏步骤),因此将预先加载所有步骤并将其显示给用户。 |
在运行时显示隐藏/动态步骤
可通过使用名为 "insertStep" 的 javascript 函数 (此函数在 main.js 文件中进行定义) 来在运行时显示隐藏的向导步骤。您需要传递需要插入的步骤的 "id"。步骤的默认 id 采用格式 "<type>.<action>"。如果在定义向导步骤操作时明确定义了 "id" 属性的值,请使用该值。在定义向导时,必须注册向导步骤。
例如:
在 <您的_向导_页面>.jsp 中
<jca:wizard >
<jca:wizardStep action="defineItemWizStep" id=” defineItemWizStep”
type="object"/>
<jca:wizardStep action=" setClassificationAttributesWizStep " type="object" />
<jca:wizardStep action="affectedAndResultingItemsStep" type="changeTask" />
</jca:wizard>
在 <*-actions>.xml 中
<action name="setClassificationAttributesWizStep" hidden="true">
<command windowType="wizard_step"/>
</action>
在 <您的_向导步骤_页面>.jsp 中
<table border="0">
<tr>
<td align="left" valign="top" NOWRAP>
<w:radioButton id="copy" name="<%=NmObjectHelper.CHOICE%>"
value="<%=NmObjectHelper.CB_COPY%>" checked="true"
onclick="insertStep(<type>.<action>);"/>
</td>
</tr>
</table>
向导步骤是否为可单击步骤?
是否可单击多个步骤向导中的步骤的预期行为由多种因素决定,其中包括是否已访问和/或已完成步骤,以及是否已将步骤标记为必需步骤。以下列表对预期行为进行了汇总:
• 当向导具有必需和非必需或可选步骤的组合时,适当的 UX 设计将规定所有必需的步骤应在可选步骤之前按顺序显示。
• 当前活动步骤应为可单击步骤 (调用此 step1)。术语“可单击”表示当鼠标悬停在步骤编号上时,光标会更改为手形图像,单击步骤可执行导航或消息传送的操作。
• 当前活动步骤之后的步骤也应为可单击步骤 (调用此 step2)。但是,如果尚未在 step1 上完成所有必填字段,则在单击 step2 时,您会收到有关缺失信息的警告消息,并且无法移动到下一步。实际上,当前活动步骤之后的步骤应执行与单击“下一步”按钮相同的操作。
• 访问所有必需的步骤后 (“确定”/“完成”/“应用”按钮变为启用状态),应可单击其余的可选步骤。
• 只要已访问给定的向导步骤,即可对其进行单击。这适用于向前和向后导航,而且每次可导航多个步骤。例如,在五个步骤的向导中,如果您已完成前四个步骤,然后希望重新导航到第一个步骤以验证某些内容,则可通过单击 step1 来直接导航到相应步骤,然后直接返回到 step4。
提供用户定义的 SUBMIT 功能
您可以配置用户定义的 javascript 函数,以便在提交向导时对其进行调用。您需要在某些 javascript 函数中编写自己的提交功能,然后将该函数的名称作为自变量传递给 "setUserSubmitFunction" (由向导框架提供)。通过执行此操作,您将阻止向导框架调用默认的提交功能。根据返回值 (true/false),向导框架将决定进一步的操作。例如:
<script type="text/javascript">
function user_validate() {
...
...
return true;
}
setUserSubmitFunction(user_validate);
</script>
在显示向导步骤之前提供客户端验证
您可以配置用户定义的 javascript 函数,以便在加载但未显示向导步骤时对其进行调用。您需要在某些 javascript 函数中编写自己的功能,并在定义该特定步骤的操作时,将函数名称指定为属性 "beforeJS" 的值。只有当指定的函数返回 "true" 时,才会显示此特定步骤,否则向导将移至上一个步骤。例如:
在 <*-actions>.xml 中
<action name="setClassificationAttributesWizStep" beforeJS ="
validatePreviousStep">
<command windowType="wizard_step"/>
</action>
在任何 JSP 页面或可通过向导访问的 Javascript 文件中
<script type="text/javascript">
function validatePreviousStep() {
...
...
return true;
}
</script>
在完成向导步骤之后提供客户端验证
您可以配置用户定义的 javascript 函数,以便在向导步骤完成但未加载下一个步骤时对其进行调用。您需要在某些 javascript 函数中编写自己的功能,并在定义该特定步骤的操作时,将函数名称指定为属性 "afterJS" 的值。仅当指定的函数返回 "true" 时,才会显示下一个步骤。
例如:
在 <*-actions>.xml 中
<action name="setClassificationAttributesWizStep" afterJS ="
validateStep">
<command windowType="wizard_step"/>
</action>
在任何 JSP 页面或可通过向导访问的 Javascript 文件中
<script type="text/javascript">
function validateStep() {
...
...
return true;
}
</script>
配置向导 - 隐含输入键
您可以通过输入键隐含提交表单信息。
<script type="text/javascript">
// Supress form submission twice due to hiting enter
function wizardKeyUpListener(event) {
var target = Event.element(event);
if (event.keyCode == Event.KEY_RETURN || event.which ==
Event.KEY_RETURN) {
if (target != null && (target.tagName == "SELECT" ||
target.tagName == "TEXTAREA" || target.tagName == "INPUT")) {
Event.stop(event);
return false;
}
}
}
配置向导 - 更改默认焦点元素
您可以在向导中更改默认焦点元素。通常情况下,基础结构将尝试使默认的焦点元素成为可编辑的第一个必填字段 (输入、选择或文本区域标记)。这一点非常棘手,因此基础结构可能无法在所有情况下实现这一目的。
如果第一个焦点元素需要不同的元素,或此行为在您的向导中无法正常工作,则可以创建一些 javascript 代码以获得所需的行为。
• 在仅由此向导包括的 .js 文件中:
//首先,移除当前的焦点监听程序以避免任何争用条件。例如:
PTC.un('ready', PTC.wizard.focusOnReadyFunc);
//Create the new focus listener to select your desired component
function customFocusFunc {} {
// Focus on a specific ID when it becomes available…
…
}
//Register your new listener on the page.
PTC.onReady( customFocusFunc );
为您的步骤创建数据验证器
用户输入数据的验证在每个步骤后完成,在某些情况下,还会在完成每个输入字段后执行验证。可在客户端上通过 javascript 以及/或在 MethodServer 上通过扩展 UIComponentValidator 的 Java 类完成此操作。
如果输入字段由标准呈现器生成,则系统会自动验证是否提供了所有必需的属性值。呈现器将 "class="required"" 属性添加到输入字段中,向导 javascript 会检查以确保具有此类属性的每个字段均具有值。通过将方法指定为步骤操作的 afterJS 属性的值,可以在 javascript 方法中执行其他客户端验证。有关如何封装自定义 javascript 的信息,请参阅
向所有 Windchill 客户端体系结构页面添加自定义代码。
对于在“类型和属性管理”实用程序中为属性定义的约束,必须在 MethodServer 中对数据值进行验证。这可通过在 DefaultUIComponentValidator 的子类上实现 validateFormSubmission() 方法来完成。然后在步骤操作的 afterVK 属性中,为指向 DefaultUIComponentValidator 的 service.properties 条目的选择器键指定名称。当用户单击某一步骤中的“下一步”或“确定”按钮时,框架将自动调用验证器类的 validateFormSubmission() 方法。驱动属性面板中的任何属性的值发生更改时,也会调用此方法。
默认服务器端验证器可用于“设置上下文”、驱动属性表格和“设置属性”向导步骤。选择器键和验证器类路径在 components.service.properties.xconf 中指定:
<Service context="default" name="com.ptc.core.ui.validation.
UIComponentValidator">
<Option serviceClass="com.ptc.core.components.validators.
ContextWizardStepValidator" requestor="null" selector=
"setContextWizStep"/>
<Option requestor="null"
serviceClass="com.ptc.core.components.validators.
DefineObjectStepValidator" selector="defineItem" />
<Option serviceClass="com.ptc.core.components.validators.
SetAttributesStepValidator" requestor="null"
selector="setAttributesWizStep "/>
</Service>
如果预置验证器类满足您的需求,则可通过将上述条目中所示的选择器字符串指定为向导步骤操作的 afterVK 属性的值。如果需要执行其他验证,则可以编写自己的验证器,这些验证器通常为标准验证器的子类。请知悉,通过调用 UIValidationCriteria.getFormData() 可从传递到验证器的 UIValidationCriteria 参数访问所有表单数据。如果所有表单数据有效,validateFormSubmission() 方法应返回状态为 UIValidationStatus.PERMITTED 的 UIValidationResult,如果一个或多个属性值无效,则该方法应返回状态为 UIValidationStatus.DENIED 的 UIValidationResult。在后一种情况下,用户将返回到刚刚完成的向导步骤,以更正无效值。要显示给用户的反馈消息应使用 UIValidationResult.addFeedbackMsg() 方法添加至 UIValidationResult。
限制
Windchill 向导框架可从 Windchill 操作框架中获取帮助,用于从相关的 .rbInfo 文件或从 action_<locale>.properties 文件中选取本地化的向导标题。该框架使用 <objectType> 和 <action> 获取必需的值。尝试使用 "command" 标记的 "url" 属性时 (定义向导操作时),将会出现此问题。如果 "url" 属性的值指向名称与另一个操作相匹配的 JSP 页面,则向导框架将接收与该操作相对应的本地化标题。
请考虑下列情形:
<action name="createPartWizard">
<command class="com.ptc.windchill.enterprise.part.forms.CreatePartFormProcessor"
method="execute" onClick="validateCreateLocation(event)"
windowType="popup"/>
</action>
<action name="createMultiPart" >
<command class =
"com.ptc.windchill.enterprise.part.forms.CreateMultiPartFormProcessor"
method="execute" onClick="validateCreateLocation(event)"
windowType="popup"
url="/netmarkets/jsp/part/createPartWizard.jsp?wizardType=multiPart" />
</action>
在上述指定的情况下,操作 "createMultiPart" 的向导标题将从特性 "part.createPartWizard.title.value" 而不是特性 "part.CreateMultiPart.title.value" 获取。
此情形的解决方法是使用向导标记的 "title" 属性。如果指定了此属性,则向导框架不会尝试查找任何 rbInfo 或特性文件。但是,请确保将本地化字符串作为向导标记的标题提供。例如:
<%@ taglib prefix="jca" uri="http://www.ptc.com/windchill/taglib/components"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/fmt" prefix="fmt"%>
<fmt:setBundle basename="com.ptc.windchill.enterprise.part.partResource"/>
<fmt:message var="createMultiplePartWizardTitle" key =
"part.createMultiPart.WIZARD_LABEL" />
<jca:wizard helpSelectorKey="PartMultipleCreate"
title="${createMultiplePartWizardTitle}">
...
...
</jca:wizard>
文书限制
文书将仅执行所有文书步骤的必需字段验证。下面提及的所有其他验证应由相应的文书开发人员提供:
• 有效字符 - 验证用户是否未在给定字段中输入任何非法字符 (例如,在数字字段中输入字母字符)。
• 格式 - 验证用户是否以预期和可理解的格式输入值。请知悉,UI 应首先尽可能防止用户输入无效格式 (例如,清楚地指出预期的格式,允许输入不同的格式)。有关详细信息,请参阅“表单标准”。
• 长度 - 验证用户输入的值对于给定字段不过长也不过短。
• 唯一性 - 验证输入的数据相对于系统中的现有数据是否唯一。例如,验证系统中是否不存在给定部件编号。
如果是文书,则在步骤之间导航时,任何 java 代码 (例如验证器) 都不会获取必填字段,因此开发人员需要注意并相应地应用逻辑。(例如,在创建新文档时,第一个步骤具有必填字段 type (表示文档类型),原因在于在文书中,用户可在单击其他选项卡的同时,在其他选项卡之间自由导航,并且用户在第一个步骤中可能未选择必填字段类型。在此情况下,服务器验证器无法获取类型属性的值。)
示例代码
Windchill 代码中的使用示例
• 创建部件向导:
<WT_HOME>\codebase\netmarkets\jsp\part\createPartWizard.jsp
• 创建文件夹向导:
<WT_HOME>\codebase\netmarkets\jsp\folder\create.jsp
• 创建文档向导:
<WT_HOME>\codebase\netmarkets\jsp\document\create.jsp
• 创建多个文档向导:
<WT_HOME>\codebase\netmarkets\jsp\document\createMulti.jsp
随附的示例