Liferay ADT - 从本地表单调用 Freemarker 函数

Liferay ADT - Freemarker Call Function From A Local Form

我目前正在使用 freemarker 语言与 Liferay ADT 作斗争。我想做的很简单。我只想将 Web 内容结构中的布尔字段从 true 更改为 false,反之亦然。

我通过使用这段代码实现了这一点:

<#function expire>    
<#assign isActiveNode = docXml.selectSingleNode("//dynamic-element[@name='isActive']/dynamic-content") />
    <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService")>
    <#assign expireArticle = isActiveNode.setText("false") />
    <#assign expireArticle = article.setContent(docXml.asXML()) />
    <#assign expireArticle = journalArticleLocalService.updateJournalArticle(article) />
</#function>

我知道代码有效,因为我在不使用函数的情况下尝试了它。但我希望整个 activity 通过单击按钮触发。所以我想做的是从表单或按钮调用该函数。我似乎无法做到这一点:

<form action="${expire}" method="post">
<input type="submit" value="Expire" class="btn btn-success"/>
</form>

从按钮的 onclick 事件调用它也无济于事。

它说:

Expecting a string, date or number here, Expression expire is instead a freemarker.core.Macro

那么如何从 html 标签调用 "expire" 函数?

如有任何想法,我们将不胜感激。

因为expire是一个函数,你应该像${expire()}那样调用它。但是,您的函数没有 return 值(没有 <#return someValue>),因此也会导致错误。我不确定您希望在那个 ${...} 处插入什么,但是 #return 它在 #function.

的末尾

同样,一次又一次地重新赋值给 expireArticle 变量是没有意义的;您只需覆盖旧值即可。此外,对于您只在函数内部需要的变量,使用 <#local someVar = someValue>.

更简洁