首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从应用程序显示模板访问web内容结构模板

如何从应用程序显示模板访问web内容结构模板
EN

Stack Overflow用户
提问于 2017-07-22 00:56:13
回答 2查看 2.2K关注 0票数 2

在Liferay DXP中,我使用Asset Publisher Portlet来显示Web内容结构条目(在本例中是员工)的列表。当我创建工作人员web内容结构时,有必要创建一个与之配套的web内容模板。

但是,我的web内容模板目前只是一个空模板,因为我不知道如何从Asset Publisher portlet用来显示我的员工列表的Application Display模板中访问它。

我的应用程序显示模板当前如下所示:

代码语言:javascript
复制
<#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}" alt="${name}">
                            <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中的模板。如下所示:

代码语言:javascript
复制
<#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>

如何才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-24 23:01:28

谢谢@gonzalezalo,但我在其他地方找到了一个不涉及任何特殊服务器配置的解决方案。

我把它贴在这里,以防其他人正在寻找这个问题的答案。

如果我们使用Liferay的liferay_ui标记(调用asset-display模块),并向其传递对AssetRenderer和我们想要发布的文章(curEntry)的引用,那么Liferay将执行查找与内容相关联的模板的繁重工作,使用当前文章填充模板并将其呈现回页面:

代码语言:javascript
复制
<#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
EN

Stack Overflow用户

发布于 2017-07-22 07:27:37

在您描述的那种情况下,甚至不需要使用SAX提取数据。看一看工作示例:

代码语言:javascript
复制
<#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),因此在使用该代码片段之前,您必须在服务器中激活它们。

我不是在DXP中工作,而是Liferay7社区,它无论如何都应该可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45242941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档