12 カスタム・データ・アクション・プラグインの作成
Oracle Analyticsで使用するカスタム・データ・アクション・プラグインを作成できます。
データ・アクション・プラグインは、Oracle Analyticsを拡張し、ユーザーがビジュアライゼーションでデータ・ポイントを選択し特定のアクションを起動できるようにします。Oracle Analyticsは、多くの一般的なユースケースを網羅するデータ・アクションのコア・セットを提供しますが、独自のデータ・アクション・プラグインを記述することで、この機能をより詳細に拡張できます。
カスタム・データ・アクション・プラグインを作成するには、次の要素に関する基本的な理解が必要です:
- JavaScript
- RequireJS
- JQuery
- KnockoutJS
テンプレートからのデータ・アクション・プラグインの生成
一連のコマンドを使用して開発環境を生成し、カスタム・データ・アクション・プラグインを作成するために必要なフォルダとファイル付きでHTTP APIデータ・アクションを移入します。
すべてのプラグイン・ファイルは、同じ基本構造に従います。ファイルとフォルダを手動で作成することも、それらをテンプレートから生成することもできます。これを行うツールは、Oracle Analytics Desktopに付属しているOracle Analytics Desktopソフトウェア開発キット(SDK)に含まれています。Oracle Analytics Desktop SDKのリファレンスを参照してください。
次のコマンドを使用して開発環境を生成し、それにHTTP APIデータ・アクションを移入します。
生成されたフォルダとファイル
新しく生成されたデータ・アクション開発環境には、次のフォルダとファイルが含まれます:
1 %PLUGIN_DEV_DIR%\src\customdataaction
2 company-mydataaction\
3 extensions\
4 oracle.bi.tech.plugin.dataaction\
5 company.mydataaction.json
6 nls\
7 root\
8 messages.js
9 messages.js
10 mydataaction.js
11 mydataactionstyles.css
12 plugin.xml
- 行2:
company-mydataaction
フォルダは、指定したIDです。 - 行6:
nls
フォルダには、プラグインでネイティブ言語サポートを提供できるようにする外部化文字列のファイルが含まれます。 - 行7:
nls\root
フォルダ以下のファイルの文字列は、リクエストされた言語の翻訳が使用できない場合に使用されるデフォルト文字列です。 - 行8:
messages.js
ファイルには、追加可能なプラグイン用の外部化文字列が含まれます。 - 行9:
messages.js
ファイルには、ローカライズされた文字列を提供する追加言語ごとに追加したエントリが含まれる必要があります。翻訳を追加する各ロケールのnls
フォルダ以下に、対応するフォルダを追加する必要があります。各フォルダには、nls\root
フォルダ以下に追加されたファイルと同じファイル名で、同じファイル・セットが含まれる必要があります。 - 行10:
mydataaction.js
ファイルは、カスタム・データ・アクションを開発するための開始ポイントを提供する、新しく生成されたJavaScriptモジュール・テンプレートです。 - 行11:
mydataactionstyles.css
ファイルには、追加する予定があり、データ・アクションのユーザー・インタフェースで使用できる任意のCSSスタイルを含めることができます。 - 行12:
plugin.xml
ファイルは、Oracle Analyticsにプラグインおよびそのファイルを登録します。
データ・アクション・ベース・クラスの拡張
拡張するデータ・アクションのサブクラスを選択し、必要なフォルダとファイルを生成したら、新しいデータ・アクションに固有のコードの記述を開始できます。
新しく生成されたデータ・アクション・コードは、%PLUGIN_DEV_DIR%\src\dataaction
以下にあります。ファイルおよびフォルダ構造の説明は、「生成されたフォルダとファイル」を参照してください。編集する必要のあるメイン・ファイルは、JavaScriptファイルです。たとえば、カスタム・データ・アクションIDがcompany.MyDataaction
である場合、検索するファイルは%PLUGIN_DEV_DIR%\src\dataaction\company-mydataaction\mydataaction.js
です。
格納する必要のある追加プロパティがデータ・アクションに含まれる場合、それらを監視可能プロパティとしてKnockoutモデルに追加する必要があります。データ・アクションのIDがcompany.MyDataaction
である場合、Knockoutモデルはmydataaction.MyDataActionKOModel
と呼ばれ、mydataaction.js
の最上位付近にあります。デフォルトで、このKnockoutモデルはデータ・アクションのスーパークラスで使用されるKnockoutモデルを拡張するように構成されるため、モデルに追加プロパティを追加するだけで済みます。
HTTPAPIDataAction
ベース・クラスを拡張しているデータ・アクションでは、次のようなコードを使用します:
1 - mydataaction.MydataactionKOModel = function (sClass, sID, sName, sVersion, sScopeID, aAnchorToColumns, eValuePassingMode, sURL,
eHTTPMethod, sPOSTParams)
2 - {
3 - mydataaction.MydataactionKOModel.baseConstructor.call(this, sClass, sID, sName, sVersion, sScopeID, aAnchorToColumns, eValuePassingMode, sURL, eHTTPMethod, sPOSTParams);
4 - };
5 - jsx.extend(mydataaction.MydataactionKOModel, dataaction.HTTPAPIDataActionKOModel);
- 行1: これは、Knockoutモデルのコンストラクタです。モデルが格納する必要のあるプロパティを受け入れます。
- 行3: これは、スーパークラスのコンストラクタであり、Knockoutモデルのスーパークラスのいずれかによって処理されるすべてのプロパティに対する値の受渡し先となる
baseConstructor
でもあります。 - 行5: これは、このKnockoutモデル・クラスのスーパークラスを設定します。
次のようなコードを使用して文字列と配列を追加し、データ・アクションによって永続化されるプロパティを設定します。
1 mydataaction.MydataactionKOModel = function (sClass, sID, sName, sVersion, sScopeID, aAnchorToColumns, eValuePassingMode, sURL, eHTTPMethod, sPOSTParams)
2 {
3 mydataaction.MydataactionKOModel.baseConstructor.call(this, sClass, sID, sName, sVersion, sScopeID, aAnchorToColumns, eValuePassingMode, sURL, eHTTPMethod, sPOSTParams);
4
5
6 // Set Defaults
7 sMyString = sMyString || "My default string value";
8 aMyArray = aMyArray || [];
9
10
11 // Asserts
12 jsx.assertString(sMyString, "sMyString");
13 jsx.assertArray(aMyArray, "aMyArray");
14
15
16 // Add observable properties
17 this.sMyString = ko.observable(sMyString);
18 this.aMyArray = ko.observableArray(aMyArray);
19 };
20 jsx.extend(mydataaction.MydataactionKOModel, dataaction.HTTPAPIDataActionKOModel);
オーバーライドするデータ・アクションの継承メソッドの選択
各データ・アクションは、適切に動作するために様々なメソッドを実装する必要があるため、変更して使用できる動作を実装しているメソッドをオーバーライドすることになります。
汎用メソッド
HTTPAPIDataAction
などの具象データ・アクション・クラスのいずれかを拡張する場合、必要なメソッドのほとんどはすでに実装されており、変更して使用できる動作を実装しているメソッドをオーバーライドするだけで済みます。
この項では、様々なメソッドとその予期される動作について説明します。
すべてのタイプのデータ・アクションは、ここで説明されているメソッドを実装する必要があります。
create(sID, sName)
create()
静的メソッドは、新しいデータ・アクションを作成してドロップダウン・メニューからデータ・アクション・タイプを選択したときにコールされます。このメソッドの役割は次のとおりです:
- データ・アクションで使用するKnockoutモデル・クラスの構築。
Knockoutモデル・クラスには、他のすべてのプロパティにとって意味のあるデフォルト値とともに
create()
メソッドに渡されるIDと名前が含まれる必要があります。たとえば、通貨換算データ・アクションでは、ドルに換算するデフォルト通貨を設定できます。Knockoutモデルは、デフォルト値を提供するための適切な場所です。 - Knockoutモデルからのデータ・アクションのインスタンスの構築。
- データ・アクションのインスタンスの返却。
invoke(oActionContext, oDataActionContext)
invoke()
メソッドは、ビジュアライゼーションのデータ・ポイントのコンテキスト・メニューからユーザーがデータ・アクションを起動したときにコールされます。このメソッドは、選択されたデータ・ポイント、ビジュアライゼーション、フィルタ、ワークブックおよびセッションを記述したメタデータを含むDataActionContext
引数を渡します。「データ・アクション・サービス・クラス」を参照してください。
validate()
validate()
メソッドは、「データ・アクション」ダイアログでユーザーが「OK」をクリックしたときに各データ・アクションでコールされます。validate()
メソッドは、すべてが有効であることを示す場合はnull
を返し、何かが無効である場合はDataActionError
を返します。ダイアログでいずれかのデータ・アクションにエラーが発生した場合、ダイアログは閉じられず、ユーザーにエラー・メッセージが表示されます。このメソッドは、this.validateName()
メソッドを使用してデータ・アクションの名前を検証します。
getGadgetInfos(oReport)
getGadgetInfos()
メソッドは、ユーザー・インタフェースでデータ・アクション・プロパティ・フィールドを表示できるようにするためにコールされます。このメソッドは、ユーザーが希望するユーザー・インタフェースへの表示順序でGadgetInfos
の配列を返します。ガジェットは、最も一般的なタイプのすべてのフィールドに対して提供されますが(たとえば、テキスト、ドロップダウン、パスワード、複数選択、ラジオ・ボタン、チェック・ボックスなど)、より複雑なフィールドが必要な場合はカスタム・ガジェットを作成できます(たとえば、複数のガジェットをまとめてグループ化する場合や、ユーザーの選択したオプションに応じて異なるガジェット・フィールドを表示する場合など)。配列で必要な各GadgetInfo
を構築するメソッドを作成する方が、後でサブクラスがその提供されたGadgetInfo
から選択しやすくなるため、ベスト・プラクティスです。このベスト・プラクティスに従う場合、ユーザー・インタフェースで使用されるフィールドごとにGadgetInfo
を返すことができる各種データ・アクション・ベース・クラスによって実装された様々なメソッドがすでに用意されています。また、これらのGadgetInfo
のいずれかが必要な場合、対応するcreate****GadgetInfo()
メソッドをコールして、その戻り値をガジェットの配列に配置します。
isAllowedHere(oReport)
isAllowedHere()
メソッドは、ユーザーがビジュアライゼーションのデータ・ポイントを右クリックし、ユーザー・インタフェースがコンテキスト・メニューの生成を開始したときにコールされます。選択されたデータ・ポイントに関連するデータ・アクションが存在する場合、メソッドはtrue
を返し、そのデータ・アクションがコンテキスト・メニューに表示されます。メソッドがfalse
を返した場合、データ・アクションはコンテキスト・メニューに表示されません。スーパークラスから継承したデフォルト動作を受け入れることを検討してください。
upgrade(oOldDataActionJS)
最初のデータ・アクションを作成する場合、upgrade(oOldDataActionJS)
メソッドを使用しないでください。このメソッドは、最初のKnockoutモデルの作成後に、第2バージョンのKnockoutモデルのプロパティを大幅に変更する場合にのみ使用してください。たとえば、最初のバージョンのデータ・アクションではそのKnockoutモデルにURLを格納するが、次のバージョンでは別個のプロパティにURLコンポーネント部分を格納する予定の場合です(たとえば、protocol
、hostname
、port
、path
、queryString
、bookmark
など)。
第2バージョンのKnockoutモデル・コードは、問題が発生する可能性のある最初のバージョンのKnockoutモデル・コードに保存されているデータ・アクションを開こうとする場合があります。この問題を解決するため、システムでは、現在のデータ・アクション・コードのバージョンが、開かれようとしているデータ・アクションのバージョンより新しいことを認識すると、新しいデータ・アクション・クラスのupgrade()
メソッドをコールして、古いデータ・アクションのKnockoutモデル(JSONオブジェクトにシリアライズ済)を渡します。その後、古いJSONオブジェクトを使用して新しいKnockoutモデルに移入し、JSONオブジェクトのアップグレード・バージョンを返すことができます。これにより、データ・アクション・コードを改善しても、古いデータ・アクション・メタデータは動作し続けることが保証されます。
HTTPAPIDataActionメソッド
HTTPAPIDataAction
クラスを拡張する場合、オーバーライドできる次の追加メソッドが用意されています:
getAJAXOptions(oDataActionContext)
getAJAXOptions()
メソッドは、データ・アクションのinvoke()
メソッドによってコールされます。getAJAXOptions()
メソッドは、データ・アクションで作成されるHTTPリクエストを記述したAJAX Options
オブジェクトを作成します。getAJAXOptions()
メソッドには、選択されたデータ・ポイント、ビジュアライゼーション、フィルタ、ワークブックおよびセッションを記述したメタデータを含むoDataActionContext
オブジェクトが渡されます。統合しようとしているHTTP APIの要件どおりにAJAX Options
を設定し、HTTPRequest
が成功するかエラーで終了した場合にコールする関数を指定します。jQuery.ajax
オブジェクトとそのプロパティの説明は、JQueryのWebサイトを参照してください。
次の実装は、HTTPAPIDataAction
クラスから継承されています。継承メソッドをリライトして要件を指定する必要があります。たとえば、HTTPリクエストと、HTTPレスポンスを処理するコードを構成します。この実装は、getAJAXOptions()
関数に渡されるパラメータ、返されることが予期されるオブジェクト、およびメソッド内でコードを構成する方法の明確な例を示しているため、役に立ちます。
1 /**
2 * This method returns an object containing the AJAX settings used when the data action is invoked.
3 * Subclasses may wish to override this method to provide their own behavior.
4 * @param {module:obitech-reportservices/dataactionmanager.DataActionContext} oDataActionContext The context metadata describing where the data action was invoked from.
5 * @returns {?object} A JQuery AJAX settings object (see http://api.jquery.com/jQuery.ajax/ for details) - returns null if there is a problem.
6 */
7 dataaction.HTTPAPIDataAction.prototype.getAJAXOptions = function (oDataActionContext)
8 {
9 jsx.assertInstanceOfModule(oDataActionContext, "oDataActionContext", "obitech-reportservices/dataactionmanager", "DataActionContext");
10
11 var oAJAXOptions = null;
12 var oKOViewModel = this.getKOViewModel();
13 var sURL = oKOViewModel.sURL();
14 if (sURL)
15 {
16 // Parse the URL
17 var sResultURL = this._parseURL(sURL, oDataActionContext);
18 if (sResultURL)
19 {
20 // Parse the POST parameters (if required)
21 var eHTTPMethod = oKOViewModel.eHTTPMethod()[0];
22 var sData = null;
23 if (eHTTPMethod === dataaction.HTTPDataActionKOModel.HTTPMethod.POST)
24 {
25 var sPOSTParams = oKOViewModel.sPOSTParams();
26 sData = sPOSTParams.replace(dataaction.AbstractHTTPDataAction.RegularExpressions.LINE_END, "&");
27 sData = this._parseURL(sData, oDataActionContext, false);
28 }
29 oAJAXOptions = {
30 type: eHTTPMethod,
31 url: sResultURL,
32 async: true,
33 cache: false,
34 success: function (/*oData, sTextStatus, oJQXHR*/)
35 {
36 oDataActionContext.getReport().displaySuccessMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_SUCCESSFUL.format(oKOViewModel.sName()));
37 },
38 error: function (oJQXHR/*, sTextStatus, sError*/)
39 {
40 oDataActionContext.getReport().displayErrorMessage(messages.HTTP_API_DATA_ACTION_INVOCATION_FAILED.format(oKOViewModel.sName(), oJQXHR.statusText, oJQXHR.status));
41 }
42 };
43 if (sData)
44 {
45 oAJAXOptions.data = sData;
46 }
47 }
48 }
49 return oAJAXOptions;
50 };
Knockoutモデル変更のためのアップグレード・ハンドラの使用
一部のKnockoutモデル変更では、アップグレード・ハンドラを使用してデータ・アクション・プラグインをアップグレードする必要があります。
Knockoutモデルを変更せずにデータ・アクション・プラグインを改善する場合、通常どおりJavaScriptまたはCSSファイルを編集し、新しいZIPファイルを作成して、既存のデータ・アクション・プラグインを新しいZIPファイルに置き換えます。ただし、データ・アクションのKnockoutモデルを変更した場合、データ・アクションのVERSION
プロパティを変更してアップグレード・ハンドラを指定する必要があります。
アップグレード・ハンドラを使用する必要があるかどうかを決定します:
- Knockoutモデルのプロパティ名を変更する場合。
- Knockoutモデルの複数のプロパティを単一のプロパティに結合する場合。
- Knockoutモデルの単一のプロパティを複数のプロパティに分割する場合。
- Knockoutモデルに新しいプロパティを追加する際に、その正しいデフォルト値がKnockoutモデルの他の値に依存する場合。
- Knockoutモデルに新しいプロパティを追加する際に、データ・アクションのすべての既存の使用方法に対して正しいデフォルト値を指定できる場合。
- データ・アクション・コードで使用しなくなったためにKnockoutモデルからプロパティを除去する場合。