【问题标题】:Adding to <head> from a CQ component从 CQ 组件添加到 <head>
【发布时间】:2013-05-05 10:22:11
【问题描述】:

在 Adob​​e AEM(前 CQ5)中,能够将一些自定义 html 添加到组件中的最佳方法是什么?

假设我有一个页面,我可以将我的组件放置在任何可用的 parsys 中(因此可能有多个实例,但我不知道确切的路径)。我希望这个组件根据它的内容(除了它的标准渲染)向部件添加一些数据。问题是组件的代码是在 JSP 渲染之后执行的,所以我不能通过例如传递数据来渲染。一个请求属性。

【问题讨论】:

  • 好问题。我也一直在想这个。使用组件添加客户端库会将它们放在 html-body 的中间,这是不可取的。现在我只是在 headlibs 中添加所有内容,假设完全控制用户可以添加的有限组件集。

标签: aem


【解决方案1】:

全盘皆知,胡乱猜测如下:

我不是 100% 确定这一点,但我一直假设组件脚本是按照它们包含在页面中的顺序执行的,这意味着当组件渲染脚本被执行时,页面已经已渲染,使您所描述的内容变得不可能。

如果你真的需要这个,应该可以(至少在理论上)编写一些在 head 或 headlibs.jsp 中执行的代码,并构建页面中所有组件的列表(基本上只是递归地遍历 jcr:页面的内容节点树并构建您找到的资源类型的列表),然后基于该列表包含一组客户端库类别,可能通过使它们成为组件的隐藏属性...或其他方式。

【讨论】:

  • 与您的建议类似,我创建了一个 TabLib,它可以包含在 headlibs.jsp 中,类似于 cq:includeClientLibs。在这种情况下,它会遍历内容节点并使用 resourceType 和 resourceSuperType 在页面上查找组件。然后它在组件上查找依赖项 string[] 属性并使用 HtmlLibraryManager 来编写包含。如果需要,它可以配置为仅呈现 CSS 或 JS。它似乎工作正常。
【解决方案2】:

我们创建了“上游”组件或包含其他组件的包装器组件。

在上游的情况下,他们可以向请求对象添加属性(或者玩 cookie 或 ...)

在“包装”情况下(组合模式),组件的其他组件。我们通过将字符串或对象添加到内部组件将查找的请求属性来将数据传递到包含的组件。包含后,包装器组件将删除它添加的属性(因此它不会意外污染设置)。 然后“内部组件”负责查找请求对象的特定属性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    相关资源
    最近更新 更多