liferay
Krokar i Liferay
Sök…
Anmärkningar
Detta fungerar med Liferay Portal upp till version 6.2.
JSP Hook
JSP-krokar är en speciell livstids-plugin som gör det möjligt att ändra core-portlet jsp-s, säger att du vill ändra inloggningsportletten så att den är Welcome in my custom login! .
Den minimala strukturen för ett Hook Plugin är som följer:
[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 är den fil som distinuerar typen av krok du använder, här definierar du inuti kroktaggen rätt parameter för kroken, för JSP-krok:
<?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 finns i Liferay i /docroot/html/portlet/login/login.jsp , för att skapa en krok av det måste vi lägga till en jsp med samma namn och sökväg i vår custom_jsps mapp.
När kroken distribueras kommer Liferay att leta i liferay-hook.xml efter det custom-jsp-dir värdet och kommer att ersätta alla JSP-portaler med de som finns i den här katalogen. De ursprungliga jsp: arna sparas med namnet <orginal name>.portal.jsp för att återställas i händelse av krokundersökning.
Vi kan till och med ringa de ursprungliga JSP: erna i den nya modifierade JSP om vi vill behålla koden som gör denna anpassningsbar till uppdateringar eller uppgraderingar av den underliggande Liferay-plattformsversionen. För att göra detta använder du följande mönster i din anpassade JSP:
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
där { JSP file's path } i detta fall kommer att vara portlet/login/login.portal.jsp . Att göra detta kallas förlängning av den ursprungliga jsp .
Då kan vi lägga till innehåll till det med:
<%
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
Denna typ av Hook kan användas för att åsidosätta kärnportalen (t.ex. c/portal/login ) och portlet-struts-åtgärder (t.ex. /login/forgot_password ). /login/forgot_password åtgärder för Liferay Portal anges i en struts-config.xml fil i dess WEB-INF mapp. För att åsidosätta en åtgärd:
- i
liferay-hook.xmlfil för din hook-plugin underdocroot/WEB-INF, lägg till ettstruts-actionelement i hook-elementet. - Inuti
struts-actionelementet lägger du tillstruts-action-pathsom anger den åtgärdsväg som du åsidosätter ochstruts-action-implsom anger din anpassade åtgärdsklass. Det ser ut som:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- Skapa en Struts-portlet-handlingsklass som utvidgar
BaseStrutsPortletAction. Ett exempel på denna klass är:
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);
}
}
Att kalla metoden som åsidosätts, som originalStrutsPortletAction.processAction , är inte obligatoriskt utan en bästa praxis för att hålla beteendet från åtgärden oförändrad när det gäller Liferay Portal. Denna typ av krok kan användas för att lägga till nya Struts Actions också, det är samma sak som att modifiera en befintlig åtgärd, i detta fall skulle liferay-hook.xml vara:
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
Hej Användare "Namn" med krokar
Detta exempel visar hur man gör en enkel "Hello User [name]" efter inloggningen. Exemplet är baserat på att utföra en anpassad åtgärd med en krok
Från din kommandoradsterminal navigerar du till din Plugins SDK: s krokmapp. För att skapa ett krokprojekt måste du köra skapa-skriptet. Här är formatet att följa när du kör skriptet:
skapa. [sh | bat] [projektnamn] "[Hook Display Name]"
På Linux och Mac OS X anger du ett kommando som liknar det i detta exempel:
./create.sh Hej-användare "Hej användare"
I Windows anger du ett kommando som liknar det i detta exempel:
create.bat Hej-användare "My Hook"
Liferay IDEs nya projektguide och skapa skript genererar krokprojekt i din Plugin SDK: s krokmapp. Plugins SDK lägger automatiskt “-hook” till ditt projektnamn.
Oavsett om du skapade ditt krokprojekt från Liferay IDE eller från kommandoraden slutar du med samma projektstruktur (se tidigare).
- Bestäm vilken händelse du vill utlösa din anpassade åtgärd på. Titta i portal.properties dokumentation för att hitta den matchande händelseegenskapen. Tips: händelsegenskaperna har .event i deras namn. Det finns session-, start-, avstängnings- och portalhändelsegenskaper i följande avsnitt i portal.properties dokumentation: Session - Startup events - Shutdown Events - Portal Events
- I ditt hook-projekt, skapa en Java-klass som utökar com.liferay.portal.kernel.events.Action-klassen. Överväga metoden 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());
}
}
Viktigt: Om din åtgärd öppnar HttpServletRequest-objektet, förläng com.liferay.portal.kernel.events.Action; annars förläng com.liferay.portal.struts.SimpleAction.
Skapa en egenskapsfil, portal.properties , inuti mappets docroot / WEB-INF / src-mapp i ditt hook-projekt. Lägg sedan till namnet på portalhändelseegenskapen som motsvarar händelsen du vill utföra din åtgärd på. Ange din åtgärdsklass 'fullt kvalificerade namn som egendomens värde.
`login.events.post=HelloUser`För att till exempel utföra en klassåtgärd precis innan portalen loggar in i en användare, anger du egenskapen login.events.pre med din åtgärdsklass som dess värde. Det kan se ut som den här fastighetsinställningen.
Viktigt: Eftersom portalegenskaper som login.events.pre accepterar flera värden måste du lägga till dina värden till de befintliga värdena. Du kan upprepade gånger ändra egenskaperna från ytterligare krokar.
Ändra endast en portalegenskap som accepterar ett enda värde från en plugin för en enda krok. Om du ändrar en egendoms värde från flera plugins vet Liferay inte vilket värde du vill använda.
- Redigera din docroot / WEB-INF / liferay-hook.xml- fil och lägg till din
hooks portalegenskapsfilnamn som värdet för
<portal-properties>...</portal-properties>-element i ditt
hooks<hook>...</hook>-element. Om du t.ex. tillhandahåller filnamnet för din kroks portal.properties anger du detta element:
<portal-properties>portal.properties</portal-properties>
- Distribuera din krok, gå till din krokväg och ange
ant clean deployså ser du .war i mappen dist.
Om du nu loggar in på livstiden ser du i serverloggen ett meddelande som "Hej användaradministratör".
Model Listener Hook
Bakgrund
Model Listener hooks är en typ av Liferay-plugin som lyssnar på händelser tagna på en modell och kör kod som svar. Model Listener krokar liknar Custom Struts Action krokar genom att de svarar på en åtgärd som vidtas i portalen. Men medan Struts-åtgärder svarar på en åtgärd som vidtas av en användare, svarar en Model Listener (före eller efter) en händelse som involverar en Liferay-modell.
skillnader
Här är några exempel på Struts Actions v. Model Listers för jämförelse.
- Struts Action
- Användarnamn
- Konto skapande
- Förläng sessionen
- Flytta mapp
- Model Listener
- Efter att mappen har skapats
- När användarinformation uppdateras
- Efter att bokmärket har tagits bort
- Innan en rollförening bildas
Den bästa resursen för att lära sig Liferays arkitektur är genom deras källkod. Alla deras källfiler finns på GitHub och genom att visa sina JavaDocs. Du kan se alla kärnportalmodellerna på JavaDocs och alla Struts Actions på GitHub.
Exempel
I den här tutorialen kommer vi att utveckla en Model Listener som skickar ett e-postmeddelande till en användare efter att deras konto först har skapats. För att göra detta kommer vi att skriva en klass som heter UserModelListener som kommer att utvidga Liferays BaseModelListener . Vi kommer kort att gå över skapandet av krokar och kommer att täcka nödvändiga ändringar av följande konfigurationsfiler
portal.properties
Liferay-hook.xml
Komma igång
För att börja utveckla din Model Listener-krok måste du först starta din Liferay IDE- eller Liferay Developer Studio-applikation.
Både Liferay IDE och Liferay Developer Studio är anpassade Eclipse- utvecklingsmiljöer. De är slående likadana och en uppsättning riktningar bör vara tillräcklig för båda miljöerna.
Utför följande steg i din utvecklingsmiljö.
- Klicka på Arkiv i det övre vänstra hörnet
- Håll musen över Ny
- Klicka på Liferay Plugin Project
Du kommer att leka det här fönstret.
Ange informationen som visas ovan
- Projektnamn: User-Model-Listener
- Välj Använd standardplats
- Byggtyp: Ant
- Plugin-typ: Hook
Se till att ditt projekt finns i din Liferays Plugins SDK Hook-katalog. Du måste välja din SDK och din Runtime i enlighet därmed.
I ditt Package Explorer- perspektiv ser du följande katalogstruktur.
Lyssnarutveckling
Nu när du har skapat din krok måste du skapa din anpassade UserModelListener- klass. Denna klass kommer att utvidga Liferays BaseModelListener-klass.
Liferays BaseModelListener-klass är en abstrakt klass som implementerar ModelListener-gränssnittet. Du vill inte implementera ModelListener-gränssnittet direkt eftersom det kommer att kräva att du åsidosätter alla dess metoder.
Följande metoder tillhandahålls till dig av ModelListener- gränssnittet via basklassen BaseModelListener .
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
Skapa din UserModelListener- klass i följande katalog. För att skapa klassen via GUI kör du bara följande kommandon
- Klicka på Arkiv i det övre vänstra hörnet
- Håll musen över Ny
- Klicka på Klass
docroot/
WEB-INF/
src/
Ange informationen nedan
Inuti klassen UserModelListener klistra in följande kod
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());
}
}
}
Egenskaper Konfiguration
För att konfigurera sambandet mellan vår anpassade lyssnare och vår modell måste vi göra några slutliga justeringar. Först skapar du en ny portal.properties-fil i följande katalog.
docroot/
WEB-INF/
src/
+ portal.properties
Endast en rad behöver läggas till i filen.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Vi kan generalisera detta genom att säga att för alla Model Listener skapar vi tillhörande egenskaper värde måste vara i form av
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
Med andra ord, om vi skrev en CustomerDLFolderModelListener- klass, förpackad inuti com.example.code , för DLFolder- modellen skulle vi ha följande egenskap
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
Slutligen, hitta din liferay-hook.xml-fil. I Källkod, skriver följande.
<?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>
Förklaring
- Rad en är en valfri prolog som specificerar dokumentversionen och (i vissa fall) teckenuppsättningen.
- Rad 2 är en formell DocType Definition (DTD) som uttryckligen definierar vilka element och attribut som är giltiga
- Rad 3 och 5 består av överordnade Hook-elementet (ett av de giltiga elementen som stöds av denna DTD)
- Rad 4 åsidosätter och utökar filen portal.properties i $ {liferay.home}
För att se vilka andra element som kan användas i denna XML-fil kan du hänvisa till URL: n i DocType Definition . Detta är standard för alla XML- och SGML- filer med en DTD . Ett annat exempel på en Liferay XML- fil med en DTD är service.xml (Liferays ORM- implementering baserat på viloläge ).
Bygg och distribuera
Att bygga och använda krokar är en enkel process. Liferay Plugin-utveckling stöder byggande och beroende automatisering med
- Myra
- Murgröna
- Maven
- Gradle
I vårt exempel använde vi Ant för att bygga automatisering. Filen build.xml innehåller byggkommandona (känd som mål i myra ). Utför följande kommandon för att bygga din krok.
- Hitta din build.xml- fil
- I ditt IDE drar build.xml filen till Ant perspektiv
- Expandera filen och kör hela målet
I din konsolvy bör du se något liknande följande
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
Med din Hook framgångsrik byggd är det nu dags att starta din portal och distribuera den. För att starta din server och distribuera Hook leta upp serverns perspektiv.
- Högerklicka på din server och klicka på Lägg till eller ta bort
- Leta upp User -Listener-Hook under det tillgängliga valet
- När markerad, klicka på knappen Lägg till och klicka på OK
- Klicka på knappen Spela i serverns perspektiv
Låt mig veta om du har några frågor, kommentarer, problem etc. All konstruktiv feedback är mycket uppskattad!




