liferay
Haken in Liferay
Suche…
Bemerkungen
Dies funktioniert mit Liferay Portal bis Version 6.2.
JSP Hook
JSP-Hooks sind ein spezielles Liferay-Plugin, mit dem das Core-Portlet Jsp-s geändert werden kann. Angenommen, Sie möchten das Login-Portlet so ändern, dass Welcome in my custom login! .
Die minimale Struktur für ein Hook Plugin ist wie folgt:
[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 ist die Datei, die den verwendeten Hook-Typ bestimmt. Hier definieren Sie im Hook-Tag den richtigen Parameter für den Hook, für den JSP-Hook:
<?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 ist in Liferay in /docroot/html/portlet/login/login.jsp , um einen Haken zu setzen, müssen wir ein jsp mit demselben Namen und Pfad in unserem custom_jsps Ordner custom_jsps .
Wenn der Hook implementiert ist, sucht Liferay in der liferay-hook.xml nach dem Wert für custom-jsp-dir und ersetzt alle Portal-JSPs durch die in diesem Verzeichnis gefundenen. Die ursprünglichen JSPs werden unter dem Namen <orginal name>.portal.jsp , um sie wiederherzustellen, falls der Haken nicht mehr verwendet wird.
Wir können sogar die ursprünglichen JSPs in der neuen modifizierten JSP aufrufen, wenn wir den Code beibehalten möchten, um ihn an Aktualisierungen oder Upgrades der zugrunde liegenden Liferay-Plattformversion anzupassen. Verwenden Sie dazu in Ihrer benutzerdefinierten JSP das folgende Muster:
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
{ JSP file's path } in diesem Fall portlet/login/login.portal.jsp . Dies wird als Erweiterung des ursprünglichen JSP bezeichnet .
Dann können wir Inhalte hinzufügen mit:
<%
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 Action Hooks
Mit diesem Hook-Typ können Core-Portale (z. B. c/portal/login ) und Portlet- /login/forgot_password Aktionen (z. B. /login/forgot_password ) /login/forgot_password werden. Diese Aktionen für Liferay Portal werden in einer struts-config.xml Datei in ihrer WEB-INF Ordner. Um eine Aktion zu überschreiben:
-
liferay-hook.xmlDateiliferay-hook.xmlIhres Hook-Plugins unterdocroot/WEB-INFeindocroot/WEB-INFstruts-actionElement innerhalb des hook-Elements hinzu. - Innerhalb
struts-actionElement, fügenstruts-action-path, der die Aktion Pfad Sie überschreiben und gibtstruts-action-impl, die Ihre benutzerdefinierte Aktion gibt class.This wie folgt aussieht:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- Erstellen Sie eine Struts-Portlet-Aktionsklasse, die
BaseStrutsPortletAction. Ein Beispiel für diese Klasse ist:
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);
}
}
Das Aufrufen der Methode, die überschrieben wird, wie originalStrutsPortletAction.processAction , ist nicht obligatorisch, jedoch eine bewährte Methode, um das Verhalten gegenüber der Aktion in Bezug auf Liferay Portal nicht zu ändern. Mit diesem Hook-Typ können Sie auch neue Struts-Aktionen hinzufügen. Dies ist das gleiche wie das Ändern einer vorhandenen Aktion. In diesem Fall wäre 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>
Hallo User "Name" mit Haken
Dieses Beispiel zeigt, wie Sie nach der Anmeldung einen einfachen "Hallo Benutzer [Name]" erstellen. Das Beispiel basiert auf der Durchführung einer benutzerdefinierten Aktion mit einem Hook
Navigieren Sie von Ihrem Befehlszeilenterminal zum Hooks-Ordner Ihres Plugins SDK. Um ein Hook-Projekt zu erstellen, müssen Sie das Erstellungsskript ausführen. Hier ist das Format, das bei der Ausführung des Skripts zu beachten ist:
create. [sh | bat] [Projektname] "[Hook-Anzeigename]"
Unter Linux und Mac OS X geben Sie einen Befehl ähnlich dem in diesem Beispiel ein:
./create.sh Hallo-Benutzer "Hallo Benutzer"
Unter Windows geben Sie einen Befehl ähnlich dem in diesem Beispiel ein:
create.bat Hallo-Benutzer "My Hook"
Der Assistent für neue Projekte von Liferay IDE und die Skripts zum Erstellen erzeugen Hook-Projekte im Hooks-Ordner Ihres Plugin-SDK. Das Plugins-SDK fügt automatisch "-hook" an Ihren Projektnamen an.
Unabhängig davon, ob Sie Ihr Hook-Projekt über die Liferay-IDE oder über die Befehlszeile erstellt haben, erhalten Sie die gleiche Projektstruktur (siehe oben).
- Bestimmen Sie das Ereignis, bei dem Sie Ihre benutzerdefinierte Aktion auslösen möchten. Suchen Sie in der Dokumentation zu portal.properties nach der passenden Ereigniseigenschaft. Hinweis: Die Event-Eigenschaften haben den Namen .event. Es gibt Sitzung, Starten, Herunterfahren und Portalereigniseigenschaften in den folgenden Abschnitten der portal.properties Dokumentation: Session - Startup Events - Shutdown Events - Portal Events
- Erstellen Sie in Ihrem Hook-Projekt eine Java-Klasse, die die Klasse com.liferay.portal.kernel.events.Action erweitert. Überschreiben Sie die Action.run- Methode (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());
}
}
Wichtig: Wenn Ihre Aktion auf das HttpServletRequest-Objekt zugreift, erweitern Sie com.liferay.portal.kernel.events.Action; Andernfalls erweitern Sie com.liferay.portal.struts.SimpleAction.
Erstellen Sie eine Eigenschaftendatei, portal.properties , im docroot / WEB-INF / src-Ordner Ihres Hook-Projekts. Fügen Sie dann den Namen der Portalereignis-Eigenschaft hinzu, die dem Ereignis entspricht, für das Sie Ihre Aktion ausführen möchten. Geben Sie den vollständig qualifizierten Namen Ihrer Aktionsklasse als Wert der Eigenschaft an.
`login.events.post=HelloUser`Wenn Sie beispielsweise die Aktion einer Klasse unmittelbar vor der Portalprotokollierung in einem Benutzer ausführen möchten, geben Sie die Eigenschaft login.events.pre mit der Aktionsklasse als Wert an. Es könnte wie diese Eigenschaftseinstellung aussehen.
Wichtig: Da Portaleigenschaften wie login.events.pre mehrere Werte akzeptieren, müssen Sie Ihre Werte an die vorhandenen Werte anhängen. Sie können die Eigenschaften von zusätzlichen Hooks wiederholt ändern.
Ändern Sie nur eine Portaleigenschaft, die einen einzelnen Wert von einem einzelnen Hook-Plugin akzeptiert. Wenn Sie den Wert einer Eigenschaft aus mehreren Plugins ändern, weiß Liferay nicht, welchen Wert Sie verwenden sollen.
- Bearbeiten Sie Ihre docroot / WEB-INF / liferay-hook.xml- Datei und fügen Sie Ihre hinzu
Name der Portaleigenschaftendatei des Hooks als Wert für die
<portal-properties>...</portal-properties>-Element in Ihrem
Das<hook>...</hook>-Element von<hook>...</hook>. Wenn der Name der Eigenschaftendatei Ihres Hooks beispielsweise portal.properties lautet , geben Sie dieses Element an:
<portal-properties>portal.properties</portal-properties>
- Stellen Sie Ihren Hook bereit, gehen Sie zu Ihrem Hook-Pfad und geben Sie
ant clean deploySie sehen die .war-Datei im Ordner dist.
Wenn Sie sich jetzt bei liferay anmelden, wird im Serverprotokoll eine Meldung wie "Hallo Benutzer Admin" angezeigt.
Model Listener Hook
Hintergrund
Model Listener-Hooks sind eine Art Liferay-Plugin, das auf Ereignisse eines Modells wartet und als Antwort Code ausführt. Model Listener-Hooks ähneln den Custom-Struts-Action-Hooks, indem sie auf eine im Portal durchgeführte Aktion reagieren. Während Struts-Aktionen auf eine von einem Benutzer ausgeführte Aktion reagieren, reagiert ein Model Listener (vor oder nach einem Ereignis) auf ein Ereignis, an dem ein Liferay-Modell beteiligt ist.
Unterschiede
Hier einige Beispiele von Struts-Aktionen v. Modelllistener zum Vergleich.
- Struts Action
- Benutzer-Anmeldung
- Konto-Erstellung
- Sitzung verlängern
- Ordner verschieben
- Model Listener
- Nachdem der Ordner erstellt wurde
- Wenn Benutzerinformationen aktualisiert werden
- Nachdem das Lesezeichen entfernt wurde
- Bevor eine Rollenzuordnung gemacht wird
Die beste Quelle für das Erlernen der Architektur von Liferay ist der Quellcode. Alle ihre Quelldateien befinden sich auf GitHub und durch Anzeigen ihrer JavaDocs. Sie können alle Core- Portalmodelle in den JavaDocs und alle Struts-Aktionen in GitHub sehen.
Beispiel
In diesem Lernprogramm werden wir einen Model Listener entwickeln, der eine E-Mail an einen Benutzer sendet, nachdem sein Konto erstellt wurde. Dazu schreiben wir eine Klasse mit dem Namen UserModelListener, die den BaseModelListener von Liferay erweitert . Wir gehen kurz auf die Hook-Erstellung ein und behandeln die notwendigen Änderungen an den folgenden Konfigurationsdateien
portal.properties
liferay-hook.xml
Fertig machen
Um mit der Entwicklung Ihres Model Listener-Hooks zu beginnen, müssen Sie zuerst Ihre Liferay IDE- oder Liferay Developer Studio-Anwendung starten.
Sowohl die Liferay IDE als auch das Liferay Developer Studio sind angepasste Eclipse- Entwicklungsumgebungen. Sie sind auffallend ähnlich und ein Satz von Anweisungen sollte für beide Umgebungen ausreichend sein.
Führen Sie in Ihrer Entwicklungsumgebung die folgenden Schritte aus.
- In der oberen linken Ecke klicken Sie auf Datei
- Bewegen Sie die Maus über Neu
- Klicken Sie auf Liferay Plugin Project
Sie werden dieses Fenster öffnen.
Bitte geben Sie die Informationen wie oben gezeigt ein
- Projektname: User-Model-Listener
- Wählen Sie Standardstandort verwenden
- Bautyp: Ant
- Plugin-Typ: Haken
Stellen Sie sicher, dass sich Ihr Projekt in Ihrem Liferays Plugins SDK Hook-Verzeichnis befindet. Sie müssen Ihr SDK und Ihre Runtime entsprechend auswählen.
In Ihrer Package Explorer- Perspektive sehen Sie die folgende Verzeichnisstruktur.
Hörerentwicklung
Nachdem Sie Ihren Hook erstellt haben, müssen Sie Ihre benutzerdefinierte UserModelListener- Klasse erstellen. Diese Klasse erweitert die BaseModelListener-Klasse von Liferay.
Die BaseModelListener-Klasse von Liferay ist eine abstrakte Klasse, die die ModelListener-Schnittstelle implementiert. Sie möchten die ModelListener-Schnittstelle nicht direkt implementieren, da Sie dazu alle Methoden überschreiben müssen.
Die folgenden Methoden werden Ihnen von der ModelListener- Schnittstelle über die abstrakte Klasse BaseModelListener bereitgestellt .
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
Erstellen Sie Ihre UserModelListener- Klasse im folgenden Verzeichnis. Um die Klasse über die GUI zu erstellen, führen Sie einfach die folgenden Befehle aus
- Klicken Sie oben links auf Datei
- Bewegen Sie die Maus über Neu
- Klicken Sie auf Klasse
docroot/
WEB-INF/
src/
Geben Sie die unten angezeigten Informationen ein
Fügen Sie in Ihre UserModelListener- Klasse den folgenden Code ein
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());
}
}
}
Eigenschaften Konfiguration
Um die Zuordnung zwischen unserem benutzerdefinierten Listener und unserem Modell zu konfigurieren, müssen wir einige abschließende Anpassungen vornehmen. Erstellen Sie zunächst eine neue portal.properties-Datei im folgenden Verzeichnis.
docroot/
WEB-INF/
src/
+ portal.properties
Es muss nur eine Zeile zur Datei hinzugefügt werden.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Wir können dies verallgemeinern, indem wir sagen, dass für jeden Model Listener, den wir erstellen, die zugehörigen Eigenschaften den Wert in der Form haben müssen
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
Wenn wir also eine CustomerDLFolderModelListener- Klasse schreiben , die in com.example.code verpackt ist, hätten wir für das DLFolder- Modell die folgende Eigenschaft
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
Suchen Sie zuletzt Ihre Datei liferay-hook.xml. In Quellansicht, schreiben Sie die folgenden.
<?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>
Erläuterung
- Zeile eins ist ein optionaler Prolog, der die Dokumentversion und (in einigen Fällen) den Zeichensatz angibt.
- Zeile 2 ist eine formale DocType-Definition (DTD), die explizit definiert, welche Elemente und Attribute gültig sind
- Zeile 3 und 5 bestehen aus dem übergeordneten Hook-Element (eines der gültigen Elemente, das von dieser DTD unterstützt wird)
- Zeile 4 überschreibt und erweitert die Datei portal.properties in $ {liferay.home}.
Um zu sehen, welche anderen Elemente in dieser XML-Datei verwendet werden können, können Sie die URL in der DocType-Definition angeben . Dies ist Standard für alle XML- und SGML- Dateien mit einer DTD . Ein weiteres Beispiel für eine Liferay- XML- Datei mit einer DTD ist service.xml (Liferays ORM- Implementierung basierend auf Hibernate ).
Erstellen und Bereitstellen
Das Erstellen und Bereitstellen von Hooks ist ein einfacher Prozess. Liferay Plugin-Entwicklung unterstützt die Build- und Abhängigkeitsautomatisierung mit
- Ameise
- Efeu
- Maven
- Gradle
In unserem Beispiel haben wir Ant für die Build-Automatisierung verwendet. Die Datei build.xml enthält die Buildbefehle (in Ant als Ziele bezeichnet ). Um Ihren Hook zu bauen, führen Sie einfach die folgenden Befehle aus.
- Suchen Sie Ihre build.xml- Datei
- Ziehen Sie in Ihrer IDE die Datei build.xml in die Ant- Perspektive
- Erweitern Sie die Datei und führen Sie das All- Ziel aus
In Ihrer Konsolenansicht sollten Sie etwa Folgendes sehen
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
Nachdem Ihr Hook erfolgreich erstellt wurde, ist es jetzt an der Zeit, Ihr Portal zu starten und bereitzustellen. Um Ihren Server zu starten und den Hook bereitzustellen, suchen Sie die Serverperspektive .
- Klicken Sie mit der rechten Maustaste auf Ihren Server und klicken Sie auf Hinzufügen oder Entfernen
- Suchen Sie unter " Verfügbar" nach " User-Listener-Hook"
- Einmal hervorgehoben, klicken Sie auf die Schaltfläche Hinzufügen und dann auf OK
- Klicken Sie in der Server- Perspektive auf die Schaltfläche Wiedergabe
Bitte lassen Sie mich wissen, wenn Sie Fragen, Kommentare, Bedenken usw. haben. Alle konstruktiven Rückmeldungen werden sehr geschätzt!




