Questions & Answers

SOLVED
Freecastle
I'm new here

CMS_INPUT_PERMISSION: Werte via FS-API auslesen

Jump to solution

Hallo,

ich wollte kรผrzlich via FS-API die Werte dieser Komponente auslesen, komme aber nicht wirklich weiter.

Dazu folgender Pseudocode:

metaData = pageRef.getMeta(); //Angenommen pageRef ist ein gรผltiges PageRef-Objekt

perms = metaData.get("roles").getEditor().get(null); //perms ist jetzt ein Objekt der Klasse PermissionsImpl und roles ist der Name der Komponente

Ich nehme an dass "persm" dem Interface Permissions der FS-API entspricht (/help/odfs/access/index.html).

Hier gibt es auch die Methode getAllowed(String). Allerdings weiรŸ ich nicht was es hier fรผr mรถgliche Werte als Parameter gibt bzw. ich hab sie nicht in der Javadoc gefunden.

Kann mir da jemand weiterhelfen?

1 Solution

Accepted Solutions

Bei der Prรผfung der Metadaten sollte allein schon aus Performancegrรผnden zunรคchst geprรผft werden, ob an dem jeweiligen Knoten Metadaten gesetzt sind. Hierzu gibt es in IDProvider die Methode #hasMeta(). Wenn man sich die Metadaten รผber #getMeta() holt von einem Knoten, an dem Sie nicht gesetzt waren, erhรคlt man ein ein leeres MetaData Objekt, welches dann auch Rรผckgriffwerte aus dem Template enthรคlt. Das wรคre in Ihrem Fall aber nicht gewรผnscht denke ich.

View solution in original post

0 Kudos
11 Replies
gockel
Crownpeak employee

Hallo,

von welchem Typ ist der Editor mit dem Variablennamen "roles". Im Titel steht CMS_INPUT_CHECKBOX und im Text sprechen sie von Permission, was nicht zu Checkbox passen wรผrde.

Es geht ja um Metadaten. Kรถnnen Sie das Formular des Metadatentemplate hier hochladen bzw. die Definition des Editors den sie auslesen wollen und genau beschreiben, von welcher der Eingabekomponenten sie die Daten auslesen wollen.

Gruss

0 Kudos

Ups sry, da hab ich mich im Titel vertan. Habs editiert.

Hier ist die Formular-Definition der Eingabekomponente:

<CMS_INPUT_PERMISSION name="roles" group="epintegration" hFill="yes">
            <ACTIVITIES>
              <ACTIVITY name="access">
                <LANGINFOS>
                  <LANGINFO lang="*" label="Read"/>
                  <LANGINFO lang="DE" label="Lesen"/>
                </LANGINFOS>
              </ACTIVITY>
            </ACTIVITIES>
            <LANGINFOS>
              <LANGINFO lang="*" label="Access rights" description="Please select the roles that should be allowed to access these folder."/>
              <LANGINFO lang="DE" label="Zugriffsrechte" description="Bitte wรคhlen Sie die Portalrollen aus."/>
            </LANGINFOS>
          </CMS_INPUT_PERMISSION>

0 Kudos

O.K.

also geht es um das Auslesen von Daten aus dem PermissionEditorValue. Dessen Persitenztyp ist Permissions und die Methode #getAllowed(String operation) erwartet einen der Aktivitรคtennamen, den sie im Formular definiert haben.

In Ihrem Fall gibt es nur einen, nรคmlich "access".

metaData = pageRef.getMeta(); // get meta data

perms = metaData.get("roles").getEditor().get(null);     // no language metadata is language independent
perms.getAllowed("access")

Die Menge der verfรผgbaren Aktivitรคtennamen kรถnnen Sie sich mit #getActivityNames() holen.

Gruss

Hi,

danke fรผr die schnelle Hilfe! Es ist tatsรคchlich so, dass ich รผber den Aktivitรคtsnamen an die Berechtigungen komme.

Ich hรคtte jetzt eigentlich vermutet, dass ich รผber getAllowed(String), alle Berechtigungen (d.h. auch die vererbten und nicht explitzit gesetzten) bekomme und รผber getAllowedExplicit(String) nur die am Objekt selbst gesetzten Berechtigungen. Dies scheint aber nicht der Fall zu sein, denn ich kriege bei beiden Methoden nur die explizit gesetzten Berechtigungen.

