You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
7.1 KiB
228 lines
7.1 KiB
<?php |
|
|
|
/** |
|
* Contao Open Source CMS |
|
* Copyright (C) 2005-2011 Leo Feyer |
|
* |
|
* Formerly known as TYPOlight Open Source CMS. |
|
* |
|
* This program is free software: you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation, either |
|
* version 3 of the License, or (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
* Lesser General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public |
|
* License along with this program. If not, please visit the Free |
|
* Software Foundation website at <http://www.gnu.org/licenses/>. |
|
* |
|
* PHP version 5 |
|
* @copyright cgo IT, 2012-2013 |
|
* @author Carsten Götzinger (info@cgo-it.de) |
|
* @package aeo |
|
* @license GNU/LGPL |
|
* @filesource |
|
*/ |
|
|
|
namespace cgoIT\aeo; |
|
|
|
/** |
|
* Class AeoRedirectUtil |
|
*/ |
|
class AeoRedirectUtil extends \Frontend { |
|
|
|
/** |
|
* Initialize the object |
|
* @param array |
|
*/ |
|
public function __construct($arrAttributes=false) { |
|
parent::__construct($arrAttributes); |
|
$this->import('aeo\\AeoUtil', 'AeoUtil'); |
|
} |
|
|
|
/** |
|
* Sofern Aliase deaktiviert sind oder die RootPage aufgerufen wird, |
|
* ermittelt diese Methode die passende ID der Seite. |
|
*/ |
|
function redirectFromRootPage() { |
|
$this->import('\\Environment', 'Environment'); |
|
$strRequest = preg_replace(array('/^index.php\/?/', '/\?.*$/'), '', $this->Environment->request); |
|
$params = ''; |
|
if (strstr($strRequest, '?')) { |
|
$arrRequest = explode('?', $strRequest); |
|
$strRequest = $arrRequest[0]; |
|
$params = $arrRequest[1]; |
|
} |
|
$strRequest = $this->removeUrlSuffix($strRequest); |
|
|
|
$arrFragments = explode('/', $strRequest); |
|
$arrFragments = $this->getRedirectPageAeo($arrFragments, true); |
|
if (is_numeric($arrFragments[0])) { |
|
// Add the fragments to the $_GET array |
|
for ($i=1; $i<count($arrFragments); $i+=2) { |
|
$this->Input->setGet($arrFragments[$i], $arrFragments[$i+1]); |
|
} |
|
return $arrFragments[0]; |
|
} |
|
return FALSE; |
|
} |
|
|
|
/** |
|
* Leitet den User ohne JavaScript auf die passende Formular-Seite weiter. |
|
* @param $arrFragments |
|
* @param $blnReturnId |
|
*/ |
|
public function getRedirectPageAeo($arrFragments, $blnReturnId=false) { |
|
if ($GLOBALS['TL_CONFIG']['aeo_replace_standard_obfuscation'] === true) { |
|
if (in_array('folderurl', $this->Config->getActiveModules())) { |
|
$arrFragments = preg_split('~/~i', $arrFragments[0]); |
|
} |
|
$i18nl10nLanguage = ''; |
|
if (in_array('i18nl10n', $this->Config->getActiveModules())) { |
|
if ($GLOBALS['TL_CONFIG']['i18nl10n_urlParam'] == 'url') { |
|
$i18nl10nLanguage = $arrFragments[count($arrFragments) - 1]; |
|
} |
|
} |
|
|
|
$indexAeo = 2; |
|
if ($GLOBALS['TL_CONFIG']['useAutoItem']) { |
|
// auto-item-paramenter beruecksichtigen |
|
$indexAeo = 3; |
|
} |
|
|
|
if (is_array($arrFragments) && count($arrFragments) > 3 |
|
&& $arrFragments[0] == $GLOBALS['TL_CONFIG']['aeo_virtual_path'] |
|
&& $arrFragments[$indexAeo] == 'aeo') { |
|
$arrJumpTo = deserialize($GLOBALS['TL_CONFIG']['aeo_jump_to_no_js']); |
|
|
|
if ($GLOBALS['TL_CONFIG']['useAutoItem'] && $arrFragments[1] == 'auto_item') { |
|
// auto-item-paramenter entfernen |
|
unset($arrFragments[1]); |
|
$arrFragments = array_values($arrFragments); |
|
} |
|
|
|
// Sprache ermitteln |
|
$strLanguage = $arrFragments[1]; |
|
|
|
$arrFallbackValue = array(); |
|
foreach ($arrJumpTo as $key => $value) { |
|
if ($value['aeo_language'] == $strLanguage) { |
|
$url = $this->getUrl($value, $blnReturnId); |
|
break; |
|
} |
|
if ($value['aeo_language_fallback']) { |
|
$arrFallbackValue = $value; |
|
} |
|
} |
|
|
|
if (!isset($url) || strlen($url) == 0) { |
|
$url = $this->getUrl($arrFallbackValue, $blnReturnId); |
|
} |
|
|
|
$i = 0; |
|
$arrFragments[$i++] = $url; |
|
|
|
$strObfuscatedValues = $arrFragments[3]; |
|
if (in_array('i18nl10n', $this->Config->getActiveModules()) && |
|
$GLOBALS['TL_CONFIG']['i18nl10n_urlParam'] == 'alias') { |
|
$this->AeoUtil->fixupCurrentLanguage(); |
|
$strObfuscatedValues = str_replace('.'.$GLOBALS['TL_LANGUAGE'], '', $strObfuscatedValues); |
|
} |
|
$arrObfuscatedValues = explode(' ', $strObfuscatedValues, 5); |
|
|
|
$arrFragments[$i++] = 'n'; |
|
$arrFragments[$i++] = $arrObfuscatedValues[0]; |
|
$arrFragments[$i++] = 'd'; |
|
$arrFragments[$i++] = $arrObfuscatedValues[1]; |
|
$arrFragments[$i++] = 't'; |
|
$arrFragments[$i++] = $arrObfuscatedValues[2]; |
|
$arrFragments[$i++] = 'p'; |
|
$arrFragments[$i++] = $arrObfuscatedValues[3]; |
|
$arrFragments[$i++] = 'param'; |
|
$arrFragments[$i++] = $arrObfuscatedValues[4]; |
|
if (strlen($params) > 0) { |
|
$arrParams = explode('=', $params); |
|
$addNext = true; |
|
foreach ($arrParams as $param) { |
|
if (!$addNext) { |
|
continue; |
|
} |
|
if ($param == 'id') { |
|
$addNext = false; |
|
continue; |
|
} |
|
$arrFragments[$i++] = $param; |
|
} |
|
} |
|
|
|
if (in_array('i18nl10n', $this->Config->getActiveModules()) && |
|
$GLOBALS['TL_CONFIG']['i18nl10n_urlParam'] == 'url' && |
|
strlen($i18nl10nLanguage)) { |
|
$arrFragments[$i++] = 'language'; |
|
$arrFragments[$i++] = $i18nl10nLanguage; |
|
} |
|
} |
|
} |
|
|
|
return $arrFragments; |
|
} |
|
|
|
private function getUrl($arrValue, $blnReturnId) { |
|
if ($blnReturnId) { |
|
$url = $arrValue['aeo_redirecturl']; |
|
} else { |
|
$objPage = \PageModel::findPublishedByIdOrAlias($arrValue['aeo_redirecturl']); |
|
$objPage = $this->getPageDetails($objPage); |
|
$url = $this->generateFrontendUrl($objPage->row()); |
|
$url = $this->removeUrlPrefix($url); |
|
if ($GLOBALS['TL_CONFIG']['addLanguageToUrl'] || |
|
(in_array('i18nl10n', $this->Config->getActiveModules()) && |
|
$GLOBALS['TL_CONFIG']['i18nl10n_urlParam'] == 'url')) { |
|
$arrUrlFragments = explode('/', $url); |
|
$url = $arrUrlFragments[1]; |
|
} |
|
$params = ''; |
|
if (strstr($url, '?')) { |
|
$arrUrl = explode('?', $url); |
|
$url = $arrUrl[0]; |
|
$params = $arrUrl[1]; |
|
} |
|
$url = $this->removeUrlSuffix($url); |
|
} |
|
return $url; |
|
} |
|
|
|
private function removeUrlPrefix($strUrl) { |
|
if (!$GLOBALS['TL_CONFIG']['rewriteURL']) { |
|
$strUrl = str_replace('index.php/', '', $strUrl); |
|
} |
|
return $strUrl; |
|
} |
|
|
|
private function removeUrlSuffix($strUrl) { |
|
// Remove the URL suffix if not just a language root (e.g. en/) is requested |
|
if ($strUrl != '' && (!$GLOBALS['TL_CONFIG']['addLanguageToUrl'] || !preg_match('@^[a-z]{2}/$@', $strUrl))) { |
|
$intSuffixLength = strlen($GLOBALS['TL_CONFIG']['urlSuffix']); |
|
|
|
// Return false if the URL suffix does not match (see #2864) |
|
if ($intSuffixLength > 0) { |
|
if (substr($strUrl, -$intSuffixLength) != $GLOBALS['TL_CONFIG']['urlSuffix']) { |
|
return -1; |
|
} |
|
|
|
$strUrl = substr($strUrl, 0, -$intSuffixLength); |
|
} |
|
} |
|
if (in_array('i18nl10n', $this->Config->getActiveModules()) && |
|
$GLOBALS['TL_CONFIG']['i18nl10n_urlParam'] == 'alias') { |
|
$this->AeoUtil->fixupCurrentLanguage(); |
|
$strUrl = str_replace('.'.$GLOBALS['TL_LANGUAGE'], '', $strUrl); |
|
} |
|
return $strUrl; |
|
} |
|
} |
|
?>
|