I'm trying to automatically redirect people to a store view based on their browser language.
Situation: 5 store views (en, de, it, fr, nl) Magento 1.9.1
I used this piece of code in index.php:
require_once 'app/Mage.php'; /* Determine correct language store based on browser */ function getStoreForLanguage() { if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { foreach (explode(",", strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $accept) { if (preg_match("!([a-z-]+)(;q=([0-9.]+))?!", trim($accept), $found)) { $langs[] = $found[1]; $quality[] = (isset($found[3]) ? (float) $found[3] : 1.0); } } // Order the codes by quality array_multisort($quality, SORT_NUMERIC, SORT_DESC, $langs); // get list of stores and use the store code for the key $stores = Mage::app()->getStores(false, true); // iterate through languages found in the accept-language header foreach ($langs as $lang) { $lang = substr($lang,0,2); if (isset($stores[$lang]) && $stores[$lang]->getIsActive()) return $stores[$lang]; } } return Mage::app()->getStore(); } /* Auto redirect to language store view if request is for root */ if ($_SERVER['REQUEST_URI'] === '/') { header('Location: '.getStoreForLanguage()->getBaseUrl()); exit; } #Varien_Profiler::enable(); #Mage::setIsDeveloperMode(true); #ini_set('display_errors', 1);umask(0); Mage::run();
It seems like the browser wants to redirect because if i type in: domain.com it goes for a second to domain.com/nl but after a second an error appears:
"There has been an error processing your request. Exception printing is disabled by default for security reasons."
If i look at the error in the log file i see this:
a:4:{i:0;s:53:"Mage registry key "application_params" already exists";i:1;s:349:"#0 /var/www/webroot/ROOT/app/Mage.php(223): Mage::throwException('Mage registry k...') #1 /var/www/webroot/ROOT/app/code/core/Mage/Core/Model/App.php(338): Mage::register('application_par...', Array) #2 /var/www/webroot/ROOT/app/Mage.php(684): Mage_Core_Model_App->run(Array) #3 /var/www/webroot/ROOT/index.php(129): Mage::run('', 'store') #4 {main}";s:3:"url";s:4:"/nl/";s:11:"script_name";s:10:"/index.php";}
Is that the entire index.php?
No the entire index.php without the previous code for redirecting looks like this:
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
if (version_compare(phpversion(), '5.3.0', '<')===true) {
echo '<div style="font:12px/1.35em arial, helvetica, sans-serif;">
<div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
<h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">
Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.3.0 or newer.
<a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a>
Magento using PHP-CGI as a work-around.</p></div>';
exit;
}
/**
* Error reporting
*/
error_reporting(E_ALL | E_STRICT);
/**
* Compilation includes configuration file
*/
define('MAGENTO_ROOT', getcwd());
$compilerConfig = MAGENTO_ROOT . '/includes/config.php';
if (file_exists($compilerConfig)) {
include $compilerConfig;
}
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
$maintenanceFile = 'maintenance.flag';
if (!file_exists($mageFilename)) {
if (is_dir('downloader')) {
header("Location: downloader");
} else {
echo $mageFilename." was not found";
}
exit;
}
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
require_once $mageFilename;
#Varien_Profiler::enable();
if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Mage::setIsDeveloperMode(true);
}
#ini_set('display_errors', 1);
umask(0);
/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';
Mage::run($mageRunCode, $mageRunType);Thanks for your quick response!
No worries ![]()
Can you post your entire index.php WITH your modifications in. It looks like it is running the mage app twice.
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
if (version_compare(phpversion(), '5.3.0', '<')===true) {
echo '<div style="font:12px/1.35em arial, helvetica, sans-serif;">
<div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;">
<h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">
Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.3.0 or newer.
<a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a>
Magento using PHP-CGI as a work-around.</p></div>';
exit;
}
require_once 'app/Mage.php';
/* Determine correct language store based on browser */
function getStoreForLanguage()
{
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
foreach (explode(",", strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $accept) {
if (preg_match("!([a-z-]+)(;q=([0-9.]+))?!", trim($accept), $found)) { $langs[] = $found[1]; $quality[] = (isset($found[3]) ? (float) $found[3] : 1.0);
}
}
// Order the codes by quality array_multisort($quality, SORT_NUMERIC, SORT_DESC, $langs);
// get list of stores and use the store code for the key $stores = Mage::app()->getStores(false, true);
// iterate through languages found in the accept-language header
foreach ($langs as $lang) { $lang = substr($lang,0,2);
if (isset($stores[$lang]) && $stores[$lang]->getIsActive()) return $stores[$lang];
}
}
return Mage::app()->getStore();
}
/* Auto redirect to language store view if request is for root */
if ($_SERVER['REQUEST_URI'] === '/') { header('Location: '.getStoreForLanguage()->getBaseUrl());
exit;
}
#Varien_Profiler::enable();
#Mage::setIsDeveloperMode(true);
#ini_set('display_errors', 1);umask(0);
Mage::run();
/**
* Error reporting
*/
error_reporting(E_ALL | E_STRICT);
/**
* Compilation includes configuration file
*/
define('MAGENTO_ROOT', getcwd());
$compilerConfig = MAGENTO_ROOT . '/includes/config.php';
if (file_exists($compilerConfig)) {
include $compilerConfig;
}
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
$maintenanceFile = 'maintenance.flag';
if (!file_exists($mageFilename)) {
if (is_dir('downloader')) {
header("Location: downloader");
} else {
echo $mageFilename." was not found";
}
exit;
}
if (file_exists($maintenanceFile)) {
include_once dirname(__FILE__) . '/errors/503.php';
exit;
}
require_once $mageFilename;
#Varien_Profiler::enable();
if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Mage::setIsDeveloperMode(true);
}
#ini_set('display_errors', 1);
umask(0);
/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';
/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';
Mage::run($mageRunCode, $mageRunType);
Get rid of the following from half way down your file
Mage::run();
I would also actually remove
require_once 'app/Mage.php';
from the top of the file and then move your if check to underneath
require_once $mageFilename;
Well i'm not getting any errors anymore
So that's a start haha
But problem is now that i'm not getting sent to the right store view based on browser language. Just goes to the default store view ![]()
To be perfectly honest this is not how i would have done this. Instead i would have set up a module with an observer that checked the url. The main issue i can see though here is that in your function you have nothing that populares the $stores var, if it even gets that far.
Debugging by yourself required ![]()