Тип даты требуется в AEM HTL / Sightly форматере даты - PullRequest
0 голосов
/ 04 февраля 2019

Я видел, что после AEM 6.3 форматирование даты изначально поддерживалось в разметке, например:

${ 'dd~MMMM-yyyy' @ format=currentPage.jcr:created }

(Ссылка: https://github.com/adobe/htl-spec/blob/master/SPECIFICATION.md#1222-dates)

Я попытался поиграть с этим форматером, используя это свойство jcr: creation, а также данные, поступающие из бэкэнда в java.util.Date.

У меня вопрос, поддерживаются ли другие типы дат?Как сказать, java.time.LocalDate?Он не отображается на моих тестовых страницах, хотя я не уверен, что мне не хватает какого-то дополнительного свойства, которое необходимо указать в разметке HTL?

1 Ответ

0 голосов
/ 06 февраля 2019

Насколько я могу судить, в документации это не упоминается, но Apache Sling - это проект с открытым исходным кодом, поэтому мы можем посмотреть его самостоятельно.

Рассмотрим детали реализации, единственные поддерживаемые типы, такие какНа данный момент java.util.Date и java.util.Calendar и их подклассы.

Вот FormatFilterExtension класс , отвечающий за применение выбранного формата в HTL.

Давайте посмотрим на проверку, которую он выполняет.

 } else if (DATE_FORMAT_TYPE.equals(formattingType) || (!hasPlaceHolders && runtimeObjectModel.isDate(formatObject))) {
      Locale locale = getLocale(runtimeObjectModel, options);
      TimeZone timezone = getTimezone(runtimeObjectModel, options);
      return formatDate(source, runtimeObjectModel.toDate(formatObject), locale, timezone);
 }

Он использует runtimeObjectModel.isDate(), чтобы проверить, имеем ли мы дело с датой.Если мы посмотрим на runtimeObjectModel, то увидим, что это экземпляр SlingRuntimeObjectModel, который, в свою очередь, расширяет AbstractRuntimeModel.

@Override
public boolean isDate(Object target) {
    return (target instanceof Date || target instanceof Calendar);
}

, так что еслиэто Date или Calendar, он будет обработан.

Даже если вы введете такой тип форматирования, как этот

${'yyyy-MM-dd' @ format=myDate, type='date'} <!--/* Forced formatting type */-->

, объект, который вы передадите, будет обработан с использованиемAbstractRuntimeObjectModel#toDate(Object object), который возвращает null для всех объектов, которые не являются экземплярами Date или Calendar.

Поскольку проверка основана на instanceof, это также включаетэкземпляры подтипов Date и Calendar.LocalDate, однако, не является одним из них, поэтому неудивительно, что это не сработало.

...