2013-05-05 52 views
3

在Adobe AEM(原CQ5)中,能夠添加一些自定義html以便從組件中分離的最佳方式是什麼?從CQ組件添加到<head>

我們假設我有一個頁面,可以將我的組件放在任何可用的解析器中(所以有多個可能的實例,我不知道確切的路徑)。我希望這個組件根據它的內容(除了它的標準渲染外)向零件添加一些數據。問題在於組件的代碼是在JSP之後執行的,用於渲染,所以我不能將數據傳遞給例如。一個請求屬性。

+0

好問題。我一直在想這個。向組件添加clientlibs會將它們放在html-body的中間,這是不可取的。現在,我只是在headlib中添加所有內容,假設完全控制用戶可以添加的有限組件集。 – jedatu 2013-05-06 14:31:00

回答

2

就拿這一切與鹽的增益,漫天要價如下:

我不是100%地肯定這一點,但我總是假設組件腳本中的順序執行它們包括在頁面中,這意味着組件渲染腳本執行時,頁面已經被渲染,使得你所描述的不可能。

如果你確實需要這樣做,至少在理論上應該可以編寫一些在head或headlibs.jsp中執行的代碼,並在頁面中構建所有組件的列表(基本上只是遞歸地走jcr :頁面的內容節點樹,並構建您找到的資源類型列表),然後根據包含設置的客戶端庫類別(可能是通過使它們隱藏組件的屬性...)或其他內容。

+0

與您的建議類似,我創建了一個TabLib,它可以包含在類似於cq:includeClientLibs的headlibs.jsp中。在這種情況下,它遍歷內容節點並使用resourceType和resourceSuperType在頁面上查找組件。然後,它在組件上查找依賴項string []屬性,並使用HtmlLibraryManager編寫包含。如果需要,它可以配置爲僅渲染CSS或JS。它似乎工作正常。 – jedatu 2013-06-14 21:12:23

+0

@jedatu你可以發佈一些示例代碼? – koga73 2017-08-16 16:26:07

0

我們創建了組件「上游」或包含其他組件的包裝組件。

在上游的情況下,他們可以將屬性添加到請求對象(或與餅乾或...播放)

在「包裝」的情況下(構圖模式)時,組件的其它組件。我們通過向內部組件查找的請求屬性添加一個字符串或對象來將數據傳遞到包含的組件中。包含之後,包裝組件將刪除它添加的屬性(所以它不會意外地污染設置)。 然後,「內部組件」負責查找請求對象上的特定屬性。

<%! 
public String getPassedData(HttpServletRequest req, String attrName) { 
    final Object passed = (req.getAttribute(attrName)==null) ? "" : req.getAttribute(attrName); 
    if (override.equals("")) 
     return passed.toString(); 
    } 
%>