Liferay is a Gartner Magic Quadrant Leader for the Sixth Year! Find out why

Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Alex B
Communication inter-portlet et connexion base de données
May 31, 2012 7:51 AM
Answer

Alex B

Rank: New Member

Posts: 18

Join Date: May 31, 2012

Recent Posts

Bonjour,

J'ai installé un portail Liferay 6.1, et je travaille avec Liferay IDE sous Eclipse.
J'ai crée un premier portlet "A" de type "sélecteur de date" (datepicker JQuery) et un second portlet "B", qui pour le moment, affiche la date sélectionnée par le portlet A.
Les portlets communiquent du côté client, au moyen des méthodes Liferay.fire(...) et Liferay.on(...). L’évènement envoyé à B est le changement de date dans le portlet A (B se met bien à jour à chaque nouveau changement de date dans A).
J'ai une base de données MySQL, avec une table contenant , notamment, un champs 'date de création'.

Ce que Je voudrais maintenant c'est que quand le portlet B reçoive la date, il fasse une requête sur cette base de type : select * from maTable WHERE dateCreation= << date reçue par déclenchement de l’évènement sur le portlet A>>.
Mais je ne sais pas vraiment quoi utiliser pour y parvenir...Dois-je utiliser le javascript ? Ou un évènement dans ma classe java ?
Auriez-vous un début de piste, une solution ou un tutoriel qui me permettrait d'avancer ?

Merci,

Portlet A :
1
2$("#datepicker").change(function() {
3    Liferay.fire('updateDate', { date : $("#datepicker").datepicker("getDate") });
4    return false;
5});


Portlet B :
1
2<script>
3    Liferay.on('updateDate', function(event) {
4        $("span.info").html('Date choisie: ' + event.date);
5    });
6</script>
7<br />
8<span class="info">Veuillez sélectionner une date afin de lancer la recherche.</span>
Alex B
RE: Communication inter-portlet et connexion base de données
June 1, 2012 12:37 AM
Answer

Alex B

Rank: New Member

Posts: 18

Join Date: May 31, 2012

Recent Posts

Bonjour,

Aucune idée ?
Peut-être pour clarifier un peu, ce que je veux c'est gérer un évènement, récupérer les données associées à cet évènement, et les utiliser pour une interrogation ou une insertion dans la base.

Est ce que l'approche développée ci-dessus (javascript) pourrait fonctionner (et dans ce cas, comment transmettre le "event.date" à une requête sql) ?
Ou alors, faut-il plutôt que je regarde du côté java, en mettant en place un listener sur cet évenement ?
Est ce que pour ce genre de portlet (reception d'un évenement puis interrogation de la base de données), il serait plus judicieux de passer par Vaadin ?

merci,
Pascal SIMON
RE: Communication inter-portlet et connexion base de données
June 1, 2012 1:08 AM
Answer

Pascal SIMON

Rank: Junior Member

Posts: 82

Join Date: February 18, 2009

Recent Posts

Bonjour Alex,

Le plus simple et le plus propre (le moins de couplage) pour faire communiquer deux portlets entre elles et l'utilisation des évenements.
La premiere portlet va generer l'évenement et l'autre va l'ecouter.
Tu vas devoir déclarer l'évenement dans le portlet.xml ainsi que quelle portlet produit l'évènenemt et laquelle le consomme.
Ensuite dans le processAction de la premiere tu jettes l'évenement et dans le process event de la seconde tu la consommes.
Le message transmis (ou payload) via l'event est un objet dans lequel tu pourras aisement encapsuler ta date.

Bon courage,

Pascal
Alex B
RE: Communication inter-portlet et connexion base de données
June 1, 2012 2:42 AM
Answer

Alex B

Rank: New Member

Posts: 18

Join Date: May 31, 2012

Recent Posts

Très bien, j'avais lu cet article http://natoine.developpez.com/tutoriels/java/portlet/
c'est bien ce que tu me conseilles de faire ?

Mon processAction est l'équivalent du trigger/fire et le processEvent du bind/on c'est bien cela ?
Ensuite, j'envoie un objet encapsulant ma date (et/ou tout autre attributs) au lieu d'une chaîne de caractères ?
Pascal SIMON
RE: Communication inter-portlet et connexion base de données
June 1, 2012 2:58 AM
Answer

Pascal SIMON

Rank: Junior Member

Posts: 82

Join Date: February 18, 2009

Recent Posts

C''est cela mais l'exemple que tu donnes est avec jboss portal.
Il est aussi plus lisible d'utiliser les annotations.

En plus détaillé (en passant un String comme Payload) :
  • Portlet.xml

A l'interieur du tag portlet de la portlet envoyant l'event :
<supported-publishing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.myevent</qname>
</supported-publishing-event>

A l'interieur du tag portlet de la portlet recevant l'event :
<supported-processing-event>
<qname xmlns:x="http://liferay.com/events">x:ipc.myevent</qname>
</supported-processing-event>

A la fin avant portlet-app
<event-definition>
<qname xmlns:x="http://liferay.com/events">x:ipc.myevent</qname>
<value-type>java.lang.String</value-type>
</event-definition>
  • classe de la portlet emettrice

Dans la classe de la portlet envoyant l'event :
@ProcessAction(name = "truc")
public void truc(ActionRequest request, ActionResponse response) {
QName qName = new QName("http://liferay.com/events", "ipc.myevent");
response.setEvent(qName, "on est le 1er Juin");
}
  • jsp associée :

<a href="<portlet:actionURL name="truc"></portlet:actionURL>">c'est parti</a>



Je te laisse faire un @ProcessEvent dans la portlet d'arrivée et un request.getEvent ...

Pascal
Alex B
RE: Communication inter-portlet et connexion base de données
June 1, 2012 5:11 AM
Answer

Alex B

Rank: New Member

Posts: 18

Join Date: May 31, 2012

Recent Posts

Ok, je te remercie pour tes réponses détaillées, je commence à y voir plus clair.
Nouvelles questions tout de même (adressées à tous et toutes):
  • Au niveau du payload, petite précision: si je veux passer une date (ou un objet encapsulant des dates), je peux faire directement:
    response.setEvent(qName, new Date()) ? (ou de manière générale response.setEvent(qName, new MyObjet()) ?)
  • Si je veux utiliser ce payload pour faire une requête (select) sur la base de données, comment faire pour afficher les données récupérées en base juste après le déclenchement de l'action (en gros, comment appeler la méthode dans le jsp) ?
  • Enfin, je récupère une date grâce à un datePicker javascript (JQuery), je n'ai donc pas de liens, je voudrais que l’évènement soit associé à la méthode "onChange()" de mon datePicker. Comment faire alors pour déclencher l'action ?
  • Question # : Est ce que Vaadin ne serait pas plus pratique pour ce genre d'application 'côté client' ?


Je continue mes recherches en parallèle.
merci,