liferay
Liferayのフック
サーチ…
備考
これはバージョン6.2までのLiferay Portalで動作します。
JSPフック
JSPフックは特別なliferayプラグインで、コア・ポートレットjsp-sを変更Welcome in my custom login!を表示するようにログイン・ポートレットを変更したいとしWelcome in my custom login! 。
Hook Pluginの最小構成は次のとおりです。
[project-name]-hook/
└── docroot/
├── WEB-INF/
│ ├── src/
│ ├── lib/
│ ├── liferay-hook.xml
│ ├── liferay-plugin-package.properties
│ └── web.xml
└── META-INF/
├── custom_jsps/
└── MANIFEST.MF
liferay-hook.xmlは、使用しているフックのタイプをliferay-hook.xmlファイルです。ここでは、 liferay-hook.xml中で、フックの適切なパラメータをJSPフック用に定義しています。
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<custom-jsp-dir>/custom_jsps</custom-jsp-dir>
</hook>
login.jspは/docroot/html/portlet/login/login.jsp Liferayに/docroot/html/portlet/login/login.jsp 、 custom_jspsフォルダに同じ名前とパスのjspを追加する必要があります。
フックがデプロイされると、Liferayはliferay-hook.xmlでcustom-jsp-dir値を探し、すべてのポータルJSPをこのディレクトリにあるものに置き換えます。オリジナルのJSPは、フックのアンデプロイ時に復元されるように、 <orginal name>.portal.jsp保存されます。
基本的なLiferayプラットフォームのバージョンの更新やアップグレードに対応できるようにコードを保持したい場合は、新しいJSPで元のJSPを呼び出すこともできます。これを行うには、カスタムJSPで次のパターンを使用します。
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
この場合{ JSP file's path }は、 portlet/login/login.portal.jspなりportlet/login/login.portal.jsp 。これを、元のJSPを拡張することといいます。
次に、コンテンツを追加することができます:
<%
contentHtml = StringUtil.add("Stuff I'm adding BEFORE the original content", contentHtml,"\n");
contentHtml = StringUtil.add(contentHtml,"Stuff I'm adding AFTER the original content","\n");
%>
<%= contentHtml %>
Strutsアクションフック
このタイプのフックは、コアポータル(たとえばc/portal/login )およびポートレットストラットアクション(例えば/login/forgot_password )を無効にするために使用することができます/login/forgot_passwordポータルのこのアクションは、 struts-config.xmlファイルのWEB-INFフォルダ。アクションを上書きするには:
-
docroot/WEB-INF下のフックプラグインのliferay-hook.xmlファイルに、フック要素内にstruts-action要素を追加します。 -
struts-action要素の中に、上書きしているアクションパスを指定するstruts-action-pathと、カスタムアクションstruts-action-implを指定するstruts-action-implを追加します。これは次のようになります:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
-
BaseStrutsPortletActionを拡張するStrutsポートレットアクションクラスを作成します。このクラスの例は次のとおりです。
public class ExampleStrutsPortletAction extends BaseStrutsPortletAction {
public void processAction(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {
System.out.println("Custom Struts Action");
originalStrutsPortletAction.processAction(originalStrutsPortletAction,
portletConfig, actionRequest, actionResponse);
}
public String render(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, RenderRequest renderRequest,
RenderResponse renderResponse) throws Exception {
System.out.println("Custom Struts Action");
return originalStrutsPortletAction.render(null, portletConfig,
renderRequest, renderResponse);
}
}
originalStrutsPortletAction.processActionように、メソッドをオーバーライドすることは必須ではありませんが、Liferayポータルに関してはアクションの動作を変更しないようにするのがベストプラクティスです。このタイプのフックを使用して新しいStrutsアクションを追加することもできます。既存のアクションを変更することと同じです。この場合、 liferay-hook.xmlは次のようになります。
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
こんにちはユーザー "フック"名前
この例では、ログイン後に簡単な「Hello User [name]」を作成する方法を示します。この例は、フックを使用してカスタムアクションを実行することに基づいています
コマンドラインのターミナルから、Plugins SDKのhooksフォルダに移動します。フックプロジェクトを作成するには、作成スクリプトを実行する必要があります。スクリプトを実行する際のフォーマットは次のとおりです。
[sh | bat] [プロジェクト名] "[フック表示名]"を作成します。
LinuxおよびMac OS Xでは、次の例のようなコマンドを入力します。
./create.sh Helloユーザー "Hello User"
Windowsでは、この例のようなコマンドを入力します。
create.bat Helloユーザー "My Hook"
Liferay IDEの新規プロジェクトウィザードと作成スクリプトは、プラグインSDKのフックフォルダにフックプロジェクトを生成します。 Plugins SDKはプロジェクト名に自動的に "-hook"を追加します。
Liferay IDEまたはコマンドラインからフックプロジェクトを作成した場合でも、同じプロジェクト構造になります(前を参照)。
- カスタムアクションをトリガーするイベントを決定します。 portal.propertiesのドキュメントを参照して、一致するイベントプロパティを見つけます。ヒント:イベントプロパティの名前に.eventがあります。 portal.propertiesの次のセクションには、セッション、起動、シャットダウン、およびポータルイベントのプロパティがあります。 セッション - 起動イベント - シャットダウンイベント - ポータルイベント
- フックプロジェクトで、 com.liferay.portal.kernel.events.Actionクラスを拡張するJavaクラスを作成します。 Action.run(HttpServletRequest、HttpServletResponse)メソッドをオーバーライドします。
import com.liferay.portal.kernel.events.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.liferay.portal.model.User;
import com.liferay.portal.util.PortalUtil;
public class HelloUser extends Action {
public void run(HttpServletRequest req, HttpServletResponse res) {
User user = PortalUtil.getUser(req);
System.out.println("Hello User "+user.getScreenName());
}
}
重要:アクションがHttpServletRequestオブジェクトにアクセスする場合は、com.liferay.portal.kernel.events.Actionを拡張します。それ以外の場合は、com.liferay.portal.struts.SimpleActionを拡張します。
フックプロジェクトのdocroot / WEB-INF / srcフォルダ内にプロパティファイルportal.propertiesを作成します。次に、アクションを実行するイベントに対応するポータルイベントプロパティの名前を追加します。アクション・クラスの完全修飾名をプロパティーの値として指定します。
`login.events.post=HelloUser`たとえば、ユーザーのポータル・ロギングの直前にクラスのアクションを実行するには、アクション・クラスをその値として持つlogin.events.preプロパティーを指定します。このプロパティの設定のように見える可能性があります。
重要:login.events.preのようなポータルプロパティは複数の値を受け入れるので、既存の値に値を追加する必要があります。追加のフックからプロパティを繰り返し変更することができます。
単一のフック・プラグインから単一の値を受け入れるポータル・プロパティーのみを変更してください。複数のプラグインからプロパティの値を変更した場合、Liferayは使用する値を知りません。
- docroot / WEB-INF / liferay-hook.xmlファイルを編集して、
フックのポータルプロパティファイル名
<portal-properties>...</portal-properties>要素は、
フックの<hook>...</hook>要素。たとえば、フックのプロパティファイル名がportal.propertiesの場合、この要素を指定します。
<portal-properties>portal.properties</portal-properties>
- あなたのフックを展開し、あなたのフックパスに移動し、
ant clean deployを入力ant clean deployと、distフォルダに.warが表示されます。
今すぐliferayにログインすると、サーバーログに "Hello user Admin"のようなメッセージが表示されます。
モデルリスナーフック
バックグラウンド
モデルリスナーフックは、モデルで取られたイベントをリスンし、応答してコードを実行する、Liferayプラグインの一種です。モデル・リスナー・フックは、ポータルで実行されたアクションに応答する点で、カスタムStrutsアクション・フックと似ています。しかし、Strutsのアクションはユーザーが取ったアクションに反応しますが、モデルリスナーはLiferayモデルを含むイベントに(前または後で)応答します。
相違点
比較のためにStruts Actions v Model Listenersの例をいくつか示します。
- Strutsのアクション
- ユーザーログイン
- アカウント作成
- セッションを延長する
- フォルダを移動する
- モデルリスナー
- フォルダの作成後
- ユーザー情報が更新されると
- ブックマークを削除した後
- 役割の関連付けが行われる前に
Liferayのアーキテクチャを学ぶための最良のリソースは、ソースコードです。すべてのソースファイルはGitHub上にあり、JavaDocsを表示します。 JavaDocsのすべてのコアポータルモデルと、GitHubのすべてのStrutsアクションを見ることができます。
例
このチュートリアルでは、モデルリスナーを開発して、アカウントを最初に作成した後にユーザーに電子メールを送信します。これを行うために、LiferayのBaseModelListenerを拡張するUserModelListenerというクラスを作成します。簡単にフックの作成を行い、以下の設定ファイルに必要な変更をカバーします
portal.properties
liferay-hook.xml
入門
Model Listenerフックの開発を開始するには、まずLiferay IDEまたはLiferay Developer Studioアプリケーションを起動する必要があります。
Liferay IDEとLiferay Developer StudioはカスタマイズされたEclipse開発環境です。それらは非常に似ており、両方の環境で1つの方向で十分なはずです。
開発環境内で以下の手順を実行します。
- 左上の「 ファイル」をクリックします。
- マウスを新規に移動する
- Liferay Plugin Projectをクリックします
このウィンドウを生成します。
上記のように情報を入力してください
- プロジェクト名: ユーザーモデルリスナー
- 既定の場所を使用を選択
- ビルドタイプ: Ant
- プラグインの種類: フック
あなたのプロジェクトがLiferays Plugins SDK Hookディレクトリの中にあることを確認してください。 SDKとランタイムを適切に選択する必要があります。
Package Explorerのパースペクティブに、次のディレクトリ構造が表示されます。
リスナー開発
フックを作成したので、カスタムのUserModelListenerクラスを作成する必要があります。このクラスは、LiferayのBaseModelListenerクラスを拡張します。
LiferayのBaseModelListenerクラスは、ModelListenerインターフェイスを実装する抽象クラスです。 ModelListenerインタフェースを直接実装する必要はありません。すべてのメソッドをオーバーライドする必要があります。
次のメソッドがBaseModelListener抽象クラスを通じてModelListenerインターフェイスによってあなたに提供されています。
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
次のディレクトリにUserModelListenerクラスを作成します。 GUIを使用してクラスを作成するには、次のコマンドを実行します
- 左上の「 ファイル」をクリックします。
- マウスを新規に移動する
- クラスをクリック
docroot/
WEB-INF/
src/
下記の情報を入力してください
UserModelListenerクラス内に次のコードを貼り付けます
package com.example.hook;
import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User;
import javax.mail.internet.InternetAddress;
public class UserModelListener extends BaseModelListener<User> {
private User user = null;
@Override
public void onAfterCreate(User user) throws ModelListenerException {
this.user = user;
if(isValidEmail()) {
sendEmail("[email protected]", user.getEmailAddress(), "Welcome!", "Your account is created!");
}
}
private boolean isValidEmail() {
return Validator.isNotNull(user.getEmailAddress()) && Validator.isAddress(user.getEmailAddress());
}
private void sendEmail(String from, String to, String subject, String body) {
try {
MailServiceUtil.sendEmail(new MailMessage(new InternetAddress(from), new InternetAddress(to), subject, body, false));
} catch (Exception e) {
System.err.print("E-Mail spawned by User Model Listener failed to " + user.getFullName() + " with message " + e.getMessage());
}
}
}
プロパティ設定
カスタムリスナーとモデルとの関連付けを構成するには、いくつかの最終調整を行う必要があります。まず、次のディレクトリに新しいportal.propertiesファイルを作成します 。
docroot/
WEB-INF/
src/
+ portal.properties
ファイルには1行だけ追加する必要があります。
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
これを一般化するには、Model Listenerに対して、関連するプロパティの値を作成するには、
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
言い換えれば、 com.example.code内にパッケージ化されたCustomerDLFolderModelListenerクラスをDLFolderモデル用に記述した場合 、次のプロパティがあります
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
最後に、liferay-hook.xmlファイルを探します。 ソースビューで、次のように記述します。
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
説明
- 1行目はオプションのプロローグで、ドキュメントのバージョンと(場合によっては)文字セットを指定します。
- 2行目は正式なDocType定義 (DTD)で、どの要素と属性が有効かを明示的に定義します
- 3行目と5行目は、親のHook要素 (このDTDでサポートされている有効な要素の1つ)
- 4行目で$ {liferay.home}の portal.propertiesファイルが上書きされ、
このXMLファイルで使用できる他の要素を確認するには、 DocType定義内のURLを参照できます。これは、 DTDを持つすべてのXMLおよびSGMLファイルの標準です。 DTDを持つLiferay XMLファイルのもう1つの例は、 service.xml ( Hibernateに基づくLiferayのORM実装)です。
ビルドとデプロイ
フックのビルドとデプロイは簡単なプロセスです。 Liferayプラグインの開発は、ビルドと依存関係の自動化をサポートしています
- 蟻
- アイビー
- Maven
- 受け台
この例では、ビルド自動化のためにAntを使用しました。 build.xmlファイルにはビルドコマンド( Antの ターゲットと呼ばれる)が含まれています。フックを構築するには、次のコマンドを実行します。
- build.xmlファイルの場所
- IDEで、 build.xmlファイルをAntパースペクティブにドラッグします
- ファイルを展開してすべてのターゲットを実行する
コンソールビューでは、次のようなものが表示されます
Buildfile: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\build.xml
all:
clean:
[delete] Deleting directory C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
clean-portal-dependencies:
compile:
merge:
compile-import-shared:
[mkdir] Created dir: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[copy] Copying 5 files to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\lib
compile-java:
[copy] Copied 3 empty directories to 3 empty directories under C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[javac] Compiling 1 source file to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
merge:
war:
clean-portal-dependencies:
[zip] Building zip: C:\liferay-plugins-sdk-6.2-ee-sp11\dist\User-Listener-Hook-hook-6.2.10.1.war
deploy:
[copy] Copying 1 file to C:\liferay-portal-6.2-ee-sp11\deploy
BUILD SUCCESSFUL
Total time: 7 seconds
あなたのフックが正常に構築されたら、今度はポータルを起動して展開する時が来ました。サーバーを開始し、Hookをデプロイするには、 サーバー・パースペクティブを見つけます 。
- あなたのサーバーを右クリックし、[ 追加 ] または [ 削除 ] をクリックします
- 使用可能な選択項目の下にユーザー・リスナー・フックを配置します。
- 強調表示されたら、[ 追加 ]ボタンをクリックし、[ OK ]をクリックします。
- サーバーパースペクティブの[ 再生 ]ボタンをクリックします。
ご質問、ご意見、懸念などがありましたらお知らせください。建設的なご意見をいただければ幸いです。




