Liferay 6.2 - (VM)资产发布者的速度模板 - 如何获取它在另一个变量中的变量?

Posted

技术标签:

【中文标题】Liferay 6.2 - (VM)资产发布者的速度模板 - 如何获取它在另一个变量中的变量?【英文标题】:Liferay 6.2 - (VM) Velocity template for asset publisher - how to get a variable that it is inside another variable? 【发布时间】:2018-01-29 06:02:50 【问题描述】:

我正在为我的资产发布者设计一个新模板,以获取具有类的所有内容

com.liferay.portlet.journal.model.JournalArticle

来自特定网站。

在我的网页内容结构中,我有: -图片

在这张图片里面:

-有两个文本变量

-一个标题

-一个用于描述 这是我的结构代码:

<root available-locales="en_US" default-locale="en_US">
<dynamic-element dataType="image" fieldNamespace="wcm" indexType="keyword" localizable="true" name="myImage" readOnly="false" repeatable="false" required="false" showLabel="true" type="wcm-image" >
    <dynamic-element dataType="string" indexType="keyword" localizable="true" name="title" readOnly="false" repeatable="false" required="false" showLabel="true" type="text" >
        <meta-data locale="en_US">
            <entry name="label">
                <![CDATA[Title]]>
            </entry>
            <entry name="predefinedValue">
                <![CDATA[]]>
            </entry>
            <entry name="tip">
                <![CDATA[]]>
            </entry>
        </meta-data>
    </dynamic-element>
    <dynamic-element dataType="string" indexType="keyword" localizable="true" name="desc" readOnly="false" repeatable="false" required="false" showLabel="true" type="text" >
        <meta-data locale="en_US">
            <entry name="label">
                <![CDATA[Description]]>
            </entry>
            <entry name="predefinedValue">
                <![CDATA[]]>
            </entry>
            <entry name="tip">
                <![CDATA[]]>
            </entry>
        </meta-data>
    </dynamic-element>
    <meta-data locale="en_US">
        <entry name="label">
            <![CDATA[Image]]>
        </entry>
        <entry name="predefinedValue">
            <![CDATA[]]>
        </entry>
        <entry name="tip">
            <![CDATA[]]>
        </entry>
    </meta-data>
</dynamic-element>

这是它的外观: Screenshot of my structure

现在我使用 (VM) 或 Velocity Macros 在我的资产模板中编写了这段代码

#if (!$entries.isEmpty())

#foreach ($entry in $entries)
    #set($renderer = $entry.getAssetRenderer() )
    #set($className = $renderer.getClassName() )

    #if( $className == "com.liferay.portlet.journal.model.JournalArticle" )
        #set( $journalArticle = $renderer.getArticle() )
        #set( $document = $saxReaderUtil.read($journalArticle.getContent()) )
        #set( $rootElement = $document.getRootElement() )

        #foreach( $dynamicElement in $rootElement.elements() )
            #if( "myImage" == $dynamicElement.attributeValue("name") )
                #set( $myImage = $dynamicElement.element("dynamic-content").getText() ) 
                #end

        <img src="$myImage" > 
        #end

    #end
#end

结束

从这段代码中我可以访问我的图像,但我的问题是我无法找到一种方法来获取图像中的变量,一个是 name="title" 而另一个是 name="desc" ? 所以,我需要达到这两个文本变量

【问题讨论】:

【参考方案1】:

因此,从结构字段中检查数据的最简单方法是打印变量并查看其中的内容。我从你的帖子中获取了结构。所以我创建了一个结构然后基于它的文章。

然后我打印了$myImage 变量,它看起来像这样:

name=myImage, data=/image/journal/article?img_id=22009&t=1503342749476, type=image, options=[], title=name=title, data=colorful bird, type=text, options=[], desc=name=desc, data=this is a birdie, type=text, options=[]

如您所见,它包含图像、标题和描述,因此要提取它们,只需使用(这是我的以下屏幕模板代码):

$myImage
$myImage.title.getData()
$myImage.desc.getData()

打印 $myImage 的最终效果:

如果您想要一个名称属性,只需使用$myImage.title.name,它会为您提供名称中的内容。

编辑 好的,对不起,我误读了你的问题。您正在创建资产发布者模板而不是文章模板。所以我认为你的方式是显示嵌入变量的正确方式。以下是显示图像、标题和描述的修改后的模板:

#foreach ($entry in $entries)
    #set($renderer = $entry.getAssetRenderer() )
    #set($className = $renderer.getClassName() )

    #if( $className == "com.liferay.portlet.journal.model.JournalArticle" )
        #set( $journalArticle = $renderer.getArticle() )
        #set( $document = $saxReaderUtil.read($journalArticle.getContent()) )
        #set( $rootElement = $document.getRootElement() )

        #foreach( $dynamicElement in $rootElement.elements() )
            #if( "myImage" == $dynamicElement.attributeValue("name") )
                #set( $myImage = $dynamicElement.element("dynamic-content").getText() ) 
            #end
            #foreach( $embeddedElement in $dynamicElement.elements() )
                #if( "title" == $embeddedElement.attributeValue("name") )
                    #set( $title = $embeddedElement.elements().get(0).getText() ) 
                #end
                #if( "desc" == $embeddedElement.attributeValue("name") )
                    #set( $desc = $embeddedElement.elements().get(0).getText() ) 
                #end
            #end 
            <br/>
            <img src="$myImage" > 
            <br/>
            <br/>
            Title: $title
            <br/>
            Description: $desc
        #end

    #end
#end

还有效果:

【讨论】:

屏幕上是最终效果,模板代码贴在上面:)。它看起来像这样$myImage - 这会打印上面显示的整个变量。 $myImage.title.getData() - 这将打印嵌套标题。 $myImage.desc.getData() - 这将打印嵌套描述。我已经编辑了我的答案 好的,我理解你,但我想知道在我的模板中放置这段代码的位置:)

以上是关于Liferay 6.2 - (VM)资产发布者的速度模板 - 如何获取它在另一个变量中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 liferay 6.2 中自定义停靠栏

Liferay 6.2 启动失败,出现 500 错误

Intellij Idea Liferay 6.2 服务器

Liferay 6.2 布局不同大小的行

CSS 文件中的背景图像路径 - Liferay 6.2

覆盖特定类 PwdEncryptor liferay 6.2