Aem 获取clientlibs文件的路径

Aem 获取clientlibs文件的路径,aem,sling,sightly,htl,Aem,Sling,Sightly,Htl,我正试图像解释的那样预加载资产 我已经在/apps/foundation/components/page/head.html中包含了这些内容: <sly data-sly-use.appConfig="${'../../../utils/AppConfig.js'}"> <link rel="preload" href="${appConfig.assetsURL}/etc/designs/myapp/jquery/jquery-3.1.1.min.js">

我正试图像解释的那样预加载资产

我已经在
/apps/foundation/components/page/head.html
中包含了这些内容:

  <sly data-sly-use.appConfig="${'../../../utils/AppConfig.js'}">
    <link rel="preload" href="${appConfig.assetsURL}/etc/designs/myapp/jquery/jquery-3.1.1.min.js">
    <link rel="preload" href="${appConfig.mainStyle}/mainstyle.css">
  </sly>

现在,需要包括的最后文件是
clientlibs.js
clientlibs.css
,它们为每个页面放在一起,根据页面的不同有不同的路径。例如,对于主页(/content/homepage.html),clientlibs.js的路径是
/etc/designs/myapp/homepage/clientlibs.js
,而对于最近的帖子(/content/recent posts.html),路径是
/etc/designs/myapp/posts/clientlibs.js

问题是如何为这些资产组合URL


我尝试使用来自的全局变量,但没有成功。它们都没有返回到资产的正确路径。

因为clientlibs路径到页面的映射似乎是特定于应用程序的,所以您需要实现一种方法来检测页面类型和所需的clientlibs

您可以使用clientlib类别来为每种页面类型组合正确的位(看看如何在
/libs/granite/sightly/templates
中实现clientlib包含)

此外,如果使用AEM 6.3,考虑使用可编辑模板并在模板级别设置clitLIB。< /P> 如果您已经使用clientlib类别,并且只想重写clientlib include的输出,则可以创建自己的帮助程序来提取URL:

package apps.test;

import javax.script.Bindings;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.sling.scripting.sightly.pojo.Use;

import libs.granite.sightly.templates.ClientLibUseObject;

public class Test implements Use {

    ClientLibUseObject obj = null;
    Pattern pattern = Pattern.compile("(?:href|src)=\"(.*?)\"");
    List<String> srcs = null;

    public void init(Bindings bindings) {
        obj = (ClientLibUseObject) bindings.get("clientLibUseObject");
    }

    public List<String> getSrcs() {
        if (srcs == null && obj != null) {
            srcs = new ArrayList<>();
            String tmp = obj.include();
            Matcher matcher = pattern.matcher(tmp);
            while (matcher.find()) {
                srcs.add(matcher.group(1));
            }
        }
        return srcs;
    }
}
package apps.test;
导入javax.script.Bindings;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入org.apache.sling.scripting.sighly.pojo.Use;
导入libs.granite.sightly.templates.ClientLibUseObject;
公共类测试实现了使用{
ClientLibUseObject obj=null;
Pattern=Pattern.compile(“(?:href | src)=\”(.*?\”);
列表srcs=null;
公共void init(绑定绑定){
obj=(ClientLibUseObject)bindings.get(“ClientLibUseObject”);
}
公共列表getSrcs(){
如果(srcs==null&&obj!=null){
srcs=newarraylist();
字符串tmp=obj.include();
Matcher-Matcher=pattern.Matcher(tmp);
while(matcher.find()){
srcs.add(matcher.group(1));
}
}
返回src;
}
}
然后在脚本中调用它:

<link data-sly-use.clientLibUseObject="${'libs.granite.sightly.templates.ClientLibUseObject' @ categories='jquery,jquery-ui', mode='all'}"
          data-sly-use.rewriter="${'Test' @ clientLibUseObject=clientLibUseObject}"
          data-sly-repeat="${rewriter.srcs}"
          rel="preload" href="${item}"/>


我实际上是在使用模板,并使用
categories
属性在此级别设置clientlibs。(
)但是在我们需要创建链接标记的头部,我只需要资产的url,而不是整个脚本标记。解决这个问题似乎需要从categories属性获取资产的url。你知道我怎样才能做到这一点吗?@TiberiuMaxim:添加了一个suggestionThx@vlad。我把它搁置了,但现在又恢复了。当我尝试运行您的示例时,我得到的
包org.apache.sling.scripting.sightly.pojo不存在
。我不知道如何将其添加到我的项目中。您能在这方面提供帮助吗?@TiberiuMaxim,您使用的AEM版本是什么?我们目前正在从6.1切换到6.3。所以我应该在6.3中实现它