単一オブジェクトを編集するウィザードの構築
目的
ユーザーが Windchill ビジネスオブジェクトの属性を編集およびデータベース内のオブジェクトを更新できるウィザードを開発する必要があります。
バックグラウンド
オブジェクト編集ウィザードは通常、「編集」または「チェックアウトおよび編集」操作によって起動されます。
ビジネスオブジェクトを編集するウィザードの開発は、そのビジネスオブジェクトを作成するウィザードの開発によく似ています。使用するコンポーネントはほとんど同じです。ただし、作成ウィザードと編集ウィザードには相違点がいくつかあり、別のコンポーネントまたは別のコンポーネント設定が必要になるものがあります。相違点は以下のとおりです。
• 編集ウィザードでは、オブジェクトのコンテナコンテキスト、所有組織、フォルダ場所、またはタイプを変更できません。
• 一部の編集ウィザードでは、オブジェクトのマスターのアイデンティティ属性 (名前や番号など) を変更できません。このような変更は、「名前を変更」または「共通属性を編集」クライアントを使用して行います。その他のマスター属性も編集できません。
• 編集ウィザードの起動時に、編集対象のオブジェクトが処理可能であり、ユーザーがチェックアウトしていない場合、このオブジェクトはウィザードによって自動的にチェックアウトされます。
• 編集ウィザードの属性入力フィールドには、Java クラスや「タイプおよび属性の管理」ユーティリティで定義されたデフォルト値ではなく、オブジェクトのデータベースに存在する値があらかじめ入力されます。
• 処理可能オブジェクトの編集ウィザードには、さまざまなナビゲーションボタンがあります。「OK」ボタンの代わりに、「保存」ボタンと「チェックイン」ボタンがあります。「保存」ボタンでは、チェックインや反復処理を行わずにオブジェクトの作業コピーに対する変更内容が保存されます。「チェックイン」ボタンでは、オブジェクトの新規作業版数が作成およびチェックインされます。また、「キャンセル」ボタンをクリックすると、オブジェクトがチェックアウトされたままになることをユーザーに知らせるメッセージが表示されます。
特に編集に使用できるコンポーネントは以下のとおりです。
• 複数のウィザードに共通するウィザードステップの jsp および jspf ファイル
• ウィザードデータを管理し、ページにエレメントを表示するカスタム HTML タグ
• ユーザーがウィザードをサブミットした後にウィザードデータを処理するための Java クラス
範囲/適用可能性/前提条件
このセクションでは、カスタムの永続可能ビジネスオブジェクトクラスまたはサブタイプが作成済みであり、そのオブジェクトタイプのインスタンスの属性を編集できるウィザードを開発する場合を想定しています。
このドキュメントの情報は、処理可能オブジェクト、処理不能オブジェクト、タイプ化オブジェクト、および非タイプ化オブジェクトの編集に適用できます。
このドキュメントでは、Windchill のほとんどの編集ウィザードのベースとなる再使用可能な共通コンポーネントについて説明します。WTPart、WTDocument、WTChangeIssue などの既存の Windchill ビジネスクラスがカスタムタイプによって拡張される場合は、ここで説明するコンポーネントの代わりに、そのクラスにより適したコンポーネントを使用できることがあります。このようなクラス固有のコンポーネントは、このドキュメントで説明する共通コンポーネントをベースとして構築されます。このドキュメントでは、このようなクラス固有のコンポーネントについては詳しく説明しません。
カスタムタイプのインスタンスを編集するために、必ずしも独自のウィザードを開発する必要があるとはかぎりません。カスタムタイプが、WTPart、WTDocument、問題レポート (WTChangeIssue) など、Windchill ビジネスクラスのモデル化サブタイプまたはソフトサブタイプである場合は、デフォルトの編集ウィザードを目的に応じて使用できます。デフォルトのウィザードでは、「属性を設定」ステップで、カスタムサブタイプのハード属性およびグローバル属性の入力フィールドが自動的に表示されます。
表内の属性は以下の順に並んでいます。
• デフォルトの属性 (JSP ファイル内のリスト順)
• カスタムのモデル化属性 (表示名のアルファベット順)
• カスタムのグローバル属性 (表示名のアルファベット順)
このステップの属性を別の順序で並べる場合や、このステップに追加フィールドが必要な場合は、ユーザーのサブタイプ専用に、このステップの新しい jsp を作成する必要があります。 ただし、「部品を編集」ウィザードは引き続き使用できます。
既存のウィザードにステップを追加する場合は、カスタムウィザードを開発する必要があります。ただし、既存のウィザードのステップおよびコンポーネントの多くを再使用できる場合があります。
予測される結果
単一ステップまたは複数ステップの HTML ウィザードを製品に追加します。これにより、ユーザーはデータベース内のビジネスオブジェクトを更新できます。ウィザード内でのステップの配列と属性の表示は、一貫した操作性を実現するために、Windchill のほかのウィザードと同じようにする必要があります。
ソリューション
jsp ウィザードフレームワークをベースとして構築された共通の jsp、タグ、JavaScript、および Java クラスのコンポーネントを使用して、ユーザー入力の取得および処理とデータベース内のオブジェクトの作成に使用されるウィザードを作成します。
前提となる知識
この目標を達成するには、
単一オブジェクトを作成するウィザードの構築のトピック、特にその「前提となる知識」セクションに精通している必要があります。
ソリューションエレメント
エレメント
|
タイプ
|
説明
|
タグ
|
autoCheckOutItem
|
タグ
|
オブジェクトを現在のユーザーにチェックアウトします (まだチェックアウトされていない場合)。作業コピーへのオブジェクト参照を、現在の HTTPRequest の属性として、NmCommandBean の HTTPRequestData パラメータマップのパラメータとして、および DOM の非表示フィールドとして追加します。作業コピー値のキーは CreateAndEditWizBean.WORKING_COPY_REF_PARAMETER_NAME です。
このタグは、ウィザードのメイン JSP 内で initializeItem タグのすぐ下に配置する必要があります。
タグライブラリ: <Windchill>/codebase/WEB-INF/tlds/wo rkinprogress.tld
タグハンドラ: com.ptc.windchill.enterprise.wip.tags.AutoCheckOutObjectTag
|
Bean
|
CreateAndEditWizBean
|
Java クラス
|
includeWizBean jspf ファイルを含めると、この Bean をユーザーの jsp で使用できます。この Bean には、操作 (作成または編集) や作業コピーのオブジェクト参照などのウィザードデータに使用するゲッターメソッドがあります。
|
Java クラス
|
|
ウィザードを作成および処理するために、以下のクラスを使用できます。これらのクラスは、<Windchill>/codebase/WEB-INF/lib/wnc Web.jar ファイルにあります。
|
CreateAndEditModelGetter
|
Java クラス
|
getModel タグで呼び出し可能なクラスで、編集ウィザードのプロパティパネルおよび属性テーブルのデータを生成します。
|
DefaultEditFormProcessor
|
Java クラス
|
処理不能オブジェクトのウィザードフォームデータを処理するために使用または拡張できるクラス。DefaultObjectFormProcessor を拡張します。
|
EditWorkableFormProcessor
|
Java クラス
|
処理可能オブジェクトのウィザードフォームデータを処理するために使用または拡張できるクラス。DefaultObjectFormProcessor を拡張します。
|
手順 - 編集ウィザードの作成
ウィザードを作成するには、次の作業を実行する必要があります。
• ウィザードの操作を作成する (必須)。
• ウィザードのメイン jsp ファイルを作成する (必須)。
• 必要に応じてカスタムステップを作成する
• 再利用可能なステップを選択する
必須と示されているタスクは必ず実行してください。その他の作業が必要かどうかは、ウィザードの要件によって異なります。
標準の Windchill dataUtilities、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" という名前を付けることをお勧めします。起動ポイントまたはその他の条件に基づいてオブジェクトタイプに複数の編集操作を指定する場合は、次のように、操作名にサフィックスを追加して区別します。
editFrom<開始ページまたはテーブル>
|
例: editFromAttributesTable
|
edit<編集する属性のサブセットの名前>
|
例: editAnnotations
|
この操作を操作モデルに追加して、Windchill システムで操作にアクセスできるようにします。
ウィザードのメイン jsp ファイルを作成する
次に、編集ウィザードを記述した jsp ファイルを作成します。一般に、最低でも、属性を編集するステップを 1 つ入れる必要があります。属性編集ステップの高度な設定の詳細については、
再利用可能なウィザードステップのカスタマイズを参照してください。
<%-- 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 の initializeItemTagのすぐ下に autoCheckOutItem タグを含める必要があります。
<%@ taglib prefix="wip"
uri="http://www.ptc.com/windchill/taglib/workinprogress"%>
...
<wip:autoCheckOutItem/>
ウィザードを開く前に、このタグによってオブジェクトが現在のユーザーにチェックアウトされます。
ボタンセット
処理可能オブジェクトを編集するウィザードでは通常、以下の 2 つのボタンセットのいずれかが使用されます。
• "EditWizardButtons" (複数ステップウィザード)
• "NoStepsEditWizardButtons" (単一ステップウィザード)
これらには「保存」および「チェックイン」ボタンが含まれます。
nonWorkable オブジェクトを編集するには、通常、以下のいずれかを使用します。
• DefaultWizardButtonsNoApply (複数ステップウィザード)
• NoStepsWizardButtons (単一ステップウィザード)
これらはすべて <Windchill>/codebase/config/actions/actionmodels.xml. で定義されています。
必要に応じてカスタムステップを作成する
編集ウィザードのカスタムステップも、
ウィザード処理と
単一オブジェクトを作成するウィザードの構築で説明されている手順をそのまま使って作成できます。
再利用可能なステップを選択する
「ウィザードのメイン jsp ファイルの作成」のセクションですでに、オブジェクト属性を編集する再利用可能なステップを選択しています。このステップのカスタマイズ方法、および、使用できるその他の再利用可能なステップの詳細については、
再利用可能なウィザードステップを参照してください。
カスタマイズポイント
フォームプロセッサとフォームプロセッサ委任の作成
編集ウィザードでは、次の 2 つのフォームプロセッサクラスを使用できます。
com.ptc.core.components.forms.DefaultEditFormProcessor - for nonWorkable objects
com.ptc.core.components.forms.EditWorkableFormProcessor- for Workable objects
これらのクラスは、目的に応じて拡張できます。
これらのプロセッサは以下を実行します。
preProcess() メソッド
• 永続オブジェクトに対して TypeInstance を作成することを除き、CreateObjectFormProcessor の preprocess() メソッドと同じです。
doOperation() メソッド
• super.doOperation() を呼び出し、ウィザードに登録される FormProcessorDelegates の doOperation() メソッドを呼び出します。
• PersistenceHelper.manager.save() を呼び出し、データベースに Persistable を格納します。
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 |
提供されているいずれかのフォームプロセッサが要件を満たしている場合、独自のプロセッサを記述する必要はありません。そのプロセッサを、ウィザード操作のコマンドサブタグのクラス属性の値として指定してください。プロセッサが要件を満たしていない場合、いずれかのプロセッサのサブクラスを記述してウィザードフォームデータを処理する必要があります。独自の
processor.netmarkets/jsp/components/beginWizard.jspf を実装する必要がある場合の例については、
単一オブジェクトを作成するウィザードの構築の「フォームプロセッサとフォームプロセッサ委任の作成」のセクションを参照してください。
独自のプロセッサを作成する場合は、各ウィザードステップの後に、標準バリデータクラスによって preProcess() メソッドが呼び出されます。このメソッドのデータベースを修正しないでください。
サンプルコード
「製品を編集」ウィザードのメイン JSP
ファイル名: <Windchill>/codebase/netmarkets/jsp/product/editProductWizard.jsp
注記: これは 1 ステップのウィザードです。
<%@ 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 が呼び出されます。部品が分類され、ウィザードの開始ポイントに応じてほかの UI 設定が行われる場合、この関数によって loadClassificationStep が呼び出され、分類ステップがロードされます。
<%@ 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
単一オブジェクトを作成するウィザードの構築の「サンプルコード」のセクションも参照してください。