@andreas.schempp: Andreas, ganz großes Kino! Dank Deines Vorschlags ließ sich die Funktion wie folgt zusammenfassen:
Die komplette Logik kann so auf DB-Ebene abgearbeitet werden. Und außerdem haben wir endlich einen Workaround für FIND_IN_SET(). Wirklich sensationell! :)PHP-Code:
protected function getRootIdFromUrl()
{
$host = $this->Environment->host;
$accept_language = $this->Environment->httpAcceptLanguage;
$time = time();
// Find the matching root pages
$objRootPage = $this->Database->prepare("SELECT id, dns, language, fallback FROM tl_page WHERE type='root' AND (dns=? OR dns=? OR dns='')" . ((count($accept_language) > 0) ? " AND (language IN('". implode("','", $accept_language) ."') OR fallback=1)" : "") . (!BE_USER_LOGGED_IN ? " AND (start='' OR start<$time) AND (stop='' OR stop>$time) AND published=1" : "") . " ORDER BY dns DESC" . ((count($accept_language) > 0) ? ", language='". implode("' DESC, language='", $accept_language) ."' DESC" : ""))
->limit(1)
->execute($host, 'www.'.$host);
return $objRootPage->numRows ? $objRootPage->id : 0;
}