2012-04-04 3 views
5

Ich wollte freundliche URLs in Liferay für meine JSR-268 Portlets ermöglichen.Holen Sie sich freundliche URLs in Liferay zu arbeiten

Ich konfigurierte den freundlichen URL-Mapper, wie ich in http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/FriendlyURLMapper gesagt wurde, aber irgendwie funktioniert das nicht für mich.

Was fehlt mir?

Mein liferay-portlet.xml sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.1.0//EN"  "http://www.liferay.com/dtd/liferay-portlet-app_6_1_0.dtd"> 
<liferay-portlet-app> 
<portlet> 
    <portlet-name>content</portlet-name> 
    <friendly-url-mapper-class>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper</friendly-url-mapper-class> 
    <friendly-url-mapping>content</friendly-url-mapping> 
    <friendly-url-routes>com/gentics/cr/portlet/content-url-routes.xml</friendly-url-routes> 
    <instanceable>true</instanceable> 
</portlet> 
<portlet> 
    <portlet-name>navigation</portlet-name> 
    <icon>/icon.png</icon> 
    <instanceable>true</instanceable> 
</portlet> 
<portlet> 
    <portlet-name>search</portlet-name> 
    <icon>/icon.png</icon> 
    <instanceable>true</instanceable> 
    <!-- header-portlet-css>/css/test.css</header-portlet-css> 
    <footer-portlet-javascript>/js/test.js</footer-portlet-javascript--> 
</portlet> 
<!--role-mapper> 
    <role-name>administrator</role-name> 
    <role-link>Administrator</role-link> 
</role-mapper> 
<role-mapper> 
    <role-name>guest</role-name> 
    <role-link>Guest</role-link> 
</role-mapper> 
<role-mapper> 
    <role-name>power-user</role-name> 
    <role-link>Power User</role-link> 
</role-mapper> 
<role-mapper> 
    <role-name>user</role-name> 
    <role-link>User</role-link> 
</role-mapper--> 
</liferay-portlet-app> 

Meine content-url-routes.xml wie folgt aussieht:

<?xml version="1.0"?> 
<!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.0.0//EN" "http://www.liferay.com/dtd/liferay-friendly-url-routes_6_0_0.dtd"> 

<routes> 
<route> 
    <pattern>/content/{contentid}</pattern> 
</route> 
<!-- route> 
    <pattern>/{instanceId}/search/{filter}</pattern> 
    <implicit-parameter name="do">search</implicit-parameter> 
</route> 
<route> 
    <pattern>/{instanceId}/search/{filter}/{start}</pattern> 
    <implicit-parameter name="do">search</implicit-parameter> 
</route--> 
</routes> 

Die im Portlet gemacht Urls ist nach wie vor: http://localhost:8080/web/guest/home?p_auth=Yu81QQrj&p_p_id=content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-2&p_p_col_count=1&_content_WAR_genticsportlet_INSTANCE_R2HSaoL5RkHi_contentid=10007.33

Die URL erstellt wurde Verwenden Sie den folgenden Code:

PortletURL actionURL = response.createActionURL(); 
actionURL.setParameter("contentid", "10007.33"); 

Es wäre sehr schön, wenn du mich in die richtige Richtung ...

zeigen könnte

Antwort

4

sollte Ihr Weg mit dem Teil nach content als content ist bereits Teil der erzeugten URL starten. Der Wert <friendly-url-mapping>content</friendly-url-mapping> wird dafür verwendet.

<route> 
    <pattern>/{contentid}</pattern> 
</route> 

auch sicher, dass die DTD auf den neuesten in Ihrem *-url-routes.xml zu ändern.

<!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.1.0//EN" "http://www.liferay.com/dtd/liferay-friendly-url-routes_6_1_0.dtd"> 
+0

Ich habe gerade versucht, dass ... aber es funktioniert immer noch nicht. Ich gehe davon aus, dass das URL-Mapping auf beide Arten funktioniert: Die URLs im Content sollten bereits als freundliche URLs gerendert werden ... oder? Könnte es auch ein Problem mit der instanceid/instantable geben? – csupnig

+0

Ich hatte genau diesen Zweifel, als ich gestern damit begann, freundliche URLs zu erkunden. Nach viel Debugging stellt sich heraus, dass es funktioniert. Ich habe einen generischen '/' hinzugefügt, um es zum Laufen zu bringen. Versuchen Sie es mit instanceable = false, um 'instanceid'-Probleme auszuschließen. – adarshr

+0

Danke ... der generische / hat zumindest etwas verändert. Jetzt sieht meine URL wie folgt aus: http: // localhost: 8080/web/gast/home/-/content /? P_auth = Yu81QQrj & p_p_lifecycle = 1 & _content_WAR_genticsportlet_INSTANCE_R2HSao5RkHi_contentid = 10007.34 Ich setze auch instanceable auf false, aber ich bekomme immer noch den INSTANCE_R2 ... im Parameter contentid :/Ich muss wahrscheinlich nur ein bisschen herumspielen. – csupnig

3

von Adarshr Im Anschluss an beantwortet Ihnen auch der/loswerden können -/Teil Ihre eigene Klasse, indem die DefaultFriendlyURLMapper erweitert und überschreibt die Methode isCheckMappingWithPrefix so erhalten Sie:

@Override 
public boolean isCheckMappingWithPrefix() {  
    return false; 
} 

So Deine URLs wären einfach http://community_name.com/web/group_name/page_name/content/contentId. Dann legen Sie Ihre Klasse in den Friendly-URL-Mapper-Klasse-Tags fest.

https://github.com/DevJonny/Liferay-6-Friendlier-Friendly-URL-Mapper

~~ EDIT ~~

Dank Prakash für den Hinweis auf, dass die alte Verbindung nicht funktioniert: Was Sie ein Beispiel in diesem Portlet-Projekt auf GitHub sehen.

+1

vielen Dank für die Verknüpfung des Artikels ... Ich werde es mir ansehen :) – csupnig

+0

Keine Sorge! :) lassen Sie es mich wissen, wenn Sie Fragen oder Vorschläge zur Verbesserung haben! – Jonny

+1

Super Tipp! Ich werde das wahrscheinlich in meinem Projekt verwenden. – adarshr

0

ich erreicht alle params mit Ausnahme der p_auth und meine javax.portlet.action zu entfernen, indem

<pattern>/myportlet</pattern> 
<ignored-parameter name="p_p_lifecycle" /> 
<ignored-parameter name="p_p_state" /> 
<ignored-parameter name="p_p_mode" /> 

Lifecycle, Zustand und Modus aus der URL verschwinden werden. Aber keine Möglichkeit, die p_auth und den Rest der URL zu entfernen:

Verwandte Themen