基本自定义 > 用户界面自定义 > 在 UI 中呈现信息 > UI 验证 > 过程 - 预先验证 > 实现验证筛选器
  
实现验证筛选器
假设基于解决方案和基于角色的检查已通过,则验证服务执行预先验证活动时将进行的下一项操作是确定应用于 UI 组件的筛选器。如前所述,典型验证筛选器将包含适用于多个 UI 组件的预先验证逻辑。因此,不需要在多个验证器中复制此逻辑,而是可以创建单个筛选器,然后有选择地将其应用于某些 UI 组件或应用于所有 UI 组件。
选择您的筛选器类型 - 简单或通用
在实现筛选器时,首先需要确定将实现一个简单筛选器还是通用筛选器。为此,需要了解筛选器逻辑实际上应用较广泛,还是仅适用于相对少量的几个操作。
如果逻辑适用于大多数操作,则创建通用筛选器。在此情况下,筛选器将应用于所有操作,尽管始终可以将操作配置为“选项输出”筛选器。
如果筛选器逻辑将仅应用于一小部分操作,则创建一个简单筛选器。在此情况下,您需要单独配置要应用此筛选器的操作。
如果不确定需要实现哪种类型的筛选器,则可以先实现一个简单筛选器,稍后可在必要时将其转换为通用筛选器。需要考虑的另一个问题是,当前不支持将简单筛选器应用于属性,也不支持通过配置属性来忽略通用筛选器。因此,如果您希望将筛选逻辑应用于属性,那么惟一的选择就是通用筛选器。只需了解到:任何通用筛选器都始终会应用至所有属性。
实现简单筛选器
在实现简单筛选器时,您需要扩展 com.ptc.core.ui.validation.DefaultSimpleValidationFilter 以创建一个类。然后,只需覆盖 preValidateAction() 方法,以包含您的验证逻辑并返回验证状态。
以下类基干是简单筛选器的示例之一,当上下文对象标记为删除时,会隐藏操作。
public class MarkedForDeleteFilter extends
DefaultSimpleValidationFilter{
@Override
public UIValidationStatus preValidateAction(UIValidationKey key,
UIValidationCriteria criteria){
// ENABLE by default
UIValidationStatus status = UIValidationStatus.ENABLED;
WTReference contextObj = criteria.getContextObject();
if (/*contextObj.isMarkedForDelete() == */ true){
status = UIValidationStatus.HIDDEN;
}
return status;
)
)
实现通用筛选器
通用筛选器的实现方式与简单筛选器的实现方式完全相同,唯一例外是:在实现通用筛选器时,您需要扩展 com.ptc.core.ui.validation.DefaultUniversalValidationFilter。否则,其实现与简单筛选器完全相同。
假设我们要将简单筛选器示例中的筛选器作为通用筛选器来实现。通用筛选器的类基干应该如下所示:
public class MarkedForDeleteFilter extends
DefaultUniversalValidationFilter{
@Override
public UIValidationStatus preValidateAction(UIValidationKey key,
UIValidationCriteria criteria){
// ENABLE by default
UIValidationStatus status = UIValidationStatus.ENABLED;
WTReference contextObj = criteria.getContextObject();
if (/*contextObj.isMarkedForDelete() == */ true){
status = UIValidationStatus.HIDDEN;
}
return status;
}
}
注册筛选器
创建筛选器后,下一步是对其进行注册。
根据您所实现的筛选器类型 (通用或简单),筛选器注册表将有所不同。在注册表中提供选择器时,约定:使用筛选器类名称,但将第一个字母替换为小写字母,并去掉后缀 "filter" (例如,"MarkedForDeleteFilter" 的选择器为 "markedForDelete")。应声明以下详细信息:
要注册通用筛选器,请在 *service.proeprties.xconf 中创建如下所示的条目:
<Service context="default"
name="com.ptc.core.ui.validation.UniversalValidationFilter">
<Option
serviceClass="com.ptc.windchill.enterprise.markedfordelete.validat
ors.MarkedForDeleteFilter"
selector="markedForDelete" requestor="null" />
</Service>
When registering a simple filter, the only difference is the name
attribute of the Service element:
<Service context="default"
name="com.ptc.core.ui.validation.SimpleValidationFilter">
<Option
serviceClass="com.ptc.windchill.enterprise.somepackage.validators.
MarkedForDeleteFilter"
selector="markedForDelete" requestor="null" />
</Service>
将操作与筛选器关联和取消关联
创建并注册筛选器后,最后需要将操作与简单筛选器关联,或将操作与通用筛选器取消关联。这在 *actions.xml 中完成。
将操作与通用筛选器取消关联
如果您不希望将全局筛选器应用于特定操作,则需要在 *acitons.xml 中查找这些操作,并将其更新为包括 excludeFilter 元素,如下所示:
<objecttype name="navigation" class=""
resourceBundle="com.ptc.core.ui.navigationRB">
<action name="home" renderType="GENERAL">
<command class="netmarkets"
method="servlet/Navigation?tab=home" windowType="page"/>
<excludeFilter name="markedForDelete" />
</action>
<action name="program" renderType="GENERAL">
<command class="netmarkets"
method="servlet/Navigation?tab=program"windowType="page"/>
<excludeFilter name="markedForDelete" />
</action>
<action name="product" renderType="GENERAL">
<command class="netmarkets"
method="servlet/Navigation?tab=product" windowType="page"/>
<excludeFilter name="markedForDelete" />
</action>
...
* 
excludeFilter 元素的 name 属性应该与在 *service.properties.xconf 中注册筛选器所使用的 selector 相对应。
将操作与简单筛选器关联
假设您已创建并已注册一个名为 ProblemReportStatusFilter 的简单筛选器 (且已使用 "problemReportStatus" 的选择器对其进行注册),该筛选器将在问题报告处于特定状态时禁用操作。假设您要将其应用于少数几个操作。您可以在 *actions.xml 中查找要应用此筛选器的操作,并将其修改为包括 includeFilter 元素,如下所示:
<objecttype name="problemReport" class="wt.change2.WTChangeIssue"
resourceBundle="com.ptc.windchill.enterprise.change2.changeManagem
entActionsRB">
<action name="create" >
<command class=…/>
<includeFilter name="problemReportStatus" />
</action>
<action name="edit" >
<command class=…/>
<includeFilter name="problemReportStatus" />
</action>
<action name="editModifyContentOnly"
id="editModifyContentOnly">
<command class="…/>
<includeFilter name="problemReportStatus" />
</action>
...
* 
同样,includeFilter 元素的 name 属性应该与在 *service.properties.xconf 中注册筛选器所使用的 selector 相对应。
相同操作的多个筛选器内含项目/排除项目
理论上,一个操作可以有任意数量的通用筛选器与其取消关联,也可以有任意数量的简单筛选器与其关联。可根据需要在 *actions.xml 中添加任意数量的 includeFilter 和 excludeFilter 元素。
例如:
<action name="removeChangeTask" renderType="GENERAL" ajax="row">
<command onClick="removeChangeTask(event)"
windowType="no_content" />
<includeFilter name="problemReportStatus />
<excludeFilter name="markedForDelete" />
<includeFilter name="someSimpleFilter" />
<excludeFilter name="someUniversalFilter" />
...
</action>
* 
includeFilter 和 excludeFilter 元素的顺序并不重要,也与筛选器调用的顺序无关。
将操作模型与筛选器关联和取消关联
创建并注册筛选器后,也可以将操作模型与简单筛选器关联,或将操作模型与通用筛选器取消关联。此操作在 *actionModels.xml 中完成。
将操作模型与通用筛选器取消关联
如果您不希望将全局筛选器应用于特定操作模型,则需要在 *actionModels.xml 中查找这些操作模型,并将其更新为包括 excludeFilter 元素,如下所示:
<model name="CustEx_default_myTab">
<action name="CustEx_simpleTable1" type="object" />
<action name="CustEx_simpleTable2" type="object" />
<action name="CustEx_simpleTable3" type="object" />
<excludeFilter name=" someUniversalFilter " />
</model>
* 
excludeFilter 元素的 name 属性应该与在 *service.properties.xconf 注册筛选器所使用的 selector 相对应。
将操作模型与简单筛选器关联
假设您已创建并注册了一个名为 ProblemReportStatusFilter 的简单筛选器 (且已使用 "problemReportStatus" 的选择器对其进行注册),并且您希望将其应用于几个操作模型。您可以在 *actionModels.xml 中查找要应用此筛选器的操作模型,并将其修改为包括 includeFilter 元素,如下所示:
<model name="CustEx_default_myTab">
<action name="CustEx_simpleTable1" type="object" />
<action name="CustEx_simpleTable2" type="object" />
<action name="CustEx_simpleTable3" type="object" />
<includeFilter name="testFilter" />
</model>
* 
includeFilter 元素的 name 属性应该与在 *service.properties.xconf 注册筛选器所使用的 selector 相对应。
相同操作模型的多个筛选器内含项目/排除项目
理论上,一个操作可以有任意数量的通用筛选器与其取消关联,也可以有任意数量的简单筛选器与其关联。可根据需要在 *actionModels.xml 中添加任意数量的 includeFilterexcludeFilter 元素。
例如:
<model name="CustEx_default_myTab">
<action name="CustEx_simpleTable1" type="object" />
<action name="CustEx_simpleTable2" type="object" />
<action name="CustEx_simpleTable3" type="object" />
<includeFilter name="problemReportStatus />
<excludeFilter name="markedForDelete" />
<includeFilter name="someSimpleFilter" />
<excludeFilter name="someUniversalFilter" />
...
</model>
* 
includeFilterexcludeFilterelements 的顺序并不重要,也与筛选器调用的顺序无关。