J'utilise Symfony 1.2.7. Mon site Web est en plusieurs langues, chacune d'entre elles se trouve dans un sous-domaine comme en.example.com, es.example.com. Si l'utilisateur entre dans example.com, je veux le rediriger vers sa langue. Je veux aussi avoir du support staging.example.com et rediriger vers es.staging.example.com et en.staging.example.com afin que je puisse tout tester avant le déploiement.Détection du langage et redirection vers le sous-domaine sur Symfony
J'ai le code suivant qui fonctionne à la fois sur index.php et frontend_dev.php. Ma question est la suivante: pouvez-vous l'améliorer? Y a-t-il un moyen meilleur ou plus propre? Merci!
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);
$context = sfContext::createInstance($configuration);
// get the domain parts as an array
$host = array_reverse(explode('.', $_SERVER['HTTP_HOST']));
list($tld, $domain, $subdomain) = $host;
// determine which subdomain we're looking at
$app = ($subdomain == 'staging') ? $subdomain2=$host[3] : $subdomain;
if(empty($app) || $app == 'www')
{
$browser_languages = $context->getRequest()->getLanguages();
foreach($browser_languages as $language)
{
$allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable'));
if($allowed_culture)
{
$domain = $subdomain ? $subdomain.'.'.$domain : $domain;
$url = 'http://'.str_replace($domain.'.'.$tld, $language.'.'.$domain.'.'.$tld, $_SERVER['HTTP_HOST']).$_SERVER['REQUEST_URI'];
$context->getController()->redirect($url);
break;
}
}
}
$context->dispatch();
Mise à jour Solution: Filtre personnalisé
<?php
class subdomainFilter extends sfFilter
{
public function execute($filterChain)
{
$context = $this->getContext();
$user = $this->getContext()->getUser();
$request = $this->getContext()->getRequest();
// get the domain parts as an array
$host = array_reverse(explode('.', $request->getHost()));
list($tld, $domain) = $host;
$subdomain2 = $host[3];
$subdomain = $host[2];
// determine which subdomain we're looking at
$app = ($host[2] == 'staging') ? $subdomain2 : $subdomain;
if(empty($app) || $app == 'www')
{
// if first time
if ($this->isFirstCall())
{
$browser_languages = $request->getLanguages();
// set default lang, for API as CURL doesn't set the language
$lang = sfConfig::get('app_default_culture');
foreach($browser_languages as $language)
{
$allowed_culture = in_array($language, sfConfig::get('app_languagesAvailable'));
if($allowed_culture)
{
$lang = $language;
break;
}
}
}else {
// Get user culture
$lang = $user->getCulture();
}
$domain = $subdomain ? $subdomain.'.'.$domain : $domain;
$url = str_replace($domain.'.'.$tld, $lang.'.'.$domain.'.'.$tld, $request->getURI());
$context->getController()->redirect($url);
}
$filterChain->execute();
}
}
merci treur. J'ai déjà vérifié ces articles et ils ne résolvent pas mon problème. Toutes les actions sont les mêmes sur es.example.com et en.example.com. Et je veux rediriger le domaine principal en fonction de la langue. Je vais mettre à niveau dans quelques semaines, quand nous aurons le temps de vérifier que tout fonctionne bien. – fesja
Hmm. Je vois. Dans ce cas, je pense que l'utilisation d'un filtre est une solution plus élégante. En outre, les filtres peuvent être activés/désactivés avec des cookies, ce qui supprime la surcharge inutile lorsqu'un utilisateur est déjà sur le bon sous-domaine: http://www.symfony-project.org/book/1_2/06-Inside-the-Controller -Layer # chapter_06_sub_building_your_own_filter – Treur
c'est mieux. Cependant, que se passe-t-il si l'utilisateur actuel va à exemple.com. J'ai son cookie, et je sais qu'il veut le web en anglais; mais si je ne vérifie pas l'hôte, il utilisera www.example.com en anglais au lieu de en.example.com. Il semble que je doive toujours vérifier l'hôte pour le sous-domaine. S'il s'agit d'un utilisateur (getCulture()), sinon, vérifiez les langues du navigateur. – fesja