高级自定义 > 业务逻辑自定义 > DTI 自定义框架 > 在 Microsoft Office 中自定义 Windchill 选项卡 > 实现示例 > 服务器端自定义
  
服务器端自定义
定义自定义操作
以下文件为 Windchill 出厂预置。此文件为空,可用于此示例自定义:
<Windchill>\codebase\config\actions\custom-actions.xml
将以下 XML 文本添加为 listofactions 文档节点的子节点。
<objecttype name="customization" class="wt.doc.WTDocument">
<action name="DTICustomizationDemo">
<command class="com.ptc.dti.customization.forms.
TICustomizationFormProcessor"
method="execute" windowType="popup"
url="/netmarkets/jsp/customization/partPicker.jsp"/>
</action>
</objecttype>
由此可定义将从 DTI 客户端调用的 DTICustomizationDemo 操作。调用此操作时,将启动 partPicker.jsp。完成此操作后,将在 DTICustomizationFormProcessor 中构建响应。
设计用户界面
在此示例中,您需要 WTPart 搜索和多部件选取器功能。此功能在 partPicker.jsp 中使用 itemPicker 标记进行实现,其中 objectTypeWTPart
<%@ taglib prefix="wctags" tagdir="/WEB-INF/tags" %>
<%@ include file="/netmarkets/jsp/components/beginWizard.jspf"%>
<%@ taglib uri="http://www.ptc.com/windchill/taglib/dti" prefix="dti"%>
<wctags:externalFormData/>
<input type="hidden" name="fieldsToDisplay" id="fieldsToDisplay"
value="${dti:getCustomActionArg(param.externalFormData)}" />
<input type="hidden" name="selectedParts" id="selectedParts" value=" " />
<wctags:itemPicker id="dtiPartPicker"
inline="true"
pickerCallback="partPickerCallback"
componentId="dtiPartPicker"
pickerTitle="DTI Customization Part Picker Example"
objectType="wt.part.WTPart"
multiSelect="true"
/>
<SCRIPT>
function partPickerCallback(objects) {
var selectedPartsOid = '';
var myJSONObjects=objects.pickedObject;
for(var i=0; i< myJSONObjects.length;i++) {
if(i != 0){
selectedPartsOid += ';'; //partOID separator
}
selectedPartsOid += myJSONObjects[i]["oid"];
}
$("selectedParts").value = selectedPartsOid;
window.pickerCallback = "doNothing";
}
</SCRIPT>
<%@ include file="/netmarkets/jsp/util/end.jspf"%>
* 
使用 wctags:externalFormData 标记可以隐藏字段的形式传递 DTI 数据。
使用 dti:getCustomActionArg(param.externalFormData) 可捕获从 DTI 发送的输入自变量。DTI 作为隐藏字段传递到表单处理器。
在此示例中,发送的自变量是要以 '::' 作为分隔符 (Name::Number::Version::State) 进行查询的 Windchill 部件特性列表。
在此定义了一个 pickerCallback 函数,该函数将用于捕获选定部件的 OID,然后将其放置在字符串中并用 ';' 分隔符进行分隔,再通过 selectedParts 隐藏字段将选定部件 OID 的列表传递给表单处理器。以下示例显示了在搜索并选择了几条记录后 partPicker.jsp 的情况:
实现表单处理器
表单处理器是在 DTICustomizationFormProcessor.java 文件中实现的。诸如 fieldsToDisplayselectedParts 之类的必需数据将从 bean 数据中获得。
您可以任意格式 (如 XML、TXT、CSV 等) 格式化响应,并以字符串形式将其放入会话对象中。此响应也将作为响应提供给 DTI 客户端。此处唯一的要求是将 DTI_CUSTOM_KEY=<dtiCustKey> 作为 wizardResponsehandler 的一部分进行传递。
下面是 setResultNextAction 方法的示例代码:
String responseString =
“<RESULTS>
<Result0 Name="01-51231.prt" Number="WCDS0000000104"
tate="INWORK" Version="A.1"/>
<Result1 Name="01-51246_2.prt" Number="WCDS0000000150"
tate="INWORK" Version="A.5"/>
<Result2 Name="01-52100.asm" Number="WCDS0000000473"
tate="INWORK" Version="A.2"/>
<Result3 Name="01-512040.asm" Number="WCDS0000000654"
tate="INWORK" Version="A.1"/>
<Result4 Name="01-51251a.prt" Number="WCDS0000000055"
tate="INWORK" Version="A.1"/>
<Result5 Name="01-512106a.prt" Number="WCDS0000000363"
tate="INWORK" Version="A.1"/>
</RESULTS>”;
String dtiCustkey = "DTI_CUST_DATA" + System.currentTimeMillis();
clientData.getRequest().getSession().setAttribute(dtiCustkey, responseString);
wizardResponseHandler += "&DTI_CUSTOM_KEY="+ dtiCustkey;
此处,根据要查询的选定部件的特性将 responseString 构建为 XML 响应。
此响应字符串也将以相同格式提供给 DTI 客户端。
有关实现的详细信息,请参阅 Windchill 安装中提供的 DTICustomizationFormProcessor.java 文件。