Typo3 Frontend Login TypoScript

Von in netzthetik

Letz­tens bin ich über ein Menü-​Problem in Typo3 gestol­pert: Die Web­sei­te hät­te in der Meta-​Navigation zwi­schen “Kon­takt” und “Suche” einen “Login”-Menüpunkt haben sol­len. Dar­über soll­ten sich Frontend-​Benutzer anmel­den kön­nen, um dann nur ihnen zugäng­li­che Sei­ten­in­hal­te ange­zeigt zu bekom­men. Es exis­tiert hier schon ein sehr ein­fa­cher und sau­be­rer Ansatz­punkt mit zwei Sei­ten für das Backend: Die ers­te Sei­te mit dem Titel “Log­in” und dem Login-​Formular ist nur sicht­bar, wenn der Benut­zer noch nicht ange­mel­det ist, die zwei­te Sei­te mit dem Titel “Logout” ist nur sicht­bar, wenn der Benut­zer bereits ange­mel­det ist. Das funk­tio­niert ein­wand­frei. Mit einem häss­li­chen Neben­ef­fekt: Nach dem Log­in wird der Benut­zer auf die ers­te Sei­te im Sei­ten­baum wei­ter­ge­lei­tet, wodurch es kei­ne Mög­lich­keit einer Erfolgs­sei­te für den Log­in gibt. Ich möch­te in die­sem Arti­kel erklä­ren, wie man die­ses Pro­blem mit Typo­Script in den Griff bekommt.

Was hier offen­sicht­lich pas­siert ist, dass nach dem Absen­den des Login-​Formulars die Sei­te ja nicht mehr zur Ver­fü­gung steht, weil wir sie so defi­niert haben, dass sie für authen­ti­fi­zier­te User ver­steckt ist. Damit wirft Typo3 den Benut­zer auf die Home­page, ganz egal, wel­che Erfolgs­sei­te man im Backend ein­stellt. Nun gibt es zahl­rei­che Lösun­gen im Inter­net die beschrei­ben, wie man den Login-​Link als eige­nen Menü­punkt mit eige­nem “Mar­ker” erstellt. Das funk­tio­niert aber nicht, wenn sich der Login-​Link wie bei mir irgend­wo zwi­schen ande­ren Links in der Meta-​Navigation befin­det. Hier hilft nur der Ein­satz von Typo­Script. Ich möch­te dies an einem redu­zier­ten Bei­spiel einer Meta-​Navigation zei­gen:

lib.navigation.meta = COA
lib.navigation.meta {

    10 = HMENU
        10 {
        special = directory
        special.value = X

        1 = TMENU
        1 {
            NO = 1
            NO {
                wrapItemAndSub = <li>|</li>
            }
        }
    }
}

So weit soll­te der Code bekannt sein. Ich habe alle neben­säch­li­chen Para­me­ter wie noBlur, expAll, ACT, CUR etc. ent­fernt. Hier­zu gibt es im Inter­net genü­gend Bei­spie­le. Nur eine Bemer­kung zu Zei­le 7: Anstel­le des “X” gehört natür­lich die UID jenes Kno­tens, der die Sei­ten für die Meta-​Navigation beinhal­tet.

Besteht unse­re Meta-​Navigation nun z.B. aus den Sei­ten “Kon­takt”, “Log­in”, “Suche”, möch­ten wir den Link zur Login-​Seite situa­ti­ons­be­zo­gen mit der “Logout”-Seite tau­schen. Dazu müs­sen wir Typo3 zuerst den Link zur Login-​Seite ent­fer­nen. Für unser Bei­spiel gehen wir davon aus, dass die Login-​Seite die UID 100 und die Logout-​Seite die UID 101 hat (Letz­te­res ist hier irrele­vant, weil es im Typo-​Backend gesetzt wer­den kann).

doNotLinkIt.stdWrap.override = 1
doNotLinkIt.stdWrap.if {
    equals.field = uid
    value = 100
}

