Отображение веб-контента в шаблоне веб-контента

Я использую Liferay 7.0 ga3 и хочу создать карусель (bootstarp) со структурой/шаблоном веб-контента (freemarker). Структуры позволяют отображать в моей карусели несколько веб-контентов. Но в моем шаблоне cur_WebContent.getData() отображает имя класса и идентификатор WebContent:

{"className":"com.liferay.journal.model.JournalArticle","classPK":"42553"}

Поэтому я использую «?keep_after» и «?remove_ending» только для получения своего идентификатора:

<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>

<#assign web_content_id= cur_WebContent.getData()?keep_after("classPK\":\"")?remove_ending("\"}") >

<#assign cur_articleID = journalArticleLocalService.fetchArticle(groupId, web_content_id)>
${journalArticleLocalService.getArticleContent(cur_articleID, cur_articleID.getDDMTemplateKey(), "VIEW", locale, themeDisplay)}

Я могу отобразить эту информацию в своей карусели, например ${web_content_id}, но если я использую это в своей fetchArticle(groupId, articleId), это не сработает:

    FreeMarker template error:
The following has evaluated to null or missing:
==> journalArticleLocalService.fetchArticle(groupId, web_content_id)  [in template "20116#20160#47034" at line 7, column 30]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
    - Failed at: #assign cur_articleID = journalArticl...  [in template "20116#20160#47034" at line 7, column 5]
----

Есть идеи ? Спасибо


person Gérôme Paquant    schedule 26.06.2017    source источник
comment
classPK отличается от веб-контента ID...   -  person Gérôme Paquant    schedule 24.07.2017


Ответы (3)


Я думаю, web_content_id нужно преобразовать в число

<#assign web_content_id = [...]?number />
person fustaki    schedule 28.06.2017
comment
это не может быть число. Требуется строка - person Gérôme Paquant; 24.07.2017

Здесь classPK = "42553", но classPK отличается от веб-содержимого идентификатора.

Проницательность: ID = classPK -2 ‹=> ID = 42553 - 2 = 42551

person Gérôme Paquant    schedule 24.07.2017

Убедитесь, что вы активировали доступ для переменной serviceLocator в настройках freeMarker (https://web.liferay.com/en/community/forums/-/message_boards/view_message/73386692#_19_message_74729187), чем:

<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>

<#assign wcd_obj = webContent.getData() />
<#list wcd_obj?split(",") as x>
    <#if (x?last_index_of("classPK") != -1)>
        <#assign web_content_id = x?keep_after("classPK\":\"")?remove_ending("\"}")?remove_ending("\"") >
    </#if>
</#list>

<#if web_content_id??>
    <#assign real_web_content_id = web_content_id?number-2>
    <#assign cur_articleID = journalArticleLocalService.fetchArticle(groupId, real_web_content_id?string)>
    ${journalArticleLocalService.getArticleContent(cur_articleID, cur_articleID.getDDMTemplateKey(), "VIEW", locale, themeDisplay)}
</#if>

Я использую Gérôme Hack и разделение вместо простого ?keep_after и ?remove_ending, потому что в конфигурации live/staging variabile определяется в обратном стиле [взрыв разума].

staging -> {"className":"com.liferay.journal.model.JournalArticle","classPK":"42553"}
live -> {"classPK":"42553", "className":"com.liferay.journal.model.JournalArticle"}
person maik mr    schedule 22.03.2018