基本的なカスタマイズ > ユーザーインタフェースのカスタマイズ > 操作の追加と UI への組み込み > メニューの定義 > 操作の表示 > テーブルの操作列の表示
  
テーブルの操作列の表示
* 
テーブルに操作列を追加することはできなくなっています。データストアに操作列はありますが、UI には表示されません。各行で右クリックすると操作メニューが表示されるだけです。
1. actions.xml ファイルで操作を定義します (新規操作の定義を参照)。
2. 操作モデルに操作を追加します (新規操作の定義を参照)。特定のテーブルに対して、操作モデルはいくつかのレベルで設定できます。以下では簡単なレベルから複雑なレベルへと、順に説明します。
a. ビジネスオブジェクトタイプの "menufor" を定義します。
操作モデル定義 (XML ファイル内) で、操作を定義するオブジェクトタイプの menufor 属性を設定します。
<model name="part actions" menufor="wt.part.WTPart">
<action name="view" type="object"/>
.....
</model>
メインメニューからメニューを分岐させるには、操作モデルにサブメニューを追加します。
<model name="part actions" menufor="wt.part.WTPart">
<action name="action_1" type="object"/>
<submodel name="submenu_new"/>
</model>
<model name="submenu_new">
<action name="newViewVersion" type="part"/>
</model>
b. ビルダーで操作モデルを設定します。
menufor 属性で指定するタイプごとに操作モデルは 1 つだけです。テーブルのデフォルトの操作モデルをオーバーライドする場合は、テーブルビルダーで別のモデルを指定できます。テーブルビルダークラスの作成については、MVC コンポーネントを参照してください。
public ComponentConfig buildComponentConfig (ComponentParams params) {
ComponentConfigFactory factory = getComponentConfigFactory ();
JcaTableConfig table = (JcaTableConfig) factory.newTableConfig ();
ColumnConfig actionsMenu = setComponentConfigFactory().
newColumnConfig(DescriptorConstants.ColumnIdentifiers.NM_ACTIONS, true);
(JcaColumnConfig)actionsMenu).setDescriptorProperty
(DescriptorConstants.ActionProperties.ACTION_MODEL,
"model_name_here");
table.addComponent(actionsMenu);
....
return table;
}
c. カスタムデータユーティリティを作成します。
どの操作モデルを使用するか動的に決定する必要があるために、テーブルの menufor 操作モデルを利用できない場合は、操作列のデータユーティリティを作成する必要があります。NmActionDataUtility を継承して、getDataValue() メソッドをオーバーライドします。コンポーネント記述子のプロパティ DescriptorConstants.ActionProperties.ACTION_MODEL を使用する操作モデルの名前に設定します。
public class CustomNmActionDataUtility extends NmActionDataUtility {
@Override
public Object getDataValue(String component_id, Object datum,
ModelContext mc) throws WTException {
String modelName = "foo";
if(...) {
modelName = "bar";
} else {
modelName = "baz";
}

mc.getDescriptor().setProperty( DescriptorConstants.
ActionProperties.ACTION_MODEL, modelName);
return super.getDataValue(component_id, datum, mc);

}
}
datum (行オブジェクト) の異なるタイプに異なる操作モデルを指定することも、モデルコンテキストの情報に基づいて使用する操作モデルを決定して別のロジックを使用することもできます。
* 
操作列に操作を表示しない場合は、操作モデルを EMPTY_ACTION_MODEL に設定できます。そうした場合、「表示する操作はありません」という文字列が操作列に表示されます。
データユーティリティの作成後、ビルダーでテーブルに列を追加します。DescriptorConstants.ColumnIdentifiers.NM_ACTIONS の代わりにカスタム列 ID (たとえば "customNmActions") を使用します。
public ComponentConfig buildComponentConfig (ComponentParams params) {
ComponentConfigFactory factory = getComponentConfigFactory ();
JcaTableConfig table = (JcaTableConfig) factory.newTableConfig ();
ColumnConfig actionsMenu = setComponentConfigFactory().
newColumnConfig(“customNmActions”, true);

....
table.addComponent(actionsMenu);
....
return table;
}
最後に、*.xconf ファイルで、次のようにカスタム列 ID 用のデータユーティリティを登録する必要があります。
<!-- Sample XCONF Entry -->
<Service name="com.ptc.core.components.descriptor.DataUtility">
<Option serviceClass="com.ptc.windchill.dataUtilities.
CustomNmActionDataUtility
" requestor="java.lang.Object"
selector="customNmActions" cardinality="singleton"/></Service>
トラブルシューティング
問題の説明
ソリューション
操作列がテーブルに表示されない
デフォルトでは、操作列は表示されません。ユーザーが参照することはできません。行の右クリックが、行の操作を表示する唯一の方法です。
一部の操作のアイコンが表示されない
UI の標準に従って、システムのいずれかのツールバーで操作のアイコンが表示される場合にのみ、操作メニューにもアイコンが表示されるようになっています。ツールバーに属さない操作について、この制限を回避する場合は、次のようにその操作を持つダミーモデルを作成します。
<model name=”toolbarModelNotUsedAnywhere”>
<action name=”myAction” type=”myActionType”/>
</model>
こうすると、その操作に定義されたアイコンが操作メニューに表示されます。
ユーザーが右クリックすると、「表示する操作はありません」というエラーメッセージが表示される
操作モデルの menufor 属性にそのタイプが (XML ファイルで) 定義されているか確認します。menufor=”your.type.Here”
(テーブルの設定に列を追加するときに、ビルダーで使用するモデルを定義することもできます)
MVC ビルダーで NmActions 列 ID をテーブル設定に追加します。
public ComponentConfig buildComponentConfig
(ComponentParams params) {
ComponentConfigFactory factory
= getComponentConfigFactory ();
JcaTableConfig table =
(JcaTableConfig) factory.newTableConfig ();
table.addComponent (factory.newColumnConfig
(DescriptorConstants.ColumnIdentifiers.NM_ACTIONS
, true));
....
return table;
}
fiddler/firebug を使って、右クリックしたときに実行される servlet/ActionsMenu リクエストの oid パラメータを確認します。それが必要な oid ではない場合、または、oid が存在しない場合、テーブルに使用されているバッキングオブジェクトから正しい NmOid を作成できません。デーブル操作の oid の使用を制御する方法に関する詳細は、NmObjectUtility ドキュメンテーションを参照してください。
テーブル/列で使用する操作モデル定義する場合 (予測される結果の「テーブルの操作列」セクションで説明)。fiddler/firebug を使って、クリックしてメニューを表示するときに実行される servlet/ActionsMenu リクエストの actions パラメータを確認します。actions パラメータの値は定義したモデル名になっていますか。actions=EMPTY_ACTION_MODEL になっている場合、現在のテーブルビューでは操作列が定義されていません。右クリックメニューが機能するには操作列が必要です。「表示」> 「カスタマイズ」を使って、現在のテーブルビューに操作列を追加してください。テーブルビルダーを変更して、操作列をデフォルト列にします。
モデルの操作に定義されているバリデータを確認します。すべての操作が非表示として検証されていますか。その場合は、URL パラメータとして jcaDebug=true を追加すると、無効な操作としてメニューで非表示になっている操作のリストが表示されるはずです。
ユーザーが右クリックすると次のエラーメッセージが表示される。「このオブジェクトにはアクセスできません。またはオブジェクトが存在しません。」
その行オブジェクトに対するアクセス権をユーザーが実際に持っていない場合、このメッセージに問題はありません。
ユーザーがアクセス権を持っている場合 (たとえば、情報ページに移動して、そこで操作メニューを表示できる場合)、fiddler/firebug を使って、右クリックしたときに実行される servlet/ActionsMenu リクエストの oid パラメータを確認します。それが必要な oid ではない場合、または、oid が存在しない場合、テーブルに使用されているバッキングオブジェクトから正しい NmOid を作成できません。デーブル操作の oid の使用を制御する方法に関する詳細は、NmObjectUtility ドキュメンテーションを参照してください。
UI でリストに表示されない操作がある
特定の条件で操作を隠しているバリデータが設定されている可能性があります。バリデータでの操作の設定については、Windchill クライアントアーキテクチャの操作フレームワークを参照してください。
jcaDebug=true を url に追加して、隠れている操作も表示します。jcaDebug オプションを有効にすると、より多くの情報がメニューに表示されます。また、リストの最後にある操作で、そのメニューの操作モデルレポートを表示できます。
表示される操作セットが間違っている
jcaDebug=true を追加して、メニューの操作に設定されたバリデータを確認します。バリデータが想定どおりに機能しているか確認します。
1. タイプによって操作モデルを見つける場合 (予測される結果の「テーブルの操作列」セクションで説明)、そのオブジェクトタイプの操作モデルに menuFor が定義されていますか。
行のオブジェクトタイプに関して見つかる操作モデルを確認するには、com.ptc.netmarkets.util.misc. StandardNmActionService に対する log4j ロガーを有効にします。
2. 使用するモデルがテーブル/列で定義されている場合 (予測される結果の「テーブルの操作列」セクションで説明)。
デフォルトのデータユーティリティがどの操作モデルを返すか確認するには、com.ptc.core.components.factory.dataUtilities.NmActionDataUtility に対する log4j ロガーを有効にします。
jcaDebug パラメータを指定すると、操作モデルレポートへのリンクもメニュー末尾に表示されます。操作モデルレポートには、モデル名、そのモデルの操作セット、モデルの定義場所、ほかのモデルをオーバーライドしているか、などが示されます。想定どおりにモデルが定義されているか確認してください。
列のカスタムデータユーティリティを作成した場合は、正しい列を使用しているか確認します。URL に jcaDebug=true を設定して、列ヘッダーの DOM エレメントを調べ、列 ID が想定どおりか確認します。各列のヘッダーテキストは先頭が列 ID です。たとえば、デフォルト操作列は "nmActions validated by: …" のようなヘッダーテキストになります。