如何从应用程序显示模板访问 Web 内容结构模板
Posted
技术标签:
【中文标题】如何从应用程序显示模板访问 Web 内容结构模板【英文标题】:How can I access a web content structure template from an application display template 【发布时间】:2017-12-27 19:36:47 【问题描述】:在 Liferay DXP 中,我使用 Asset Publisher Portlet 来显示 Web 内容结构条目的列表(在这种情况下为员工)。当我创建员工 Web 内容结构时,有必要创建一个 Web 内容模板来随它去吧。
但是,我的 Web 内容模板目前只是一个空模板,因为我不知道如何从 Asset Publisher portlet 用于显示我的员工列表的应用程序显示模板访问它。
我的应用程序显示模板当前如下所示:
<#if entries?has_content>
<div class="staff-members">
<div class="container">
<h3>Our staff</h3>
<div class="row offs">
<#list entries as curEntry>
<#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContent()) />
<#assign name = docXml.valueOf("//dynamic-element[@name='name']/dynamic-content/text()") />
<#assign photo = docXml.valueOf("//dynamic-element[@name='photo']/dynamic-content/text()") />
<#assign bio = docXml.valueOf("//dynamic-element[@name='bio']/dynamic-content/node()") />
<div class="col-md-3 col-sm-6 wow fadeIn animated" data-wow-duration="2s" data-wow-delay="0.2s" style="visibility: visible; animation-duration: 2s; animation-delay: 0.2s; animation-name: fadeIn;">
<div class="thumbnail">
<img src="$photo" >
<div class="caption">
<h5>
<a href="#">$name</a>
</h5>
<p>$bio</p>
</div>
</div>
</div>
</#list>
</div>
</div>
</div>
</#if>
如您所见,我需要用额外的标记来包装工作人员标记块;这就是我使用 Asset Publisher 来显示我的应用程序显示模板的原因。
正如我所提到的,此设置需要向 Liferay 添加一个空的 Web 内容模板(用于员工结构),这看起来很愚蠢。我想做的是在该 Web 内容模板中定义可重复的标记,并从 ADT 中引用该模板。像这样:
<#if entries?has_content>
<div class="staff-members">
<div class="container">
<h3>Our staff</h3>
<div class="row offs">
<#list entries as curEntry>
<#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContent()) />
<#assign name = docXml.valueOf("//dynamic-element[@name='name']/dynamic-content/text()") />
<#assign photo = docXml.valueOf("//dynamic-element[@name='photo']/dynamic-content/text()") />
<#assign bio = docXml.valueOf("//dynamic-element[@name='bio']/dynamic-content/node()") />
<!--
CALL WEB CONTENT TEMPLATE HERE PASSING IN DATA
FOR THIS PARTICULAR WEB CONTENT ITEM.
-->
</#list>
</div>
</div>
</div>
</#if>
如何做到这一点?
【问题讨论】:
【参考方案1】:感谢@gonzalezalo,但我能够在其他地方找到不涉及任何特殊服务器配置的解决方案。
我把它贴在这里,以防其他人正在寻找这个问题的答案。
如果我们使用 Liferay 的liferay_ui
标签(调用asset-display
模块)并将AssetRenderer
的引用和我们要发布的文章(curEntry
)传递给它,那么 Liferay 将完成繁重的工作找到与内容关联的模板,用当前文章填充它并将其呈现回页面:
<#if entries?has_content>
<div class="staff-members">
<div class="container">
<h3>Our staff</h3>
<div class="row offs">
<#list entries as curEntry>
<#assign assetRenderer = curEntry.getAssetRenderer() />
<@liferay_ui["asset-display"]
assetEntry=curEntry
assetRenderer=assetRenderer
showExtraInfo=false />
</#list>
</div>
</div>
</div>
</#if>
【讨论】:
【参考方案2】:在您描述的那种情况下,您甚至不需要使用 SAX 提取数据。看看那个工作示例:
<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
<#if entries?has_content>
<#list entries as curEntry>
<#assign article = curEntry.getAssetRenderer().getArticle() />
$journalArticleLocalService.getArticleContent(article, article.getDDMTemplateKey(), "VIEW", locale, objectUtil("com.liferay.portal.kernel.portlet.PortletRequestModel", renderRequest, renderResponse), themeDisplay)
</#list>
</#if>
如您所见,我们使用了几个保留变量(serviceLocator 和 objectUtil),因此您必须在使用该 sn-p 之前在服务器中激活它们。
我不在 DXP 中工作,而是在 Liferay 7 社区工作,无论如何它应该可以工作。
【讨论】:
以上是关于如何从应用程序显示模板访问 Web 内容结构模板的主要内容,如果未能解决你的问题,请参考以下文章
ARM - 如何从存储帐户获取访问密钥,以便稍后在模板中的 AppSettings 中使用?