Liferay 6.2 - (VM) Шаблон Velocity для публикации активов - как получить переменную, которая находится внутри другой переменной?

Я разрабатываю новый шаблон для своего издателя активов, чтобы получить все содержимое с классом

com.liferay.portlet.journal.model.JournalArticle

с определенного сайта.

В моей структуре веб-контента у меня есть:
-Image

внутри этого изображения:

-есть текстовая переменная буксировки

-один для названия

-one для описания
вот код моей структуры:

<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" width="">
    <dynamic-element dataType="string" indexType="keyword" localizable="true" name="title" readOnly="false" repeatable="false" required="false" showLabel="true" type="text" width="small">
        <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" width="small">
        <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>

and here is how it's appears : Screenshot of my structure

Теперь я написал этот код в своем шаблоне активов, используя (VM) или макросы Velocity.

#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"? Итак, мне нужно добраться до этих двух текстовых переменных


person Mohammed Alawneh    schedule 21.08.2017    source источник


Ответы (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, это даст вам то, что находится внутри имени.

EDIT Хорошо, извините, я неправильно понял ваш вопрос. Вы создаете шаблон издателя ресурсов, а не шаблон статьи. Поэтому я думаю, что ваш способ - правильный способ отображения встроенных переменных. Ниже приведен ваш измененный шаблон, который отображает изображение, заголовок и описание:

#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

И эффект: введите здесь описание изображения

person Klimiuk S    schedule 21.08.2017
comment
На скрине финальный эффект и код шаблона выложен выше :). Это выглядит так $myImage — это печатает всю переменную, показанную выше. $myImage.title.getData() — печатает вложенный заголовок. $myImage.desc.getData() — печатает вложенное описание. я отредактировал свой ответ - person Klimiuk S; 22.08.2017
comment
хорошо, я вас понимаю, но я хочу знать, где разместить этот код в моем шаблоне :) - person Mohammed Alawneh; 22.08.2017