3/14/2011

Inter - Portlet Communication in Liferay

IPC (Inter - Portlet Communication) ist wichtig um Beispielsweise mehrere Portlets einer Seite gleichzeitig auf sich verändernde Daten reagieren zu lassen.

Diese Blog - Serie soll nacheinander die einzelnen Möglichkeiten  beleuchten solch eine Kommunikation herzustellen. Teil I wird sich um den Liferay - JavaScript Mechanismus drehen:


Teil I : Liferay JavaScript Event System

Liferay bietet ab Version 5.1 ein eigenes JavaScript - Event - System, um IPC zu ermöglichen.
Die Folgenden 2 Methoden können (out of the box !) sofort genutzt werden, um diese Kommunikation zu ermöglichen:

  • Liferay.trigger(eventName, data) 
  • Liferay.bind(eventName, function, scope)

Hierbei wird ein System, ähnlich dem Observer Pattern genutzt: Zuerst muss sich das empfangende Portlet registrieren (binden), danach kann das sendende Portlet Daten senden (das Event triggern). Dies birgt natürlich das Problem, daß das empfangene Portlet auf jeden Fall vor dem sendenden Portlet sich binden muss. In diesem Fall empfehle ich JQuery, welches bis Liferay 5.x unterstützt wird.

Hier ein Beispiel, welches man einfach so direkt in einem Portlet nutzen kann:

jQuery(document).ready(function(){ 

Liferay.bind('event',
 function(event, data){
  var daten = data.daten;
  //process data ...
  });

});

Fehlt nur noch die sendende Seite (aufzurufen aus dem 2. Portlet):
Liferay.trigger('event', {daten: '1,2,3,4'});

Vorteile dieser Technik:
  • Schnell und unkompliziert aufzusetzen,
  • läuft out-of the box
Nachteile :
  • Wenn man die Daten im Backend braucht, muss man noch entsprechende Komponenten bereitstellen, die die Daten ins Backend bringen, dies erhöht das Coupling
  • Generell sehr starkes Coupling : Backend - Daten im ersten Portlet, Javascript in beiden Portlets und Backend im 2. Portlet müssen übereinstimmen
All das (und noch viel mehr) kann man auch sehr gut hier nachlesen:
http://www.liferay.com/web/guest/community/wiki/-/wiki/1071674/Client-side+Inter-Portlet+Communication
If you like this tutorial it would be very nice, if you could click on some of the google ads you see on the right side. It helps me run this block and motivates me ;)
If you have any questions, feel free to leave a comment.