2017-08-21 2 views
0

Je suis la conception d'un nouveau modèle pour mon éditeur d'actifs pour obtenir tout le contenu avec une classeLiferay 6.2 - (VM) Modèle de vélocité pour l'éditeur d'assets - comment obtenir une variable dans une autre variable?

com.liferay.portlet.journal.model.JournalArticle

à partir d'un site spécifique.

Dans ma structure de contenu web j'ai:
-Image

dans cette image:

-Il y remorque variable texte

pour le titre -one

pour la description -one
voici mon code de structure:

<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> 

et voici comment il est apparaît: Screenshot of my structure

Maintenant, j'écrit ce code dans mon modèle d'actif à l'aide (VM) ou des macros 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 

extrémité

de ce code je peux atteindre mon image, mais mon problème est que je ne peux pas trouver un moyen d'obtenir les variables à l'intérieur de l'image, l'un avec name = "title" et un autre avec name = "desc"? Donc, j'ai besoin d'atteindre ces variables de texte de remorquage

Répondre

2

Donc la manière la plus simple d'examiner les données à partir de champs de structure est d'imprimer la variable et de regarder ce qu'il y a dedans. J'ai pris la structure de votre poste. J'ai donc créé une structure puis un article basé dessus.

enter image description here

Alors j'ai imprimé la variable $myImage et il ressemble à ceci:

{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=[]}} 

Donc, comme vous pouvez le voir contient une image, le titre et la description afin de les extraire, il suffit d'utiliser (CECI EST MON CODE MODÈLE POUR écran ci-dessous):

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

effet final avec myImage $ imprimé: enter image description here

Si vous voulez un attribut de nom il suffit d'utiliser $myImage.title.name, il vous donnera ce qu'il y a à l'intérieur du nom.

EDIT Ok, je suis désolé j'ai mal interprété votre question. Vous créez le modèle d'éditeur d'élément et non le modèle d'article. Donc, je pense que votre chemin est la bonne façon d'afficher les variables intégrées.Ci-dessous votre modèle modifié qui affiche l'image, le titre et la description:

#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 

Et l'effet: enter image description here

+0

peut-je voir votre code de modèle s'il vous plaît? –

+0

Sur l'écran est l'effet final et le code du modèle est affiché ci-dessus :). Cela ressemble à ceci: '$ myImage' - ceci imprime toute la variable montrée ci-dessus. '$ myImage.title.getData()' - ceci affiche le titre imbriqué. '$ myImage.desc.getData()' - ceci affiche la description imbriquée. J'ai édité ma réponse –

+0

d'accord, je vous comprends, mais je veux savoir où placer ce code dans mon modèle :) –