Shop Blog Kontakt

Liferay – XSL Content Portlet meets Request-Parameter

Auf einen meiner Testwanderungen durch die Portallandschaft Liferays bin ich auf das von Liferay bereits mitgebrachte Portlet „XSL-Content-Portlet“ aufmerksam geworden. Da ich bereits eine prallgefüllte XML-Datei mit Informationen zu diversen Objekte bereitgestellt habe, musste ich nur eine passende XSL-Datei erstellen, die für die Aufbereitung einer Auflistung der Titel der Objekte gebraucht wird. Damit die Anzeige auch funktioniert, musste ich eine neue Liferay-Seite erstellen und das Portlet „XSL-Content-Portlet“ in den Seitenbereich platzieren. In der Portletkonfiguration nur noch die passenden Pfade zu der XML- (kann auch per URL-Adresse angegeben werden) und XSL-Datei (im Verzeichnis webapps/root/html/portlet/xsl-content platzieren) eintragen, abspeichern und schon stand die Auflistung zur Verfügung.

Als erster erfolgreicher Versuch war das Resultat sehr zufriedenstellend, dass der Aufwand Inhalte darzustellen wieder sehr gering war freute mich sehr. Jetzt wollte ich das Ganze etwas mehr Dynamik verleihen. Meine Vorstellung war eine Auflistung der Titel wie bisher. Jeder Titel soll einen parametrisierten Link beinhalten, der auf eine Ansicht führen soll, wo nur von diesem ausgewählten Objekt Details dargestellt werden. Letztendlich habe ich es technisch umgesetzt bekommen und der Weg dorthin gleichte einem Rätsel.

Zunächst habe ich die xsl-Datei so ergänzt, dass die Links den Querystring-Parameter „ID“ enthalten. Beim Mausklick wurde wie gewünscht die gleiche Seite mit dem Parameter ID aufgerufen. Das sah auf dem ersten Blick absolut richtig aus, auf dem Zweiten allerdings nicht. Das Portlet konnte auf diesen Request-Parameter nicht zurückgreifen.

Als nächsten Test habe ich die Angabe zum Speicherort der XSL-Datei in der Portletkonfiguration um den Parameter „ID“ mit einem x-beliebigen Wert ergänzt. Testweise habe ich auch aus der XSL-Datei eine JSP-Datei gemacht und konnte so überraschender Weise serverseitigen, ausführbaren Quellcode einschleusen. Perfekt, denn per <%=request.getParameter(„ID“)%> konnte ich überprüfen ob der Request-Parameter von dort bis ans Ziel kommt. Das heißt einen Parameter kann ich mit der Anwendung von Portlets von A nach B oder B nach C transportieren. Nicht aber wie gewünscht von A über B nach C oder direkt von A nach C.

Um die Problematik zu beheben, musste dieser Parameter also durchgeschleift werden. Es musste tiefer in die Trickkiste gegriffen werden und habe es wie folgt umsetzen.

Zunächst betrachten wir das Herzstück des XSL Content Portlets und navigieren dazu in den Ordner [HOME]\webapps\portlet\xsl-content. Damit wir den Parameter durchschleifen können, öffnen wir die view.jsp und führen darin eine dafür notwendige Ergänzung durch. Suche nach dem folgenden Codeabschnitt

<%
try {
String variablePropertyKey = StringPool.BLANK;
String variablePropertyValue = StringPool.BLANK;

xmlUrl = StringUtil.replace(xmlUrl,“@portal_url@“, themeDisplay.getPortalURL());
xslUrl = StringUtil.replace(xslUrl,“@portal_url@“, themeDisplay.getPortalURL());

..und füge im Anschluss daran folgenden Codeabschnitt an.

String uebergabeParameterID = „“;

if (request.getParameter(„ID“)!=null) {
uebergabeParameterID = request.getParameter(„ID“);
xslUrl = xslUrl + „?ID=“ + uebergabeParameterID;
}

Speichere die view.jsp und ändere die Dateiänderung Deiner XSL-Datei von .xsl in .jsp. Um darin mit dem übergebenen GET-Parameter, den wir der eigentlichen XSL-Datei mitgeben, arbeiten zu können, muss der Parameter in eine XSL-Variable überliefert werden. Dieses geschieht nach Einbringung der folgenden Anweisung:

<xsl:variable name=“ID“><%=request.getParameter(„ID“)%></xsl:variable>

Speichere auch diese Datei ab.

Wichtig hierbei noch, dass man für den Link-Aufruf mit dem Parameter ID einen zusätzlichen für das Portlet relevanten Parameter mitliefern muss. Der Parameter trägt die Bezeichnung p_p_id und kann einen Wert wie z.B. 102_INSTANCE_gA5NeVY6D7ny mitführen. Dieser Wert ist individuell und kann aus der Browser-Statusleiste des Browsers erlesen werden, wenn man mit dem Mauscursor über das Symbol Portlet löschen führt. Der Linkaufbau könnte in der XSL-Anweisung (jsp-Datei!) wie folgt lauten:

<xsl:element name=“a“>
<xsl:attribute name=“href“>?ID=<xsl:value-of select=“id“/>&amp;p_p_id=102_INSTANCE_gA5NeVY6D7ny</xsl:attribute>
<xsl:value-of select=“name“/>
</xsl:element>

Zum Schluss müssen die Verweise in der Portletkonfiguration (z.B. Änderung von xsl in jsp) geprüft und angepasst werden.

Dieser Beitrag wurde erstellt am 9. September 2013 von Christian Schwarz (chriz)

Kommentare sind geschlossen.

Habe ich Ihre Interesse geweckt? Nehmen Sie Kontakt mit mir auf.
#chrizschwarz