4. ポートレットの開発(スクリプト開発編)¶
目次
4.1. 概要¶
画面開発 (render サイクル)
ポートレットに表示する画面を作成します。モードやウィンドウステータスを判定して切り替えることも可能です。表示モード用の画面は必ず必要です。アクション処理 (processAction サイクル)
ポートレットからサブミットされたデータの処理を作成します。作成されたファンクションコンテナは、Action ハンドラと呼ばれ、ポートレット編集画面で登録することによって利用できます。また、Event を設定することによって、別のポートレットと連携することも可能です。イベント処理 (processEvent サイクル)
他のポートレットから発生したイベントの受信処理を作成します。作成されたファンクションコンテナは、Event ハンドラと呼ばれ、ポートレット編集画面で登録することによって利用できます。Action ハンドラで Event を設定された場合のみ実行されます。
ポートレットのライフサイクルごとに、以下のように作成するファイルが異なります。
render 必須 スクリプト開発モデルの画面。プレゼンテーションページとファンクションコンテナ。 processAction 任意 handleAction ファンクションを実装したファンクションコンテナ。 processEvent 任意 handleEvent ファンクションを実装したファンクションコンテナ。
4.2. ポートレットAPI¶
4.2.1. PortalManager¶
4.3. ポートレットモード¶
4.3.1. ポートレットモードの設定¶
ポートレット定義の変更ポートレットモードの設定は以下のファイルで管理されています。intra-mart Accel Platform を停止して設定後、再起動を行います。設定ファイル%CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.portal.portlets.jssp_8.0.0/plugin.xml設定箇所<?xml version="1.0" encoding="utf-8"?> <plugin> <extension point="jp.co.intra_mart.portal.portlets"> <portlet id="jp.co.intra_mart.portal.portlets.jssp" name="PresentationPagePortlet" display-name="%display-name" description="%description" version="8.0.0" rank="1"> <portlet-class>jp.co.intra_mart.foundation.portal.portlets.model.PresentationPagePortlet</portlet-class> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> <portlet-mode>EDIT</portlet-mode> <!-- ここにモードを追加 --> </supports> ... </portlet> </extension> </plugin>
4.3.2. ポートレットモードの取得¶
(ex.) view, edit, help
var renderRequest = PortalManager. getRenderRequest(); var portletMode = renderRequest. getPortletMode();
4.4. ウィンドウステータス¶
4.4.1. ウィンドウステータスの取得¶
(ex.) normal, maximized, minimized
var renderRequest = PortalManager. getRenderRequest(); var windowState = renderRequest. getWindowState();
4.5. 画面開発 (renderサイクル)¶
4.5.1. RenderRequest¶
RenderRequest の取得
var renderRequest = PortalManager.getRenderRequest();ただし、通常の Webページと共用できるように、ページ引数は、init 関数の request オブジェクトを利用して取得することも可能です。ページ引数の取得
function init(request) { var renderRequest = PortalManager.getRenderRequest(); // value1 と value2 は同じ値 var value1 = request.param1; var value2 = renderRequest.param1; }RenderRequest から、現在のポートレットモード、ウィンドウステータスなどが取得できます。
4.5.1.1. RenderRequestのスコープ¶
portal_cd ポートレットが配置されているポータル画面のキー。 portalKind ポートレットが配置されているポータル画面のポータル種別。以下の値が取得される。
user ユーザポータル group グループポータル
4.5.2. ActionURL, RenderURL¶
ActionURL Action 機能を呼び出す URL RenderURL ポータル画面を再表示するための URL
ActionURL, RenderURL の取得
var actionURL = PortalManager.createActionURL(); var renderURL = PortalManager.createRenderURL();
ファンクションコンテナ
// ActionURL var actionURL = ""; function init(request) { // ActionURL を取得する actionURL = PortalManager.createActionURL(); }
プレゼンテーションページ
<!-- ActionURL を指定 --> <form name="sampleActionForm" action="<IMART type="string" value=actionURL></IMART>" method="POST"> <!-- アクション処理で使用する値 --> <INPUT type="text" name="param1" value=""> <INPUT type="submit" value="実行"> </form>
- ポータル画面の表示には、「portal/desktop」というパスが割り振られています。そのため、このサービスID-URLにサブミットすることでもポータル画面の再表示が可能ですが、その場合ポータル情報を引き継ぐことができませんので、上記の方法を利用するようにしてください。
- アクション処理を呼び出すためには、ActionURL にサブミットする以外にありません。ポートレット管理画面で Action ハンドラを登録し、プレゼンテーションページで ActionURL にサブミットするようにしてください。Action ハンドラが未定義の場合、単純にポータル画面を再表示します。
- ActionURL はポータル情報を含むため、データ量が多くなります。メソッドは POST を指定するようにしてください。
4.5.3. 通常の画面とポートレット画面を共用するには¶
【ポートレット画面と共用する通常画面のプレゼンテーションページ】
<html> <head> <link src="sample.css" type="text/css"> </head> <body> <div> ヘッダ表示情報 </div> <!-- 共用コードをインクルードする --> <!-- param1, param2 引き継ぐリクエストパラメータ --> <IMART type="include" page="sample/sample-portlet" param1=value1 param2=value2 /> <div> フッタ表示情報 </div> </body> </html>
4.6. アクション処理 (processActionサイクル)¶
4.6.1. Actionハンドラの作成¶
以下にイベントを設定する Action ハンドラの例を示します。
ファンクションコンテナを作成し、以下の関数を定義します。
(このファンクションコンテナを Action ハンドラと呼びます。)(ex.) sample/portal/sample_action.js
// 「handleAction」という名前で関数を定義する。 function handleAction(request, response) { // リクエスト引数を取得 var value = request.param1; // イベントを設定 ( キー: "event1"、値: value ) response.setEvent("im_event1", value); }
Action ハンドラは、render で利用するファンクションコンテナに記述しても構いません。また、Java で作成された Action ハンドラクラスを利用することもできます。以下のような値を return することでもイベントを発生させることができます。
Object プロパティのキーと値をペアとするイベント その他 文字列として判断し、キーと値が同じイベント ただし、IM 用ポートレットに対するイベントを発生させるためには、 ‘im_’ で始まるキーを指定する必要があります。
response.setEvent()で設定する値については、「ポータルAPI リスト」の ActionResponse を参照してください。
Action ハンドラをポートレットに登録します。
「 画面開発 (renderサイクル) 」で作成した画面をポータル画面に配置し、ポートレットからアクション処理を呼び出します。
4.6.2. ActionRequest, ActionResponse¶
4.6.3. RenderParameterの設定¶
(ex.) processAction サイクルでの RenderParameter の設定
// RenderParameter を設定する場合。 response.setRenderParameter("param1", "value1"); // RenderParameter を削除する場合。 response.setRenderParameter("param2", null);(ex.) render サイクルでの RenderParameter の利用
String value = request.param1;
4.6.4. イベントの設定¶
(ex.) processAction サイクルでのイベントの設定
response.setEvent(eventId, eventValue);
4.6.5. 利用可能なActionハンドラ¶
4.7. イベント処理 (processEventサイクル)¶
4.7.1. Eventハンドラの作成¶
以下に RenderParameter を設定する Event ハンドラの例を示します。
ファンクションコンテナを作成し、以下の関数を定義します。
(このファンクションコンテナを Event ハンドラと呼びます。)
(ex.) sample/portal/sample_event.js
// 「handleEvent」という名前で関数を定義する。 function handleEvent(event, request, response) { // イベント情報を取得 var eventId = event.id; var value = event.value; // 画面表示に利用するリクエストパラメータを設定 response.setRenderParameter(eventId, value); }
- Event ハンドラは、render で利用するファンクションコンテナに記述しても構いません。また、Java で作成された Event ハンドラクラスを利用することもできます。
Event ハンドラをポートレットに登録します。
- 「 画面開発 (renderサイクル) 」で作成した画面と「 アクション処理 (processActionサイクル) 」で作成したイベントを呼び出すことができるポートレットをポータル画面に配置し、イベントを設定するポートレットからアクション処理を呼び出します。
4.7.2. EventRequest, EventResponse¶
4.7.3. Eventオブジェクト¶
プロパティ名 型 値 id String アクション処理で設定されたイベント ID省略された場合、文字列「ImEvent」が設定される。value String アクション処理で設定されたイベントの値オブジェクトを設定した場合も文字列として取得される。source String Event を設定したポートレットのポートレットコード
4.7.4. RenderParameterの設定¶
(ex.) processEvent サイクルでの RenderParameter の設定
// RenderParameter を設定する場合。 response.setRenderParameter("param1", "value1"); // RenderParameter を削除する場合。 response.setRenderParameter("param2", null);(ex.) render サイクルでの RenderParameter の利用
request.getParameter(eventId);
4.7.5. イベントの設定¶
(ex.) processEvent サイクルでのイベントの設定
response.setEvent(eventId, eventValue);
4.8. 「重要なお知らせ」ポートレットについて¶
- 新着情報の種類を示すためのカテゴリ
- 新着情報の内容(概要)
- 配信日付
- 新着情報に紐付く遷移先の情報(リンク)
新着情報を取得するプロバイダを実装する。「重要なお知らせ」ポートレットに表示される情報の配列を取得する以下のファンクションを実装したファンクションコンテナを作成します。
ファンクション名 : getNewArrivedList
パラメータ
パラメータ名 型 内容 user String ユーザ ID group String ログイングループ ID properties Object 設定ファイルに定義された、初期パラメータ このファンクションは、以下の新着情報オブジェクトの配列を返却する必要があります。
新着情報オブジェクト
プロパティ 型 内容 category String 新着情報の種類を示すためのカテゴリ contents String 新着情報の内容(概要) url String 新着情報の詳細情報へ遷移する URL(リンク) popup Boolean 詳細情報へ遷移する際にポップアップするかどうかのフラグ date String 新着情報の配信日付(システム日時) <sample_provider.js>
// getNewArrivedList 関数を実装します。 function getNewArrivedList(user, group, properties) { // 新着情報の配列を作成します。 var values = new Array(); for (var i = 0; i < result.countRow; i++) { values[i] = new Object(); values[i].category = result.data[i].category; // 新着情報の種類を示すためのカテゴリ values[i].contents = result.data[i].contents; // 新着情報の内容(概要) values[i].date = result.data[i].arrived_date; // 配信日付 values[i].url = result.data[i].url; // 新着情報に紐付く遷移先の情報(リンク) values[i].popup = ("1" == result.data[i].popup); // リンクへ参照時にポップアップを呼び出すかどうか } // 新着情報の配列を返却します。 return values; } プロバイダの実装を定義する。実装したプロバイダクラスについての情報は、%PUBLIC_STORAGE_PATH%/portal/system_notice.xml に 以下の情報を定義します。<プロバイダ設定ファイル>
要素 説明 new-arrived-portlet/sort 取得した新着情報をカテゴリでソートするかどうかを定義します。 new-arrived-portlet/provider/provider-class プロバイダの実装クラス。固定です。 new-arrived-portlet/provider/init-param 新着情報を取得するファンクションコンテナを「pagePath」パラメータに定義します。それ以外の任意のパラメータを設定して、ファンクションコンテナで利用できます。たとえば、上記のスクリプト開発モデルプログラムより新着情報を取得するプロバイダを使って新着情報を取得する場合は、以下のように定義を行います。
<system_notice.xml>
<new-arrived-portlet> <sort>true</sort> : : <provider> <!-- スクリプト開発モデル用のプロバイダクラス。固定とする --> <provider-class> jp.co.intra_mart.foundation.portal.general_purpose_portlet.provider.PageBaseCallProvider </provider-class> <init-param> <!-- プロバイダを定義する --> <param-name>pagePath</param-name> <param-value>/hoge/sample_provider.js</param-value> </init-param> </provider> </new-arrived-portlet>プロバイダを複数登録して、複数の新着情報を1つのポートレットに表示することも可能です。