- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Metadaten aus Navaigationspunkte auslesen
Hallo,
ich habe eine Navigation-Funktion im Header implementiert, das die Navigation baut.
Das funktioniert auch so gut. Ich mรถchte aber jetzt die Metadaten aus jedem Menupunkt auslesen.
Dabei sind nur die Ordner mit Metdadaten versehen. In den Metdadaten sind die Berechtigung jedes Ordners
enthalten. Sie lese ich die CMS_Persmission werte jedes Ordners wรคhrend ich die Navagation aufbaue.
Hier was ich schon versucht habe:
<CMS_ARRAY_PARAM name="unselectedHTML">
<CMS_ARRAY_ELEMENT index="1..4">
<![CDATA[
$CMS_SET(set_currentNodePerm, #nav.ref.meta(lang, "md_groups"))$
<?php
$zugriffsrechte = "$CMS_VALUE(set_currentNodePerm.getAllowed("access").toString(";"))$";
// Array aus FS Rechten pro Menรผpunkt
$zugriffsrechteArray = explode(";", $zugriffsrechte);
// Array der Rechtegruppen des Users
$http_iv_groups = array_flip(explode(",",str_replace('"','',$_SERVER['HTTP_IV_GROUPS'])));
// Prรผfen ob der User ein Recht des von FS benรถtigeten Rechte hat
foreach($zugriffsrechteArray as $k => $v){
if(isset($http_iv_groups[$v])){
$CMS_SET(set_zugriff, true)$
break;
}
}
?>
$CMS_IF(set_zugriff)$
$CMS_IF(#nav.level == 4 && #nav.ref.parent.parent.label== "Themenzugang")$$CMS_ELSE$<a href="$CMS_REF(#nav.ref)$" title="$CMS_VALUE(#nav.label.convert2)$">$CMS_VALUE(#nav.label.convert2)$</A>$CMS_END_IF$
$CMS_END_IF$
]]>
</CMS_ARRAY_ELEMENT>
- Labels:
-
Developers
- Tags:
- navigation
- permission
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Aissam,
beim Abfragen benutzt Du zunรคchst mal #nav.ref.meta(lang,"md_groups"). Metadaten sind allerdings nicht sprachabhรคngig, hier mรผsste wohl eher .meta("md_groups","inherit") stehen (wenn Vererbung benutzt werden soll).
Auรerdem sieht es so aus, als ob Du versuchst, innerhalb einer PHP-Schleife (foreach) FirstSpirit Template-Logik abhรคngig vom Ergebnis des PHP-Codes "auszufรผhren". Das kann so nicht funktionieren, weil FS kein PHP auswertet - Stichwort: Vorgenerierendes System, FS generiert ja den PHP-Code erst. In Deinem Fall ist die Template-Variable "set_zugriff" immer true, weil das $CMS_SET(set_zugriff,true)$ in jedem Fall ausgefรผhrt wird, nรคmlich bevor das Ganze รผberhaupt durch PHP ausgewertet wird.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
danke fรผr deine Antwort, das habe ich spรคter dann auch rausgefunden
Ich habe das dann so angepasst:
beginHtml:
<CMS_ARRAY_PARAM name="beginHTML">
<CMS_ARRAY_ELEMENT index="1..4">
<![CDATA[
$CMS_SET(set_navpermissions, #nav.folder.meta("md_groups").getAllowed("access").toString(";"))$
<?php
if(PermissionController::check("$CMS_VALUE(set_navpermissions)$")){
echo '<li class="$CMS_IF(#nav.selected)$ active $CMS_IF(#nav.ref.uid==#global.node.uid)
$activeAndSelected$CMS_END_IF$$CMS_ELSE$close$CMS_END_IF$">';
?>
?>
]]>
</CMS_ARRAY_ELEMENT>
</CMS_ARRAY_PARAM>
// endHTML
<CMS_ARRAY_PARAM name="endHTML">
<CMS_ARRAY_ELEMENT index="1..4">
<![CDATA[
$CMS_SET(set_navpermissions, #nav.folder.meta("md_groups").getAllowed("access").toString(";"))$
<?php
echo '</li>';
}
?>
]]>
</CMS_ARRAY_ELEMENT>
</CMS_ARRAY_PARAM>
Kann man das so machen das die php If Schleife dann im endHTML geschloรen wird, oder muss man die If abfrage auch im EndHTML hinzufรผgen, damit entschieden wird, ob man ein schlieรendes Li benรถtigt wird?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Aissam,
das kann man so machen, es kommt ja letztlich darauf an ob die generierte Seite gรผltigen PHP-Code enthรคlt. FirstSpirit ist es erstmal "egal" ob und wie hier Template- und liveseitiger Code gemischt wird. Alles auรer den $CMS_X$-Tags ist was die Generierung angeht reiner Text.
Ein paar grundsรคtzliche (d.h. nicht zwingend bessere!) Alternativen:
Du kannst natรผrlich die Abfrage wiederholen. Vorteil wรคre hier eine "schรถnere" Kapselung ohne ein "Auseinanderreiรen" des รถffnenden und schlieรenden Teils der if-Abfrage. Das wรผrde - je nach Komplexitรคt der Auswertung von PermissionController::check - dann aber ggf. Performance auf der Liveseite kosten. D.h. ich wรผrde in diesem Fall nicht die Abfrage wiederholen, sondern das Ergebnis der ersten in einer Variablen speichern, in etwa so (mein PHP ist schon etwas angerostet :smileyblush:):
//BEGIN_HTML
<?php
$visible_$CMS_VALUE(#nav.ref.uid)$ = PermissionController::check("$CMS_VALUE(set_navpermissions)$");
if($visible_$CMS_VALUE(#nav.ref.uid)$) {
echo ...
}
//END_HTML
if($visible_$CMS_VALUE(#nav.ref.uid)$) {
echo '</li>';
}
Nachteil dieser Trennung (egal ob รผber eine Wiederholung oder die Variablen-Variante) wรคre aber dann trotzdem, dass dadurch die Abfragen der einzelnen Menรผebenen im PHP nicht mehr ineinander geschachtelt sind. Wenn ein Unterpunkt sowieso nicht angezeigt werden soll, wenn sein Elternknoten nicht sichtbar ist, wรผrde das dazu fรผhren, dass PermissionController::check unnรถtigerweise oft - nรคmlich auch fรผr die Unterpunkte von unsichtbaren Ebenen - aufgerufen wird. Das kostet dann theoretisch ebenfalls Performance auf der Liveseite.
Man kรถnnte noch etwas anders herangehen und nicht die Ausgabe selbst in der Navigationsfunktion machen, sondern sich dort eine PHP-Datenstruktur zusammenbauen, die man dann spรคter komplett getrennt auswertet. Ich denke da an irgendwas Map-artiges bzw. ein geschachteltes assoziatives Array mit den FirstSpirit-UIDs der Knoten dem zu generierenden HTML und dem $CMS_VALUE(set_navpermissions)$ - nicht mit dem Ergebnis des check-Aufrufes, dann hรคttest Du wieder die unnรถtigen Aufrufe. Das wรผrde ich aber in diesem Fall fรผr etwas oversized halten, ist aber letztlich Geschmachssache.
Viele Grรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Guten Morgen Michael,
danke fรผr deine Anwtort, werde das mit der Variablenabfrage fรผr das End HTML auch รผbernehmen.
Kann man nรคmlich etwas besser im Quellcode lesen.
Gibt es รผberhaupt eine Mรถglichkeit die unnรถtigen Abfragen (Wenn der Elternknoten nicht sichtbar ist)
abfangen? Wenn nicht bzw. zu komplext ist wรผrde ich die oben genannte Frage als beantwortet markieren
Viele Grรผรe,
Aissam
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Aissam,
das einzige was mir hier spontan einfรคllt wรคre tatsรคchlich das Bauen einer separaten "schlauen" PHP-Datenstruktur mit Hilfe der Navigationsfunktion - also ohne Ausgabe, sondern sozusagen reiner PHP-Code. Diese Struktur wรผrde dann mit reiner PHP-Logik ausgewertet, die anhand der Struktur auch erkennt, ob entsprechende Abfragen auf den Unterknoten gemacht werden mรผssen. Die kรถnnte dann die Abfragen enthalten die man spรคter an das "check" รผbergibt.
Hier kรถnnte man eine separate PHP-Klasse fรผr bauen um diese Logik zu kapseln.
Ob sich der Aufwand lohnt, hรคngt natรผrlich davon ab, ob die zusรคtzlichen check-Ausrufe รผberhaupt ins Gewicht fallen.
Und als Alternative bleibt natรผrlich immer noch die ursprรผngliche Variante mit den geschachtelten IFs, deren einziger Nachteil ist, dass Anfang und Ende des IF-Blocks in zwei getrennten Teilen der Navigationsfunktion definiert sind.
Viele Gรผรe
Michael
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Michael,
danke fรผr deine hilfereichen Anitworten
Das wรคre zu komplex daher werde ich es so lassen.
Viele Grรผรe,
Aissam

