liferay
Ganci a Liferay
Ricerca…
Osservazioni
Funziona con Liferay Portal fino alla versione 6.2.
JSP Hook
Gli hook JSP sono uno speciale plugin di liferay che consente di modificare il portlet core jsp-s, diciamo che si desidera modificare il portlet di login per mostrare Welcome in my custom login! .
La struttura minima per un plugin Hook è la seguente:
[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 è il file che distingue il tipo di hook che stai usando, qui definisci all'interno del tag hook il parametro corretto per l'hook, per il hook 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 si trova in Liferay in /docroot/html/portlet/login/login.jsp , per /docroot/html/portlet/login/login.jsp uno dobbiamo aggiungere un jsp con lo stesso nome e percorso nella nostra cartella custom_jsps .
Quando viene distribuito l'hook, Liferay cercherà nel file liferay-hook.xml per il valore custom-jsp-dir e sostituirà tutti i JSP del portale con quelli trovati in questa directory. I jsp originali vengono salvati con il nome <orginal name>.portal.jsp nome <orginal name>.portal.jsp da ripristinare in caso di <orginal name>.portal.jsp della distribuzione.
Possiamo anche chiamare i JSP originali nel nuovo JSP modificato se vogliamo mantenere il codice rendendolo adattabile agli aggiornamenti o agli aggiornamenti della versione della piattaforma Liferay sottostante. Per fare ciò, nel tuo JSP personalizzato usa il seguente schema:
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
dove { JSP file's path } in questo caso sarà portlet/login/login.portal.jsp . Questo è chiamato estendere il jsp originale .
Quindi possiamo aggiungere il contenuto ad esso con:
<%
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 %>
Puntali ganci d'azione
Questo tipo di hook può essere utilizzato per sovrascrivere il portale principale (ad esempio c/portal/login ) e le azioni portlet /login/forgot_password (ad esempio /login/forgot_password ), queste azioni per Liferay Portal sono specificate in un file struts-config.xml nel suo WEB-INF Cartella WEB-INF Per sovrascrivere un'azione:
- nel file
liferay-hook.xmldel plugin hook sottodocroot/WEB-INF, aggiungi un elementodocroot/WEB-INFstruts-actionall'interno dell'elemento hook. - All'interno
struts-actionelemento, aggiungerestruts-action-pathche specifica il percorso dell'azione che stai scavalcando estruts-action-implche specifica la tua classe d'azione personalizzata.Questo sembra:
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- Creare una classe di azione del portlet Struts che estende
BaseStrutsPortletAction. Un esempio di questa classe è:
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);
}
}
Chiamare il metodo sottoposto a override, come originalStrutsPortletAction.processAction , non è obbligatorio ma una buona pratica per mantenere invariato il comportamento dell'azione in relazione al portale Liferay. Questo tipo di hook può essere utilizzato anche per aggiungere nuove azioni Struts, è come modificare un'azione esistente, in questo caso liferay-hook.xml potrebbe essere:
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
Ciao utente "Nome" con ganci
Questo esempio mostrerà come creare un semplice "Ciao utente [nome]" dopo il login. L'esempio è basato sull'esecuzione di un'azione personalizzata utilizzando un gancio
Dal terminale della riga di comando, vai alla cartella dei ganci dei tuoi plugin SDK. Per creare un progetto di hook, è necessario eseguire lo script di creazione. Ecco il formato da seguire nell'esecuzione dello script:
crea. [sh | bat] [nome progetto] "[Nome visualizzato gancio]"
Su Linux e Mac OS X, devi inserire un comando simile a quello in questo esempio:
./create.sh Hello-user "Hello User"
Su Windows, devi inserire un comando simile a quello in questo esempio:
create.bat Hello-user "My Hook"
La procedura guidata Nuovo progetto IDE di Liferay e gli script di creazione generano progetti di hook nella cartella hooks del tuo plug-in SDK. L'SDK Plugin aggiunge automaticamente "-hook" al nome del tuo progetto.
Sia che tu abbia creato il tuo progetto di hook dall'IDE di Liferay o dalla riga di comando, finisci con la stessa struttura di progetto (vedi prima).
- Determina l'evento sul quale vuoi attivare l'azione personalizzata. Cerca nella documentazione di portal.properties per trovare la proprietà dell'evento corrispondente. Suggerimento: le proprietà dell'evento hanno .event nel loro nome. Ci sono le proprietà di sessione, avvio, spegnimento e portale nelle seguenti sezioni della documentazione di portal.properties : Sessione - Eventi di avvio - Eventi di spegnimento - Eventi del portale
- Nel tuo progetto di hook, crea una classe Java che estenda la classe com.liferay.portal.kernel.events.Action. Sostituire il metodo 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());
}
}
Importante: se la tua azione accede all'oggetto HttpServletRequest, estendi com.liferay.portal.kernel.events.Action; altrimenti, estendere com.liferay.portal.struts.SimpleAction.
Creare un file di proprietà, portal.properties , all'interno della cartella docroot / WEB-INF / src del progetto hook. Quindi aggiungere il nome della proprietà evento del portale che corrisponde all'evento sul quale si desidera eseguire l'azione. Specificare il nome completo della classe di azione come valore della proprietà.
`login.events.post=HelloUser`Ad esempio, per eseguire un'azione di classe appena prima della registrazione del portale in un utente, specificare la proprietà login.events.pre con la classe di azione come valore. Potrebbe assomigliare a questa impostazione di proprietà.
Importante: poiché le proprietà del portale come login.events.pre accettano più valori, è necessario aggiungere i valori ai valori esistenti. È possibile modificare ripetutamente le proprietà da hook aggiuntivi.
Modifica solo una proprietà del portale che accetta un singolo valore da un singolo hook plugin. Se modifichi il valore di una proprietà da più plug-in, Liferay non saprà quale valore usare.
- Modifica il file docroot / WEB-INF / liferay-hook.xml e aggiungi il tuo
nome del file delle proprietà del portale di hook come valore per
<portal-properties>...</portal-properties>elemento all'interno del tuo
hook<hook>...</hook>elemento. Ad esempio, se il nome del file delle proprietà del tuo hook è portal.properties , devi specificare questo elemento:
<portal-properties>portal.properties</portal-properties>
- Distribuisci il tuo gancio, vai al tuo percorso di aggancio e inserisci il
ant clean deploy, vedrai il file .war nella cartella dist.
Ora se accedi a liferay, vedrai sul server un messaggio come "Hello user Admin".
Listener modello Hook
sfondo
Gli hook Listener del modello sono un tipo di plugin Liferay che ascolta gli eventi eseguiti su un modello ed esegue il codice in risposta. Gli hook Listener del modello sono simili agli hook Action di Custom Struts in quanto rispondono a un'azione intrapresa nel portale. Tuttavia, mentre le azioni di Struts rispondono a un'azione intrapresa da un utente, un Listener di modelli risponde (prima o dopo) ad un evento che coinvolge un modello Liferay.
differenze
Ecco alcuni esempi di Azioni Struts v. Ascoltatori di modelli per il confronto.
- Azione Struts
- Login utente
- Creazione account
- Estendi sessione
- Sposta cartella
- Listener di modelli
- Dopo che la cartella è stata creata
- Quando le informazioni dell'utente sono aggiornate
- Dopo che il segnalibro è stato rimosso
- Prima che venga creata un'associazione di ruolo
La migliore risorsa per imparare l'architettura di Liferay è attraverso il loro codice sorgente. Tutti i loro file sorgente si trovano su GitHub e visualizzano i loro JavaDocs. Puoi vedere tutti i modelli del portale principale su JavaDocs e tutte le azioni Struts su GitHub.
Esempio
In questo tutorial svilupperemo un listener di modelli che invia un'email a un utente dopo la creazione del suo account. Per fare questo scriveremo una classe chiamata UserModelListener che estenderà il BaseModelListener di Liferay. Passeremo brevemente alla creazione dell'hook e riguarderemo le modifiche necessarie ai seguenti file di configurazione
portal.properties
Liferay-hook.xml
Iniziare
Per iniziare a sviluppare il tuo hook Listener di modello devi prima lanciare l'applicazione IDE Liferay o Liferay Developer Studio.
Sia Liferay IDE che Liferay Developer Studio sono ambienti di sviluppo Eclipse personalizzati. Sono sorprendentemente simili e una serie di direzioni dovrebbe essere sufficiente per entrambi gli ambienti.
All'interno del tuo ambiente di sviluppo esegui i seguenti passaggi.
- Nell'angolo in alto a sinistra, fai clic su File
- Passa il mouse su Nuovo
- Fai clic su Liferay Plugin Project
Creerai questa finestra.
Si prega di inserire le informazioni come mostrato sopra
- Nome progetto: Listener utente-modello
- Seleziona Usa posizione predefinita
- Tipo di costruzione: Ant
- Tipo di plugin: Hook
Assicurati che il tuo progetto si trovi all'interno della directory Hook SDK dei plugin Liferays . Dovrai selezionare il tuo SDK e il tuo Runtime di conseguenza.
Nella prospettiva di Esplora pacchetti vedrai la seguente struttura di directory.
Sviluppo di ascoltatori
Ora che hai creato il tuo hook dovrai creare la tua classe UserModelListener personalizzata. Questa classe estenderà la classe BaseModelListener di Liferay.
La classe BaseModelListener di Liferay è una classe astratta che implementa l'interfaccia ModelListener. Non si desidera implementare direttamente l'interfaccia ModelListener in quanto richiederà la sovrascrittura di tutti i suoi metodi.
I seguenti metodi vengono forniti dall'interfaccia ModelListener tramite la classe astratta BaseModelListener .
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
Crea la tua classe UserModelListener nella seguente directory. Per creare la classe tramite la GUI è sufficiente eseguire i seguenti comandi
- Fai clic su File nell'angolo in alto a sinistra
- Passa il mouse su Nuovo
- Fai clic su Classe
docroot/
WEB-INF/
src/
Inserisci le informazioni mostrate di seguito
All'interno della classe UserModelListener , incollare il seguente codice
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());
}
}
}
Configurazione delle proprietà
Per configurare l'associazione tra il nostro listener personalizzato e il nostro modello, è necessario apportare alcune modifiche finali. In primo luogo, creare un nuovo file portal.properties nella seguente directory.
docroot/
WEB-INF/
src/
+ portal.properties
È necessario aggiungere solo una riga al file.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Possiamo generalizzare dicendo che, per ogni Listener di modelli che creiamo, il valore delle proprietà associate deve essere nella forma di
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
In altre parole, se scrivessimo una classe CustomerDLFolderModelListener , impacchettata all'interno di com.example.code , per il modello DLFolder avremmo la seguente proprietà
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
Infine, individua il file liferay-hook.xml. Nella vista Origine , scrivi quanto segue.
<?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>
Spiegazione
- La prima riga è un prologo opzionale che specifica la versione del documento e (in alcuni casi) il set di caratteri.
- La riga 2 è una definizione DocType formale (DTD) che definisce esplicitamente quali elementi e attributi sono validi
- Le righe 3 e 5 sono costituite dall'elemento genitore Hook (uno degli elementi validi supportati da questo DTD)
- La riga 4 esegue l'override e estende il file portal.properties in $ {liferay.home}
Per vedere quali altri elementi possono essere utilizzati in questo file XML è possibile fare riferimento all'URL all'interno della Definizione DocType . Questo è standard per tutti i file XML e SGML con DTD . Un altro esempio di file XML Liferay con DTD è service.xml (l'implementazione ORM di Liferay basata su Hibernate ).
Costruisci e distribuisci
Costruire e distribuire gli hook è un processo semplice. Lo sviluppo di Liferay Plugin supporta l'automazione di build e dipendenza con
- Formica
- Edera
- Maven
- Gradle
Nel nostro esempio abbiamo utilizzato Ant per l'automazione delle build. Il file build.xml contiene i comandi di compilazione (noti come obiettivi in Ant ). Per costruire il tuo hook devi semplicemente eseguire i seguenti comandi.
- Trova il tuo file build.xml
- Nel tuo IDE, trascina il file build.xml nella prospettiva Ant
- Espandi il file ed esegui tutto il target
Nella tua vista console dovresti vedere qualcosa di simile al seguente
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
Con il tuo Hook creato con successo ora è il momento di avviare il tuo portale e distribuirlo. Per avviare il server e distribuire Hook, individuare la prospettiva Server .
- Fare clic con il tasto destro sul server e fare clic su Aggiungi o Rimuovi
- Trova utente-Listener-Hook sotto la selezione Disponibile
- Una volta evidenziato, fai clic sul pulsante Aggiungi e fai clic su OK
- Fai clic sul pulsante Riproduci nella prospettiva Server
Per favore fatemi sapere se avete domande, commenti, dubbi, ecc. Tutto il feedback costruttivo è molto apprezzato!




