2012-07-20 11 views
5

attualmente Ho un'applicazione Zend sulla posizione predefinita www.example.com/{controller}/{action}Zend Multinazionali redirect

ma quando una visita utente da un determinato paese, come rilevare il loro indirizzo IP e li reindirizza a questa countryCode URL basato www.example.com/uk/{controller}/{action}?

Per rilevare il paese da cui l'utente sta visitando ho scritto un aiutante:

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"; 
    } 
} 

Il codice di cui sopra restituirà il nome del paese. Se un utente sta visitando dalla Francia, come posso riscrivere l'url in modo che l'url diventi example.com/france/{controller}/{action}?

+1

Perché si presume che il paese indichi una preferenza di lingua? L'intestazione HTTP 'Accept-Language' dovrebbe essere usata per quello. Il codice del paese è utile per le cose specifiche del paese, come le tabelle di valuta e codice postale. – tripleee

+0

Inoltre, è probabilmente una buona idea non avere directory separate per ogni lingua. Dovresti utilizzare i ccTLD o restituire il contenuto nella lingua corretta specificata da "Accept-Language" pur mantenendo lo stesso schema di URL. –

risposta

2

Riformatta l'helper della vista in un plug-in controller e reindirizzare.

Un plug-in del controller può essere eseguito nelle prime fasi del ciclo di invio delle richieste, pertanto è possibile intercettare una richiesta e reindirizzare a un'altra risposta prima che il controller venga caricato e sottoposto a rendering. Esempio di sotto (attenzione, può contenere bug!)

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

In questo esempio suppongo che $ Paese sia uguale al codice del paese. Altrimenti dovrai fornire una mappa dei codici Paese-Paese per costruire correttamente l'URL di reindirizzamento. –

+0

ciao sì mapperò un codice paese nel paese che ricevo da ipinfodb, ad esempio se ricevo Singapore, voglio mapparlo a sg, quindi l'URL sarà example.com/sg/controller/action. Grazie – d3bug3r

+0

hi la soluzione restituisce Questa pagina ha il ciclo di reindirizzamento ... – d3bug3r

1

Sono d'accordo con commenti di @ tripleee sull'utilizzo l'header HTTP piuttosto che occhiata il loro IP che spesso può portare a valori non corretti, o utenti forza dietro proxy remoto nelle impostazioni loro non vogliono

Prova questo plugin controller per il reindirizzamento in base Locale dell'utente come data dal loro browser:

<?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); 
    } 
} 

Questo plugin reindirizzerà a un modulo con il nome della lingua in base alla lingua impostata dal browser dell'utente se stanno attualmente richiedendo il modulo predefinito.

Nota questo codice non fa nulla per verificare se il modulo che si sta reindirizzando esiste o meno. È necessario verificare che la lingua sia supportata prima di reindirizzare.

È inoltre possibile aggiungere un controllo per un cookie o un valore di sessione che contiene la lingua desiderata dell'utente e il reindirizzamento basato su tale.

registrare il plugin aggiungendo questo a application.ini:

resources.frontController.plugins.language = "Application_Plugin_Language" 

Se si desidera reindirizzare in base al Paese e non la lingua, quindi modificare $language = $locale->getLanguage();-$region = $locale->getRegion();

Speranza che aiuta.