felogin, realurl und mehrsprachige Website

16. November 13

Die Situation: Eine mehrsprachige Website hat einen internen Bereich, dessen Seiten man nur nach dem Einloggen sehen darf. Man möchte nun z.B. Links auf Seiten in diesem Bereich per Mail verschicken. Dabei soll die Sprache berücksichtigt werden, d.h. wenn man einen Link auf die englische Übersetzung einer geschützten Seite verschickt, soll der Benutzer die englische Login-Seite angezeigt bekommen und nach dem Login korrekt weitergeleitet werden.

Im Template wird die Extension felogin etwa folgendermaßen konfiguriert, dabei ist pidStorageBenutzer die ID des Sysfolders mit den Benutzern, welche den internen Bereich sehen dürfen, pidInternerBereich die ID der Seite, unter welcher die geschützten Seiten liegen und pidStart die Seite "Home":

plugin.tx_felogin_pi1 {  
  storagePid = {$pidStorageBenutzer}  
  templateFile = fileadmin/templates/felogin.html  
  wrapContentInBaseClass = 0  
  redirectMode = login, logout, getpost
  redirectPageLogin = {$pidInternerBereich}
  redirectPageLogout = {$pidStart} 
}

config.typolinkLinkAccessRestrictedPages = NONE
showAccessRestrictedPages = NONE

Für die Seite, unter welcher der geschützte Teil des Seitenbaums liegt, wird unter "Usergroup Access Rights" die Option "Show at any login" eingetragen. Diese Option wird über "Extend to Subpages" auf die Unterseiten übertragen.

Gibt es in der Navigation einen Link auf die Login-Seite und soll dieser nach erfolgtem Login verschwinden, so geht dies unserer Erfahrung nach am besten, indem man die Seite nach dem Einloggen aus der Navi ausschließt, etwa:

[usergroup = *]
lib.mainnav.excludeUidList = {$pidLogin}
[END]

Bei Verwendung von realurl gibt ein Link auf eine geschützte Seite einen Error 404, wenn man nicht eingeloggt ist; deshalb verwenden wir ein eigenes PageNotFound-Handling, d.h. in der localconf.php bzw. im Install Tool wird deklariert:

$TYPO3_CONF_VARS['FE']['pageNotFound_handling'] = 'USER_FUNCTION:fileadmin/php/pageNotFound.php:user_pageNotFound->pageNotFound';

In der Datei fileadmin/pageNotFound.php unterscheidet die Funktion pageNotFound() zwei Fälle: Wenn auf eine Seite verlinkt wird, welche im internen Bereich liegt, wird dem Benutzer die Login-Seite angezeigt; nach erfolgreichem Login erfolgt dann der Redirect auf die geschützte Seite. Wenn auf eine Seite verlinkt wird, die tatsächlich nicht existiert, wird eine Error-404-Seite angezeigt. In beiden Fällen wird die gewünschte Sprache berücksichtigt.

class user_pageNotFound {
  /*
   * $params = Array mit den Werten currentUrl, reasonText und pageAccessFailureReasons
   * $ref = Referenz auf das Seiten-Objekct von TYPO3 (TSFE)
   */

  function pageNotFound($params, $ref) {
    
    if(current($params["pageAccessFailureReasons"]["fe_group"]) !== 0) {

      // Benutzer hat eine Seite aus dem geschützten Bereich aufgerufen, 
      // ist aber nicht eingeloggt -> Login + Redirect

      $login[0] = '/login.html';
      $login[1] = '/en/login.html';
      $login[2] = '/nl/login.html';
      $L = (array_key_exists('L', $_GET) ? $_GET['L'] : 0);
      header('Location: ' . $login[$L] . '?redirect_url=' . urlensettings.code($params["currentUrl"]));

    } else {

      // Benutzer hat eine nicht existierende Seite aufgerufen -> Error 404

      header("HTTP/1.0 404 Not Found");
      if (substr($_SERVER['REQUEST_URI'], 0, 4) == '/en/') 
        echo implode ('', file ('DOMAIN/en/page-not-found.html'));
      elseif (substr($_SERVER['REQUEST_URI'], 0, 4) == '/nl/') 
        echo implode ('', file ('DOMAIN/nl/pagina-niet-gevonden.html'));
      else
        echo implode ('', file ('DOMAIN/seite-nicht-gefunden.html'));
    }
  }
}