如果资源仅存在于Sightly模板中,如何将其包含在内?

时间:2015-11-02 20:05:46

标签: sling sightly

我想使用data-sly-resource来包含资源,但前提是它存在,例如。

<div class="pull-right" data-sly-resource="/content/blog/stats"></div>

如果资源不存在,则脚本执行失败,并显示以下错误消息:找不到servlet来处理资源/内容/博客/统计信息。从请求进度列表中我可以看到它是SyntheticResource

  

TIMER_START {resolveServlet(SyntheticResource,type = null,path = / content / blog / stats)}

如果有条件地包含资源,只有它存在?

3 个答案:

答案 0 :(得分:3)

在这种情况下,最佳解决方案是允许redis/stats组件在Resource呈现的SyntheticResource<div class="pull-right" data-sly-resource="${'/content/blog/stats' @ resourceType='redis/stats'}"></div> 或更多内容时正确处理该情况通常,不提供任何财产。

因此,调用Sightly片段应为:

redis/stats

这会强制您的/content/blog/stats组件进行渲染,即使SyntheticResource资源不存在(嗯,Sling会返回redis/stats,就像您提到的那样)。

<div class="blog-stats" data-sly-test="${properties}"> <!--/* This whole block will only be rendered if properties is not empty */--> </div> 组件中,您可以尝试此安全措施:

div.blog-stats

仅当属性映射不为空[0]时才会呈现{{1}}。

[0] - https://github.com/Adobe-Marketing-Cloud/sightly-spec/blob/1.1/SPECIFICATION.md#225-test

答案 1 :(得分:2)

如果您需要包含的资源(例如stats)是当前资源的子资源,那么这可能会有效:

<div data-sly-test="${resource['stats/jcr:primaryType']}"
    class="pull-right" 
    data-sly-resource="stats"></div>

答案 2 :(得分:0)

实现一个用于测试资源是否存在的用法脚本:

<强> stats.js

use(function () {

    var hasStats = false;
    var stats = resource.getResourceResolver().getResource('/content/blog/stats');
    if ( stats != null && stats.getResourceType() == "redis/stats" ) {
        hasStats = true;
    } 

    return {
        hasStats: hasStats
    }
});

<强> page.html中

<sly data-sly-use.stats="stats.js"/>

<div data-sly-test="${stats.hasStats}" class="pull-right" data-sly-resource="/content/blog/stats"></div>

这样做的缺点是需要使用脚本,希望有一种更简单的方法。