2012-07-20 9 views
5

aktualnie Mam aplikacji Zend na domyślnej lokalizacji www.example.com/{controller}/{action}Zend wielokrajowych przekierować

ale kiedy wizyta użytkownik z określonego kraju, jak wykrywać ich adresu IP i przekierować je do tego CountryCode url oparciu www.example.com/uk/{controller}/{action}?

Aby wykryć kraj, z którego użytkownik odwiedzana Pisałem pomocnika:

require_once '../library/Ipinfo/ip2locationlite.class.php'; 

class Application_View_Helper_GetLocation extends Zend_View_Helper_Abstract 
{ 
    public function getLocation() 
    { 

     $ipLite = new ip2location_lite; 
     $ipLite->setKey('APIKEY'); 

     //Get errors and locations 
     $locations = $ipLite->getCity($_SERVER['REMOTE_ADDR']); 
     $errors = $ipLite->getError(); 

     $country = strtolower($locations['countryName']); 

     return "$country"; 
    } 
} 

Powyższy kod zwróci nazwę kraju. Jeśli użytkownik odwiedza witrynę z Francji, w jaki sposób mogę przepisać adres URL, aby adres URL stał się example.com/france/{controller}/{action}?

+1

Dlaczego zakładasz, że kraj wskazuje preferowany język? Do tego celu należy użyć nagłówka HTTP "Accept-Language". Kod kraju jest przydatny w przypadku konkretnych krajów, takich jak tabele walut i kodów pocztowych. – tripleee

+0

Lepszym pomysłem jest również, aby nie mieć osobnych katalogów dla każdego języka. Powinieneś używać ccTLD lub zwracać zawartość w poprawnym języku określonym przez 'Accept-Language' przy zachowaniu tego samego schematu URL. –

Odpowiedz

2

Przekształć pomocnika widoku w wtyczkę kontrolera i przekieruj.

Wtyczka kontrolera może zostać wcześnie uruchomiona w pętli dyspozytorskiej żądań, dlatego można przechwycić żądanie i przekierować do innej odpowiedzi, zanim dowolny kontroler zostanie załadowany i wyrenderowany. Przykład poniżej (uwaga, mogą zawierać błędy!)

class App_Plugin_DetectCountry extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) { 
     $ipLite = new ip2location_lite; 
     $ipLite->setKey('APIKEY'); 

     //Get errors and locations 
     $locations = $ipLite->getCity($_SERVER['REMOTE_ADDR']); 
     $errors = $ipLite->getError(); 

     $country = strtolower($locations['countryName']); 

     //Check if set country equals detected country 
     if (!isset($_COOKIE['country']) || $country !== $_COOKIE['country']) { 
      $_COOKIE['country'] = $country; 
      $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
      $redirector->gotoUrl($country . '/' . $request->getControllerName() . '/' . $request->getActionName()); 
     } 
    } 
} 
+0

Zakładam w tym przykładzie, że $ country jest równy kodowi kraju. W przeciwnym razie musisz podać mapę kodów kraju z kraju, aby poprawnie skonstruować przekierowanie. –

+0

cześć tak, będę mapować kod kraju do kraju, który otrzymuję z ipinfodb, np. Jeśli otrzymam Singapur i będę mapował go do sg, więc URL będzie example.com/sg/controller/action. Dzięki – d3bug3r

+0

hi your solution return Ta strona ma przekierowanie pętli ... – d3bug3r

1

zgadzam się z użytkownika @ tripleee komentarzu na temat korzystania z nagłówka HTTP zamiast odnośnika swoje IP, które mogą często prowadzić do błędnych wartości lub użytkowników siłą zdalnych serwerów proxy język ustawień oni nie chcą.

Spróbuj kontrolera wtyczki do przekierowywania na podstawie Locale użytkownika podaną przez ich przeglądarki:

<?php 

class Application_Plugin_Language extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeShutdown(Zend_Controller_Request_Abstract $request) 
    { 
     /* 
     // if you add "localization.default_locale = "en_US" to your application.ini, uncomment the following 
     $config = new Zend_Config($this->getOption('localization'), true); 
     $loc = (isset($config->default_locale)) ? $config->default_locale : 'en_US'; 
     */ 

     $module = $request->getModuleName(); 
     if ($module != 'default') return ; 

     // You can also check a cookie or session value here to see if you can return from the plugin as well 

     $loc = 'en_US'; 

     Zend_Locale::setDefault($loc); 

     try { 
      $locale = new Zend_Locale(Zend_Locale::BROWSER); 
     } catch (Zend_Locale_Exception $e) { 
      $locale = new Zend_Locale($loc); 
     } 

     $language = $locale->getLanguage(); // e.g. "en", "de", "ru" etc. 

     $urlHelper = new Zend_Controller_Action_Helper_Url(); 
     $url = $urlHelper->url(array('module' => $language, 'controller' => 'form', 'action' => 'index')); 

     $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
     $redirector->gotoUrl($url); 
    } 
} 

Ta wtyczka będzie przekierować do modułu z nazwą języka opartego na języku ustalonym przez przeglądarkę użytkownika, jeżeli obecnie żądają modułu domyślnego.

Uwaga: ten kod nie sprawdza, czy moduł, do którego następuje przekierowanie, istnieje. Przed przekierowaniem sprawdź, czy język jest obsługiwany.

Można również dodać sprawdzenie pliku cookie lub wartości sesji, która zawiera pożądany język użytkownika i przekierowanie na podstawie tego.

Zarejestruj wtyczki dodając to do application.ini:

resources.frontController.plugins.language = "Application_Plugin_Language" 

Jeśli chcesz przekierować na podstawie kraju, a nie język, a następnie zmienić $language = $locale->getLanguage(); do $region = $locale->getRegion();

nadzieję, że pomoże.