liferay
Hooks in Liferay
Szukaj…
Uwagi
Działa to z Liferay Portal do wersji 6.2.
Hak JSP
Haki JSP to specjalna wtyczka dożywotnia, która pozwala modyfikować główny portlet jsp-s, powiedzmy, że chcesz zmodyfikować portlet logowania, aby pokazać Welcome in my custom login! .
Minimalna struktura wtyczki haka jest następująca:
[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 to plik, który liferay-hook.xml haka, tutaj definiujesz wewnątrz tagu haka odpowiedni parametr dla haka, dla haka 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 znajduje się w Liferay w /docroot/html/portlet/login/login.jsp , aby go /docroot/html/portlet/login/login.jsp , musimy dodać plik jsp o tej samej nazwie i ścieżce w naszym folderze custom_jsps .
Po wdrożeniu haka Liferay poszuka w liferay-hook.xml custom-jsp-dir wartości liferay-hook.xml custom-jsp-dir i zastąpi wszystkie strony JSP portalu tymi liferay-hook.xml JSP portalu. Oryginalne <orginal name>.portal.jsp jsp są zapisywane z nazwą <orginal name>.portal.jsp nazwa <orginal name>.portal.jsp która ma zostać przywrócona w przypadku <orginal name>.portal.jsp haka.
Możemy nawet wywoływać oryginalne strony JSP w nowej zmodyfikowanej stronie JSP, jeśli chcemy zachować kod umożliwiający dostosowanie go do aktualizacji lub aktualizacji podstawowej wersji platformy Liferay. Aby to zrobić, w niestandardowym pliku JSP użyj następującego wzorca:
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
gdzie { JSP file's path } w tym przypadku będzie portlet/login/login.portal.jsp . Wykonanie tego nazywa się rozszerzaniem oryginalnego pliku jsp .
Następnie możemy dodać do niego treść za pomocą:
<%
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 %>
Haki Struts Action
Tego typu haka można użyć do zastąpienia podstawowego portalu (np. c/portal/login ) i akcji portlet struts (np. /login/forgot_password ), te akcje dla Liferay Portal są określone w pliku struts-config.xml w jego WEB-INF Folder WEB-INF Aby zastąpić akcję:
- w pliku
liferay-hook.xmlwtyczki hook wdocroot/WEB-INFdodaj elementstruts-actionelemencie hook. - Wewnątrz elementu
struts-actiondodajstruts-action-pathktóra określa ścieżkę akcji, którą zastępujesz, istruts-action-implktóra określa niestandardowąstruts-action-implakcji.
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
- Utwórz klasę akcji portletu Struts, która rozszerza
BaseStrutsPortletAction. Przykładem tej klasy jest:
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);
}
}
Wywołanie zastępowanej metody, takiej jak originalStrutsPortletAction.processAction , nie jest obowiązkowe, ale jest najlepszą praktyką, aby zachować zachowanie akcji przed zmianą w odniesieniu do portalu Liferay. Tego rodzaju hooka można również użyć do dodania nowych akcji Struts, jest to to samo, co modyfikacja istniejącej akcji, w tym przypadku liferay-hook.xml to:
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
Witam użytkownika „Nazwa” z haczykami
Ten przykład pokaże, jak zrobić proste „Hello User [nazwa]” po zalogowaniu. Przykład opiera się na wykonaniu niestandardowej akcji przy użyciu haka
Z terminala wiersza poleceń przejdź do folderu hooków pakietu SDK wtyczek. Aby utworzyć projekt przechwytujący, musisz wykonać skrypt tworzenia. Oto format do wykonania podczas wykonywania skryptu:
create. [sh | bat] [nazwa projektu] „[Hook Display Name]”
W systemach Linux i Mac OS X należy wprowadzić polecenie podobne do polecenia z tego przykładu:
./create.sh Hello-user „Hello User”
W systemie Windows wpisz polecenie podobne do polecenia z tego przykładu:
create.bat Hello-user „My Hook”
Kreator nowego projektu Liferay IDE i skrypty tworzenia generują projekty przechwytujące w folderze przechwytującym wtyczki SDK. Zestaw wtyczek SDK automatycznie dołącza „-hook” do nazwy twojego projektu.
Niezależnie od tego, czy utworzyłeś swój projekt haka z Liferay IDE, czy z wiersza poleceń, kończysz z tą samą strukturą projektu (patrz wcześniej).
- Określ zdarzenie, w którym chcesz uruchomić niestandardową akcję. Przejrzyj dokumentację portal.properties, aby znaleźć pasującą właściwość zdarzenia. Wskazówka: właściwości zdarzenia mają w nazwie nazwę .event. Właściwości sesji, uruchamiania, zamykania i portalu znajdują się w następujących sekcjach dokumentacji portalu.properties : Sesja - Zdarzenia uruchamiania - Zdarzenia zamknięcia - Zdarzenia portalu
- W swoim projekcie hook utwórz klasę Java, która rozszerza klasę com.liferay.portal.kernel.events.Action. Zastąp metodę 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());
}
}
Ważne: Jeśli twoja akcja uzyskuje dostęp do obiektu HttpServletRequest, rozszerz com.liferay.portal.kernel.events.Action; w przeciwnym razie należy rozszerzyć com.liferay.portal.struts.SimpleAction.
Utwórz plik właściwości portal.properties w folderze docroot / WEB-INF / src projektu haka. Następnie dodaj nazwę właściwości zdarzenia portalu, która odpowiada zdarzeniu, w którym chcesz wykonać akcję. Podaj w pełni kwalifikowaną nazwę swojej klasy akcji jako wartość właściwości.
`login.events.post=HelloUser`Na przykład, aby wykonać akcję klasy tuż przed zalogowaniem użytkownika do portalu, należy określić właściwość login.events.pre wraz z klasą akcji jako jej wartością. Może to wyglądać jak to ustawienie właściwości.
Ważne: Ponieważ właściwości portalu, takie jak login.events.pre, akceptują wiele wartości, należy dołączyć swoje wartości do istniejących wartości. Możesz wielokrotnie modyfikować właściwości z dodatkowych zaczepów.
Zmodyfikuj tylko właściwość portalu, która przyjmuje pojedynczą wartość z pojedynczej wtyczki hook. Jeśli zmienisz wartość właściwości z wielu wtyczek, Liferay nie będzie wiedział, której wartości użyć.
- Edytuj plik docroot / WEB-INF / liferay-hook.xml i dodaj swój
Nazwa pliku właściwości portalu haka jako wartość dla
<portal-properties>...</portal-properties>element w twoim
element<hook>...</hook>hooka. Na przykład, jeśli nazwa pliku właściwości haka to portal.properties , należy określić ten element:
<portal-properties>portal.properties</portal-properties>
- Wdróż hak, przejdź do ścieżki haka i wprowadź
ant clean deploy, a zobaczysz .war w folderze dist.
Teraz, jeśli zalogujesz się do końca życia, na serwerze zobaczysz komunikat „Witaj administratorze użytkownika”.
Hak nasłuchiwania modelu
tło
Haki nasłuchiwania modelu są rodzajem wtyczki Liferay, która nasłuchuje zdarzeń podejmowanych w modelu i wykonuje kod w odpowiedzi. Haki nasłuchiwania modelu są podobne do haków akcji niestandardowej rozpórki, ponieważ reagują na akcję wykonaną w portalu. Jednak podczas gdy działania Struts reagują na działanie podjęte przez użytkownika, nasłuchiwacz modeli odpowiada (przed lub po) na zdarzenie obejmujące model Liferay.
Różnice
Oto kilka przykładów Struts Actions v. Model Listeners do porównania.
- Struts Action
- Login użytkownika
- Tworzenie konta
- Przedłuż sesję
- Przenieś folder
- Model nasłuchiwania
- Po utworzeniu folderu
- Gdy informacje o użytkowniku są aktualizowane
- Po usunięciu zakładki
- Przed utworzeniem powiązania roli
Najlepszym źródłem do nauki architektury Liferay jest ich kod źródłowy. Wszystkie ich pliki źródłowe znajdują się na GitHub i przeglądając ich JavaDocs. Możesz zobaczyć wszystkie podstawowe modele portalu na JavaDocs i wszystkie akcje Struts na GitHub.
Przykład
W tym samouczku opracujemy Model Listener, który wysyła wiadomość e-mail do użytkownika po pierwszym utworzeniu jego konta. Aby to zrobić, napiszemy klasę o nazwie UserModelListener, która rozszerzy BaseModelListener Liferay. Omówimy krótko tworzenie haka i omówimy niezbędne modyfikacje następujących plików konfiguracyjnych
portal.properties
liferay-hook.xml
Pierwsze kroki
Aby rozpocząć tworzenie haka Model Listener, musisz najpierw uruchomić aplikację Liferay IDE lub Liferay Developer Studio.
Zarówno Liferay IDE, jak i Liferay Developer Studio to dostosowane środowiska programistyczne Eclipse . Są uderzająco podobne i jeden zestaw wskazówek powinien wystarczyć dla obu środowisk.
W środowisku programistycznym wykonaj następujące kroki.
- W lewym górnym rogu kliknij Plik
- Najedź kursorem myszy na Nowy
- Kliknij Liferay Plugin Project
Pojawi się to okno.
Wprowadź informacje jak pokazano powyżej
- Nazwa projektu: User-Model-Listener
- Wybierz Użyj domyślnej lokalizacji
- Typ kompilacji: Ant
- Rodzaj wtyczki: hak
Upewnij się, że Twój projekt znajduje się w katalogu haka Liferays Plugins SDK . Musisz odpowiednio wybrać zestaw SDK i środowisko wykonawcze .
W perspektywie Eksploratora pakietów zobaczysz następującą strukturę katalogów.
Rozwój słuchacza
Po utworzeniu haka musisz utworzyć niestandardową klasę UserModelListener . Ta klasa rozszerzy klasę BaseModelListener Liferay.
Liferay's BaseModelListener to klasa abstrakcyjna, która implementuje interfejs ModelListener. Nie chcesz bezpośrednio implementować interfejsu ModelListener, ponieważ będzie on wymagał zastąpienia wszystkich jego metod.
Interfejs ModelListener udostępnia następujące metody za pośrednictwem klasy abstrakcyjnej BaseModelListener .
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
Utwórz klasę UserModelListener w następującym katalogu. Aby utworzyć klasę za pomocą GUI, wystarczy wykonać następujące polecenia
- Kliknij opcję Plik w lewym górnym rogu
- Najedź kursorem myszy na Nowy
- Kliknij Klasa
docroot/
WEB-INF/
src/
Wprowadź informacje pokazane poniżej
Wewnątrz klasy UserModelListener wklej następujący 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());
}
}
}
Konfiguracja właściwości
Aby skonfigurować powiązanie między naszym niestandardowym odbiornikiem a naszym modelem, musimy wprowadzić kilka ostatecznych poprawek. Najpierw utwórz nowy plik portal.properties w następującym katalogu.
docroot/
WEB-INF/
src/
+ portal.properties
Do pliku należy dodać tylko jedną linię.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Możemy to uogólnić, mówiąc, że dla każdego nasłuchiwania modelu tworzymy powiązaną wartość właściwości, która musi mieć postać
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
Innymi słowy, gdybyśmy napisali klasę CustomerDLFolderModelListener , spakowaną w com.example.code , dla modelu DLFolder mielibyśmy następującą właściwość
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
Na koniec zlokalizuj plik liferay-hook.xml. W widoku Źródło napisz następujące.
<?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>
Wyjaśnienie
- Pierwszy wiersz jest opcjonalnym prologiem, który określa wersję dokumentu i (w niektórych przypadkach) zestaw znaków.
- Wiersz 2 jest formalną definicją DocType (DTD), która wyraźnie określa, które elementy i atrybuty są prawidłowe
- Wiersze 3 i 5 składają się z nadrzędnego elementu zaczepu (jeden z prawidłowych elementów obsługiwanych przez to DTD)
- Wiersz 4 zastępuje i rozszerza plik portal.properties w $ {liferay.home}
Aby zobaczyć, jakie inne elementy mogą być użyte w tym pliku XML, możesz odwoływać się do adresu URL w definicji DocType . Jest to standard dla wszystkich plików XML i SGML z DTD . Innym przykładem pliku Liferay XML z DTD jest service.xml (implementacja Liferay ORM oparta na Hibernacji ).
Kompiluj i wdrażaj
Budowanie i rozmieszczanie haków to prosty proces. Rozwój wtyczki Liferay obsługuje automatyzację kompilacji i zależności
- Mrówka
- Bluszcz
- Maven
- Gradle
W naszym przykładzie wykorzystaliśmy Anta do automatyzacji kompilacji. Plik build.xml zawiera polecenia kompilacji (znane jako cele w Ant ). Aby zbudować hak, po prostu wykonaj następujące polecenia.
- Zlokalizowano plik build.xml
- W swoim IDE przeciągnij plik build.xml do perspektywy Ant
- Rozwiń plik i uruchom cały cel
W widoku konsoli powinieneś zobaczyć coś podobnego do następującego
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
Po pomyślnym zbudowaniu haka nadszedł czas, aby uruchomić portal i wdrożyć go. Aby uruchomić serwer i wdrożyć hak, zlokalizuj perspektywę serwera .
- Kliknij prawym przyciskiem myszy na serwerze i kliknij Dodaj lub usuń
- Znajdź User-Listener-Hook w obszarze Dostępny wybór
- Po podświetleniu kliknij przycisk Dodaj i kliknij przycisk OK
- Kliknij przycisk Odtwórz w perspektywie serwera
Daj mi znać, jeśli masz jakieś pytania, uwagi, wątpliwości itp. Wszelkie konstruktywne opinie są bardzo mile widziane!




