Search the FirstSpirit Knowledge Base
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>
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
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?
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
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
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
Hallo Michael,
danke für deine hilfereichen Anitworten
Das wäre zu komplex daher werde ich es so lassen.
Viele Grüße,
Aissam