【问题标题】:How are themes applied in Adobe AEM?Adobe AEM 中如何应用主题?
【发布时间】:2013-07-15 15:00:40
【问题描述】:

Adobe AEM(以前称为 Adob​​e CQ)中的客户端库 (ClientLib) 功能可以轻松按类别包含客户端库,并且每个库都可以通过依赖关系拉入其他库。然而,围绕“主题”的文档有点薄。

link 是我能找到的关于这个主题的全部内容。以下是示例代码的摘录:

<%-- theme only (theme-js + css) --%>
<cq:includeClientLib theme="cq.collab.calendar, cq.security" />

如果要使用这个标签,CQ 将如何确定要引入哪些客户端库?它是否寻找 String[] 类型的主题属性?

或者它是否在 /etc/designs 部分中寻找某个目录结构?

还是像这样把传入的category加上theme-js到最后?

cq.collab.calendar.theme-js

还是通过 URL 调用主题?换句话说,在这种情况下,“主题”这个词是一个标记,它被一个 URL 应用主题的选择器替换了?

【问题讨论】:

    标签: aem


    【解决方案1】:

    客户端库位于 cq:ClientLibraryFolder 文件夹中。此文件夹有一个名为 category 的属性。在以下示例中,cq.collab.calendar 和 cq.security 是类别:

    <cq:includeClientLib theme="cq.collab.calendar, cq.security" />
    

    当调用此包含时,它会查找任何 cq:ClientLibraryFolder 并分配有 cq.collab.calendar 或 cq.security 类别。 使用 theme 属性添加位于父 ClientLibraryFolder 的主题文件夹中的 clientLibs 的 css 和 javascript。 如果您要查看您的页面源,这些将被添加到它们自己的 css 和 js 文件中。比如我在geometrixx clientLibary下创建了如下结构:

    geometrixx
        clientlibs
            themes
                myTheme (clientLibray)
                   css.txt
                   myCSS.css
                   js.txt
                   myJS.js
    

    如果您将主题属性与此 clientlib 一起使用,您将在源/网络选项卡中获得一个 myTheme.css 和 myTheme.js 文件。

    主题标志是一种关闭和关闭主题包含的方法。以下 cq:include 将包含 clientLibrary 中的所有 css,包括主题目录中的内容。

    <cq:includeClientLib css="apps.geometrixx-main" />
    

    但是,如果我添加主题标志并将其设置为 false,则主题目录下的任何内容都将被排除:

    <cq:includeClientLib css="apps.geometrixx-main" themed="false" />
    

    所以在这种情况下,myTheme.css 不会出现。需要注意的一点是,主题标志仅适用于“纯 css 和 js 包含”类别和主题属性不适用于此。

    这个问题的答案稍微有点过了:What exactly does currentDesign.writeCssincludes include?

    【讨论】:

    • “themed”属性是如何发挥作用的:“themed: 一个标志,指示是否应仅包含主题库或非主题库。如果省略,则包含两个集合。仅适用于纯JS 或 CSS 包含(不适用于类别或主题包含)。”如果主题只是简单地包含 JS+CSS 类别,那么“主题或非主题”指的是什么?似乎有某种主题支持,但也许我读得太多了。
    • 好的,做了更多的研究和测试并修改了我的答案。
    • 因此,即使 myTheme 的类别为“apps.geometrixx-main”,但由于其父文件夹名为“themes”,因此当 themed=false 时它不会被包含在内?
    • 顺便说一句,感谢您提供额外的信息。我之前读过另一篇文章,我同意@evil-otto 的说法,“[没有]关于如何定义主题或如何选择页面或网站的主题”
    • 是的,即使它具有“apps.geometrixx-main”类别,如果将主题设置为 false,它也不会包含在内。
    【解决方案2】:

    已经提到主题是从请求中获取的,稍微挖掘了一下,最终发现它试图从名为“forceTheme”的请求参数中获取它

    private String getDefaultThemeName(SlingHttpServletRequest request)
      {
        String theme = request.getParameter("forceTheme");
        if (theme == null) {
          theme = this.defaultUserThemeName;
        }
        return theme;
      }
    

    但需要 request.getAttribute 因为使用查询参数会将所有请求发送到 pub。

    所以猜这个主题选项根本没有用。

    【讨论】:

      【解决方案3】:

      取决于您所说的“主题”。如果你习惯了 wordpress、drupal 等,那么这些系统中所谓的主题在 CQ5/AEM 中称为“设计”。

      要设置设计,请在页面属性中选择“设计路径”。这将影响每个模板的组件信息的存储位置(在设计模式中所做的所有更改,即允许哪些组件存储在此路径下),并且是 CSS、JS 和非 DAM 图像资源存储位置的约定。这需要计划,但您可以在 AEM/CQ5 中重用代码和标记,但通过更改设计完全改变外观。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-22
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        相关资源
        最近更新 更多