2013-06-24 54 views
3

訪問部分網站內容在Liferay中短版如何內JSP

我已經定義了一個自定義的Web內容結構;現在我想在自定義portlet的基於JSP的視圖中訪問併發出結構中定義的一個字段。

我正在尋找完全服務器端的東西,理想情況下完全是在JSP內完成的(即沒有自定義控制器邏輯,沒有Javascript)。我可以用少量的servlet代碼和/或奇怪的JSTL。

較長的版本

我建立一個顯示某些用戶數據自定義Portlet。如果給定的用戶沒有數據顯示,我想提供一些靜態內容。實際上有一些特殊的場景,而不是正常的數據顯示,我想顯示幾條靜態內容之一。

爲了便於維護,我將這些靜態內容作爲portlet-instance配置的一部分。由於我預計廣泛使用portlet以及希望在一個地方管理這些靜態塊,我打算創建一個新的Web內容結構來爲每個靜態場景捕獲單獨的,命名的HTML blob。然後,Portlet實例將被配置爲依靠ID中的那條Web內容。其結果是網站維護人員將能夠更新單個Web內容,並且整個網站中的所有Portlet實例都將自動反映該更改。

在其他Portlet,我利用了<liferay-ui:journal-article>標籤發出Web內容(在portlet的實例配置標識),如全部內容:

<liferay-ui:journal-article 
    groupId="${_config_templateGroupId}" 
    articleId="${_config_templateArticleId}" 
/> 

然而,在這種情況下,我想只發出一個由結構定義的字段。

The official wiki提到journal-article標籤接受可選templateId屬性。我想我可以通過爲每個場景定義單獨的模板來完成這項工作,每個場景只發布結構中所需的字段。但是,wiki也注意到templateId在版本6.0.2之前被忽略 - 我正在使用6.0 EE; Sadface少校。

我對任何可能存在的替代品很感興趣。我顯然可以將整個內容發佈到一個隱藏的元素中,然後使用Javascript將相關內容移動到聚光燈下 - 但作爲前端開發人員,這觸犯了我對基本文檔預編寫腳本的最低準確性的敏感度。

所以:沒有Javascript或基於CSS的技巧(又名煙鏡)。只有100%基於服務器的解決方案才能夠完全在相對簡單的JSP內部實施。

授予我的願望,O偉大而可怕的互聯網!

回答

1

由於這種投8小時沒有回答,讓我給你幾個選擇粗糙(unprecise)的答案,你可能要遵循:

你可以只使用一個模板和代碼邏輯(什麼領域/ content to display),而不是你的portlet。這可能或可能不是一個把可維護條件考慮進去的好處,但在我能想到的所有情況下,我更喜歡這種操作模式。輕鬆做到這一點可能取決於您對所選模板語言的經驗以及該環境的力量(您是否使用xsl,velocity或freemarker?)

如果您決定不同,文章基本上是一個xml文檔 - ,鑑於文章,你總是可以獲得XML內容並顯示/轉換或訪問部分(例如xpath)。你可能想逃避內容 - 但這取決於你。

而且,正如你提到templateId之前6.0.2忽略,你使用6.0 EE:請放心,6.0.2早於6.0 EE,所以 - 根據所引用的語句 - templateId忽視,你應該沒問題,不需要傷心。

+0

這一切是超級有趣。我將在今天進行實驗並使用我的結果更新此主題。謝謝! – Tom

+0

更新:我的第二個實驗是有缺陷的。你是對的:'templateId' * *在我的Liferay版本中得到了尊重,並且我能夠實現我期望的方法。謝謝! – Tom

2

如果我不明白你的Short version錯誤,那麼這可能是你正在尋找的解決方案。

以下是我們爲實現類似要求而編寫的Code的摘錄。

您可以參數化Xpath並作出tag出來的

public static final String DYNAMIC_ELEMENT_NAME = "/root/dynamic-element[@name='"; 
public static final String NEWS_IMAGE_URL = "imageUrl"; 
public static final String DYNAMIC_CONTENT = "']/dynamic-content";  

journalArticle = JournalArticleLocalServiceUtil.getArticle(Long.valueOf(journalArticleId)); 
Document document = SAXReaderUtil.read(journalArticle.getContent()); 
String xpathExpression = Constants.DYNAMIC_ELEMENT_NAME + Constants.NEWS_IMAGE_URL + Constants.DYNAMIC_CONTENT; 
if (document.selectSingleNode(xpathExpression) != null) { 
    String imageUrl = document.selectSingleNode(xpathExpression).getText(); 
} 
+0

我從來不需要去追求這種方法,但它確實看起來很有效。感謝發佈! – Tom