Gibt es da noch eine API-Methode um relativ einfach auch an die vererbten Berechtigungen zu kommen, oder muss ich diese manuell durch Hochtraversieren im Baum holen?

0 Kudos

Ich hรคtte jetzt eigentlich vermutet, dass ich รผber getAllowed(String),  alle Berechtigungen (d.h. auch die vererbten und nicht explitzit  gesetzten) bekomme und รผber getAllowedExplicit(String) nur die am Objekt  selbst gesetzten Berechtigungen. Dies scheint aber nicht der Fall zu  sein, denn ich kriege bei beiden Methoden nur die explizit gesetzten  Berechtigungen.

Es ist so, dass sich die Methoden #getAllowed(String) und #getAllowedExplicit(String) nur auf die Vererbungshierachie innerhalb der Komponente beziehen und nicht auf die Vererbung der Metadaten.

Ein Beispiel:

perm.jpg

In diesem Fall liefert:

#getAllowed("zwei"): Die IDs sowohl von "Anonyme Besucher", als auch von dem vererbten Wert von "1. anonyme Besuchergruppe"

#getAllowedExplicit("zwei"): Nur die ID von "Anonyme Besucher"

Ok, vielen dank fรผr die ausfรผhrliche Erklรคrung!

D.h. aber dann auch, dass ich manuell nach oben traversieren muss um an die vererbten Berechtigungen zu kommen oder?

0 Kudos
Freecastle
I'm new here

Hi,

nochmal wegen den vererbten Berechtigungen. Ich habs jetzt genauso mit dem Back-Traversieren implementiert, und es scheint auch gut zu funktionieren. Obs eine bessere bzw. elegantere Lรถsung gibt weiรŸ ich nicht.

Hier der Code, falls es jemanden interessiert (ist aber noch nicht zu 100% getestet, war eher auf die Schnelle):

String getRoles(StoreElement node, String defaultVal) {
    StringBuffer result = new StringBuffer();
   
    metaData = node.getMeta();
    perms = metaData.get("roles").getEditor().get(null);
    roles = perms.getAllowedExplicit("access");

    if (roles != null && roles.size() > 0) {
        //Do nothing, roles contains now the Set with the allowed roles
    } else {
        parent = node.getParent();
        int limit = 10; //Just to prevent the while loop from running infinite (who knows what can happen ๐Ÿ™‚
        int cnt   = 0; //We have anyway an maxium sitestore tree depth of 7
        while (parent != null) {
            metaData = parent.getMeta();
            perms = metaData.get("roles").getEditor().get(null);
            roles = perms.getAllowedExplicit("access");
           
            if (roles != null && roles.size() > 0) {
                //roles contains now the Set with the allowed roles
                break;
            }
           
            cnt++;
            if (cnt > limit) {
                break;
            }
           
            parent = parent.getParent();
        }
    }
   
    if (roles != null && roles.size() > 0) {
        cnt = 0;
        for (iter = roles.iterator(); iter.hasNext();) {
            if (cnt > 0) {
                result.append(",");
            }
            String role = iter.next();
            result.append(role.substring("/epintegration".length()+1));
            cnt++;
        }
        return result.toString();
    } else {
        return defaultVal;
    }
}

0 Kudos

Bei der Prรผfung der Metadaten sollte allein schon aus Performancegrรผnden zunรคchst geprรผft werden, ob an dem jeweiligen Knoten Metadaten gesetzt sind. Hierzu gibt es in IDProvider die Methode #hasMeta(). Wenn man sich die Metadaten รผber #getMeta() holt von einem Knoten, an dem Sie nicht gesetzt waren, erhรคlt man ein ein leeres MetaData Objekt, welches dann auch Rรผckgriffwerte aus dem Template enthรคlt. Das wรคre in Ihrem Fall aber nicht gewรผnscht denke ich.

0 Kudos

Stimmt, danke fรผr den Tipp.

0 Kudos

Type a product name