如何从应用程序显示模板访问 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 内容结构模板的主要内容,如果未能解决你的问题,请参考以下文章

golang 中 Template 的使用

如何以编程方式创建 Liferay 7 Web 内容模板?

ARM - 如何从存储帐户获取访问密钥,以便稍后在模板中的 AppSettings 中使用?

如何在 Lightroom Web 引擎 Lua 模板中显示“Y 的图像 X”?

如何访问剑道网格页脚模板值

如何从代码隐藏中访问控件模板的元素