Dann müs­sen wir den Standard-​Text für den Frontend-​Login ent­fer­nen.

doNotShowLink.stdWrap.override = 1
doNotShowLink.stdWrap.if {
    equals.field = uid
    value = 100
}   

Und nach­dem wir den Link nun erfolg­reich ent­fernt haben, müs­sen wir ihn neu bau­en.
Aber zu unse­ren Kon­di­tio­nen:

before.stdWrap.cObject = TEXT
before.stdWrap.cObject {
    wrap = {$DEFAULT.navigation.loginLogoutLink}
    value = {$DEFAULT.navigation.loginLogoutText}
}
before.stdWrap.if {
    equals.field = uid
    value = 100
}
after = </a>
after.stdWrap.if {
    equals.field = uid
    value = 100
}

Das gesam­te Typo­script soll­te nun wie folgt aus­se­hen:

lib.navigation.meta = COA
lib.navigation.meta {

    10 = HMENU
        10 {
        special = directory
        special.value = X

        1 = TMENU
        1 {
            NO = 1
            NO {
                wrapItemAndSub = <li>|</li>
                doNotLinkIt.stdWrap.override = 1
                doNotLinkIt.stdWrap.if {
                    equals.field = uid
                    value = 100
                }
                doNotShowLink.stdWrap.override = 1
                doNotShowLink.stdWrap.if {
                    equals.field = uid
                    value = 100
                }   
                before.stdWrap.cObject = TEXT
                before.stdWrap.cObject {
                    wrap = {$DEFAULT.navigation.loginLogoutLink}
                    value = {$DEFAULT.navigation.loginLogoutText}
                }
                before.stdWrap.if {
                    equals.field = uid
                    value = 100
                }
                after = </a>
                after.stdWrap.if {
                    equals.field = uid
                    value = 100
                }

            }
        }
    }
}

Jetzt fällt noch auf, dass im Code zwei Varia­blen ver­wen­det wer­den:

wrap = {$DEFAULT.navigation.loginLogoutLink}
value = {$DEFAULT.navigation.loginLogoutText}

Das hat einen guten Grund, denn der Link zum Ein- und Aus­log­gen muss dyna­misch erstellt wer­den, eben­so natür­lich der Linktext: Ist der Benut­zer noch nicht ein­ge­loggt, soll der Link zum Log­in füh­ren, der Text soll “Log­in” lau­ten. Ist er ein­ge­loggt, soll der Link den Benut­zer aus­log­gen: “Logout”. Dies bewerk­stel­li­gen wir über Kon­stan­ten:

DEFAULT.navigation.loginLogoutLink = <a href="/index.php?id=100" class="nav-link">|
DEFAULT.navigation.loginLogoutText = Login
[loginUser = *]
    DEFAULT.navigation.loginLogoutLink = <a href="/index.php?id=100&amp;amp;amp;amp;amp;logintype=logout" class="nav-link">|
    DEFAULT.navigation.loginLogoutText = Logout
[global]

Die ers­ten zwei Zei­len zei­gen den Sta­tus für den noch nicht ein­ge­logg­ten Benut­zer. In der drit­ten Zei­le fra­gen wir Typo, ob der Benut­zer ein­ge­loggt ist. Wenn dem so ist, wer­den die Kon­stan­ten mit dem Logout-​Link und -Text über­schrie­ben.

Auch wenn die­se Her­an­ge­hens­wei­se sehr auf­wän­dig ist, hat sie den gro­ßen Vor­teil, dass die Navi­ga­ti­on dyna­misch bleibt. Der Redak­teur kann die Rei­hen­fol­ge der Links immer noch ändern und den Log­in an eine ande­re Stel­le ver­schie­ben, ohne dass die Funk­tio­na­li­tät ver­lo­ren geht.

Share on LinkedInShare on Redditshare on TumblrShare on StumbleUponDigg thisShare on FacebookGoogle+Tweet about this on TwitterEmail to someone