2012-07-20 11 views
5

Actualmente tengo una aplicación Zend de la ubicación www.example.com/{controller}/{action}Zend multinacional redirección

pero por defecto cuando un usuario visita de un determinado país, la forma de detectar su dirección IP y los redirige a esta dirección URL basada countryCode www.example.com/uk/{controller}/{action}?

Para detectar el país desde el que el usuario está visitando He escrito un ayudante:

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

El código anterior devolverá el nombre del país. Si un usuario está visitando desde Francia, ¿cómo puedo reescribir la url para que la url se convierta en example.com/france/{controller}/{action}?

+1

¿Por qué supone que el país indica una preferencia de idioma? El encabezado HTTP 'Accept-Language' se debe usar para eso. El código de país es útil para cosas específicas de cada país, como las tablas de moneda y códigos postales. – tripleee

+0

Además, probablemente sea una mejor idea no tener directorios separados para cada idioma. Debería utilizar ccTLD o devolver el contenido en el idioma correcto especificado por 'Accept-Language', manteniendo el mismo esquema de URL. –

Respuesta

2

Refactorice su ayuda de vista en un complemento del controlador y redirija.

Un complemento de controlador puede ejecutarse temprano en el bucle de envío de solicitud, por lo tanto, puede interceptar una solicitud y redirigir a otra respuesta antes de que se cargue y represente cualquier controlador. Ejemplo a continuación (advertencia, puede contener errores!)

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

Supongo que en este ejemplo, $ country equivale al código de país. De lo contrario, deberá proporcionar un mapa de país a los códigos de país para construir correctamente la URL de redireccionamiento. –

+0

hola sí, voy a asignar un código de país al país que recibo de ipinfodb; por ejemplo, si recibo Singapur, lo asignaré a sg, por lo que la URL será example.com/sg/controller/action. Gracias – d3bug3r

+0

hola su solución return Esta página tiene un bucle de redirección ... – d3bug3r

1

me acuerdo con el comentario de @ tripleee sobre el uso de la cabecera HTTP en lugar de las operaciones de búsqueda a su IP que a menudo puede dar lugar a valores incorrectos, o los usuarios de la fuerza detrás de servidores proxy remoto en la configuración ellos no quieren

Trate de este plugin controlador para redireccionar según la configuración regional del usuario según lo dado por su navegador:

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

Este plugin se redirigir a un módulo con el nombre del idioma basado en el idioma establecido por el navegador del usuario si Actualmente están solicitando el módulo predeterminado.

Tenga en cuenta que este código no hace nada para verificar si el módulo que está redirigiendo existe o no. Debe verificar que el idioma sea compatible antes de redireccionar.

También puede agregar un cheque para una cookie o valor de sesión que contenga el idioma deseado del usuario y redireccionar en función de eso.

Registre el complemento añadiendo esto a application.ini:

resources.frontController.plugins.language = "Application_Plugin_Language" 

Si desea redirigir en función del país y no el lenguaje, a continuación, cambiar a $language = $locale->getLanguage();$region = $locale->getRegion();

Espero que ayude.