我想使用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)}
如果有条件地包含资源,只有它存在?
答案 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>
这样做的缺点是需要使用脚本,希望有一种更简单的方法。