Contao\PageModel::findFirstPublishedRootByHostAndLanguage PHP Method

findFirstPublishedRootByHostAndLanguage() public static method

Find the first published root page by its host name and language
public static findFirstPublishedRootByHostAndLanguage ( string $strHost, mixed $varLanguage, array $arrOptions = [] ) : PageModel | null
$strHost string The host name
$varLanguage mixed An ISO language code or an array of ISO language codes
$arrOptions array An optional options array
return PageModel | null The model or null if there is no matching root page
    public static function findFirstPublishedRootByHostAndLanguage($strHost, $varLanguage, array $arrOptions = array())
    {
        $t = static::$strTable;
        $objDatabase = \Database::getInstance();
        if (is_array($varLanguage)) {
            $arrColumns = array("{$t}.type='root' AND ({$t}.dns=? OR {$t}.dns='')");
            if (!empty($varLanguage)) {
                $arrColumns[] = "({$t}.language IN('" . implode("','", $varLanguage) . "') OR {$t}.fallback='1')";
            } else {
                $arrColumns[] = "{$t}.fallback='1'";
            }
            if (!isset($arrOptions['order'])) {
                $arrOptions['order'] = "{$t}.dns DESC" . (!empty($varLanguage) ? ", " . $objDatabase->findInSet("{$t}.language", array_reverse($varLanguage)) . " DESC" : "") . ", {$t}.sorting";
            }
            if (isset($arrOptions['ignoreFePreview']) || !BE_USER_LOGGED_IN) {
                $time = \Date::floorToMinute();
                $arrColumns[] = "({$t}.start='' OR {$t}.start<='{$time}') AND ({$t}.stop='' OR {$t}.stop>'" . ($time + 60) . "') AND {$t}.published='1'";
            }
            return static::findOneBy($arrColumns, $strHost, $arrOptions);
        } else {
            $arrColumns = array("{$t}.type='root' AND ({$t}.dns=? OR {$t}.dns='') AND ({$t}.language=? OR {$t}.fallback='1')");
            $arrValues = array($strHost, $varLanguage);
            if (!isset($arrOptions['order'])) {
                $arrOptions['order'] = "{$t}.dns DESC, {$t}.fallback";
            }
            if (isset($arrOptions['ignoreFePreview']) || !BE_USER_LOGGED_IN) {
                $time = \Date::floorToMinute();
                $arrColumns[] = "({$t}.start='' OR {$t}.start<='{$time}') AND ({$t}.stop='' OR {$t}.stop>'" . ($time + 60) . "') AND {$t}.published='1'";
            }
            return static::findOneBy($arrColumns, $arrValues, $arrOptions);
        }
    }

Usage Example

Beispiel #1
0
 /**
  * Try to find a root page based on language and URL
  *
  * @return PageModel
  */
 public static function getRootPageFromUrl()
 {
     // HOOK: add custom logic
     if (isset($GLOBALS['TL_HOOKS']['getRootPageFromUrl']) && is_array($GLOBALS['TL_HOOKS']['getRootPageFromUrl'])) {
         foreach ($GLOBALS['TL_HOOKS']['getRootPageFromUrl'] as $callback) {
             /** @var PageModel $objRootPage */
             if (is_object($objRootPage = static::importStatic($callback[0])->{$callback[1]}())) {
                 return $objRootPage;
             }
         }
     }
     $host = \Environment::get('host');
     // The language is set in the URL
     if (\Config::get('addLanguageToUrl') && !empty($_GET['language'])) {
         $objRootPage = \PageModel::findFirstPublishedRootByHostAndLanguage($host, \Input::get('language'));
         // No matching root page found
         if ($objRootPage === null) {
             \System::log('No root page found (host "' . $host . '", language "' . \Input::get('language') . '")', __METHOD__, TL_ERROR);
             throw new NoRootPageFoundException('No root page found');
         }
     } else {
         $accept_language = \Environment::get('httpAcceptLanguage');
         // Find the matching root pages (thanks to Andreas Schempp)
         $objRootPage = \PageModel::findFirstPublishedRootByHostAndLanguage($host, $accept_language);
         // No matching root page found
         if ($objRootPage === null) {
             \System::log('No root page found (host "' . \Environment::get('host') . '", languages "' . implode(', ', \Environment::get('httpAcceptLanguage')) . '")', __METHOD__, TL_ERROR);
             throw new NoRootPageFoundException('No root page found');
         }
         // Redirect to the language root (e.g. en/)
         if (\Config::get('addLanguageToUrl') && !\Config::get('doNotRedirectEmpty') && \Environment::get('relativeRequest') == '') {
             $arrParams = array('_locale' => $objRootPage->language);
             $strUrl = \System::getContainer()->get('router')->generate('contao_index', $arrParams);
             $strUrl = substr($strUrl, strlen(\Environment::get('path')) + 1);
             static::redirect($strUrl, 301);
         }
     }
     return $objRootPage;
 }