2017-05-11 3 views
0

Ich bin relativ neu in AEM und auf Version 6.1. Ich versuche, Kinder basierend auf einem authorable Dateipfad aufzulisten, aber ich kann es nicht herausfinden. Zuvor hatte ich etwas wieAEM Liste Kinder von Pfad

<sly data-sly-list.child="${currentPage.getParent.listChildren}" data-sly-unwrap>...</sly> 

und es funktionierte wie beabsichtigt. Jetzt muss ich es generischer machen, aber

<sly data-sly-list.child="${properties.filePath.listChildren}" data-sly-unwrap>...</sly> 

nicht durchlaufen. Ich denke, ich muss das Objekt "Ressource" verwenden, aber nicht sicher, wie. Kann ich es direkt in meinem Anschauen verwenden? Oder muss ich aktuelle Java-Dateien erstellen/bearbeiten? Danke im Voraus!

Antwort

0

Sie könnten es nicht direkt in HTL tun seit properties.filePath gibt String zurück, und Sie haben keine listChildren-Methode in der String-Klasse.

Früher currentPage.getParent gibt eine Page zurück, die nach dem Aufruf der listChildren Methode eine Iterator<Page> zurückgibt.

Da HTL derzeit keine Methoden mit Parametern aufrufen kann, müssen Sie möglicherweise die Java Use API oder die JS Use API verwenden, um dieses Szenario zu behandeln.

Um mehr über HTL zu erfahren und API zu verwenden, siehe this doc.

2

Ich würde Ihnen raten, eine Sling Model zu verwenden, um eine Liste von Kindern zu Ihrer HTL-Vorlage zurückzugeben. Der folgende Code ist eine einfache Version eines solchen Modells auf der Basis der kleinen Informationen, die Sie haben:

import org.apache.sling.api.resource.Resource; 
import org.apache.sling.api.resource.ResourceResolver; 
import org.apache.sling.models.annotations.Optional; 
import org.apache.sling.models.annotations.Model; 
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; 
import org.apache.sling.models.annotations.injectorspecific.OSGiService; 

import java.util.Collections; 

@Model(adaptable = Resource.class) 
class MyModel { 

    @ValueMapValue 
    @Optional 
    private String filePath; 

    @OSGiService 
    private ResourceResolver resourceResolver; 

    public Iterator<Resource> getChildren() { 
     if (this.filePath == null || this.filePath.isEmpty()) { // Use StringUtils.isBlank() if you can. 
      return Collections.emptyIterator(); 
     } 

     final Resource resource = this.resourceResolver.getResource(this.filePath); 

     if (resource == null) { 
      return Collections.emptyIterator(); 
     } 

     return resource.listChildren(); 
    } 
} 

Und Ihre HTL-Vorlage könnte wie folgt aussehen:

<sly data-sly-use.model="my.package.MyModel"> 
    <sly data-sly-list.child="${model.children}" data-sly-unwrap>...</sly> 
</sly> 

Bemerkungen:

  1. Die filePath sollte @Optional sein, da es Randfälle gibt, in denen Ihre Komponente noch nicht konfiguriert ist, das Modell jedoch instanziiert wird. Beispiel: Der Editor fügt die Komponente zur Seite hinzu, hat jedoch den Bearbeitungsdialog noch nicht geöffnet und gespeichert. Die Komponente wird gerendert, das Modell wird instanziiert, aber filePath wird null sein.
  2. Offensichtlich könnte Ihre HTL-Vorlage ein wenig anders aussehen.