TYPO3 bietet mit seiner Rechteverwaltung für Frontendbenutzer schon einiges, wenn es darum geht, Inhalte nur bestimmten Benutzergruppen zur Verfügung zu stellen. In jedem Inhaltselement kann explizit ausgewählt werden, welche Gruppen in den Genuss der entsprechenden Information kommen darf – und alle anderen eben nicht. Doch leider gibt es manchmal den Anwendungsfall, dass bestimmte Inhalte angezeigt werden sollen, wenn ein Benutzer gerade eingeloggt, aber NICHT Mitglied einer bestimmten Gruppe ist – hier stößt man mit der Standard-Rechteverwaltung von TYPO3 schnell an die Grenzen des machbaren. Ein Beispiel:
Wir haben ein System mit drei FE-Benutzergruppen: A, B und C. Auf einer Seite im Login-Bereich wollen wir Inhalte nur der Gruppe A zur Verfügung stellen, alle anderen Benutzergruppen sollen den Vermerk sehen, dass sie leider keinen Zuggriff auf die entsprechenden Informationen haben, weil sie leider nicht Mitglied der ach so privilegierten Gruppe A sind – traurig, aber wahr.
Wir legen also zunächst mal das Inhaltselement für die Gruppe A an – soweit alles Standard und kein Problem – im Reiter “Zugriff” des Inhaltselementes setzen wir einfach die Berechtigung für die Gruppe A. Aber jetzt: Wir legen ein weiteres Inhaltselement an, welches den genannten Vermerk beinhaltet. Doch wie hier jetzt die Berechtigungen setzen? Gruppe A soll den Vermerk nicht sehen, lediglich alle anderen Gruppen – also in unserem Falle B und C. TYPO3 bietet leider keine Möglichkeit, eine Berechtigungsstufe “Wenn eingeloggt, aber NICHT in Gruppe A” anzugeben. Natürlich könnte man einfach alle anderen Gruppen auswählen – doch was, wenn eine neue Gruppe dazukommt? Jedes entsprechend konfigurierte Inhaltselement müsste angepasst werden und die neue Gruppe hinzugefügt werden. Hier hilft (wie so oft) nur TypoScript. Was wir brauchen, ist ein CONTENT-Objekt das mittels einer if-Bedingung nur angezeigt wird, wenn a) ein User eingeloggt ist, und b) NICHT Mitglied der Gruppe A ist. Wer sich schon einmal mit der if-Funktion in TypoScript beschäftigt hat, weiß, was das manchmal für ein Biest sein kann – zickig und störrisch und mit manchmal wenig nachvollziehbaren Resultaten. Und noch schwieriger wird´s, wenn es nicht nur um eine privilegierte Gruppe (A) geht, sondern um mehrere – also bitteschön das Inhaltselement NUR anzeigen, wenn ein User eingeloggt ist und NICHT Mitglied der Gruppe A ODER X ODER Y ist. Huiuiui.
Aber hier sei einmal ein Ansatz für eine solche if-Konfiguration dargestellt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | if { # Ist überhaupt jemand eingeloggt? isTrue.data = TSFE:fe_user|user|username # Dann ist ja gut - jetzt muss nur noch die Gruppenzugehörigkeit geprüft werden isFalse = 1 isFalse.if { isTrue.cObject = TEXT isTrue.cObject { # eine Liste mit Gruppen(-IDs), die das CE NICHT sehen sollen - aber eben alle anderen value = 1,4 # die Liste wird aufgesplittet, jede einzelne Gruppe geprüft. split { token = , cObjNum = 1 1 { current = 1 # Ist der User Mitglied der Gruppe? Dann gibt es eine Ausgabe und die Bedingung oben ist erfüllt... stdWrap.if { value.data = TSFE:fe_user|user|usergroup isInList.current = 1 } } } } } } |
Zur Erläuterung:
Die erste if-Bedingung fragt zunächst einmal ein generelles Login, indem der Benutzername auf isTrue abgefragt wird. Gibt es kein Login, schlägt diese Prüfung schon fehl (Benutzername im TSFE-Objekt ist leer) und das CE wird gar nicht erst angezeigt.
Des Weiteren wird eine “künstliche” isFalse-Bedingung erstellt. die zunächst einmal immer fehlschlägt (1 ist immer wahr!). Diese steht für die Zugehörigkeit der priveligierten Gruppen und wird in der if-Bedingung für isFalse letztendlich wirklich ausgewertet. Klingt kompliziert, ist auch so. Aber eigentlich auch nicht. isFalse schlägt also zunächst immer fehl. in der folgenden if-Prüfung wird dann geschaut, ob der User Mitglied in einer der spezifizierten Gruppen ist (Kommaliste, aufgesplittet). Ist dies der Fall, bleibt das Ergebnis der isFalse-Prüfung false – das cObject für die Gruppenprüfung liefert einen Inhalt, ist also nicht false – das Inhaltselement wird NICHT angezeigt. Ist der User aber in keiner der genannten Gruppen vertreten liefert das cObject auf keinen Inhalt zurück – isFalse liefert true und beide Bedingungen der äußeren if-Bedingung sind erfüllt – das Inhaltselement wird angezeigt.
Puh – da haben wir´s ja geschafft…
Und richtig schick wird´s, wenn man dieses Snippet noch mit einem TemplaVoilà-FCE oder einem Gridelement kombiniert – eingefügte Standard-Inhalte werden nur angezeigt, wenn der Benutzer NICHT Mitglied einer der im FCE oder Gridelement konfigurierten Gruppen ist – wie schön ist das denn bitte?
Pingback: Flexible Content Element with group exclude in TYPO3