2015-11-02 5 views
2

Я хотел бы использовать data-sly-resource для включения ресурса, но только если он существует, например.Как включить ресурс в шаблон Sightly, только если он существует?

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

Если ресурс не существует выполнение скрипта выдает следующее сообщение об ошибке: Не удается найти сервлет для обработки ресурсов/содержание/блог/статистика. Из запроса списка Прогресс я могу видеть, что это SyntheticResource:

TIMER_START {resolveServlet (SyntheticResource, тип = нуль, путь =/содержание/блог/статистика)}

Как я могу включать в себя ресурс условно, только если он существует?

ответ

2

В этом случае лучшим решением было бы, чтобы ваш redis/stats компонент правильно обрабатывать ситуацию, когда Resource он должен оказывать это SyntheticResource или, в более общем случае, не дает каких-либо свойств.

Поэтому вызывающее красивый фрагмент кода должен быть:

<div class="pull-right" data-sly-resource="${'/content/blog/stats' @ resourceType='redis/stats'}"></div> 

Это заставляет рендеринга, чтобы быть вашим redis/stats компонентом, даже если /content/blog/stats ресурс не существует (ну, слинг будет возвращать SyntheticResource, как ты упомянул).

В вашем 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].

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

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> 

Это имеет Недостаток использования сценария использования, надеюсь, есть более простой способ.

0

Если ресурс вам необходимо включить является потомком текущего ресурса, например, stats, то это может сработать:

<div data-sly-test="${resource['stats/jcr:primaryType']}" 
    class="pull-right" 
    data-sly-resource="stats"></div> 
Смежные вопросы