Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/05/2012, 16:28
Avatar de destor77
destor77
 
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 1 mes
Puntos: 43
Respuesta: remover lenguaje en url

Hola,
mi archivo con las reglas de ruteo es este:
Código PHP:
Ver original
  1. $route['index/page/(:num)'] = "index/index/$1";
  2. $route['index/cambiarSession'] = "index/cambiarSession";
  3. $route['index'] = "index";
  4. $route['inicio/pagina/(:num)'] = "index/index/$1";
  5. $route['inicio/cambiarSession'] = "index/cambiarSession";
  6. $route['inicio'] = "index";
  7.  
  8. $route['fields/page/(:num)'] = "propiedades/index/$1";
  9. $route['fields/details/(:any)'] = "propiedades/detalles/$1";
  10. $route['fields'] = "propiedades";
  11. $route['campos/pagina/(:num)'] = "propiedades/index/$1";
  12. $route['campos/detalles/(:any)'] = "propiedades/detalles/$1";
  13. $route['campos'] = "propiedades";

dentro de mi frontcontroller.php tengo lo siguiente para validar que archivo de lenguaje tengo que levantar:
Código PHP:
Ver original
  1. //cargo el lenguaje del sistema
  2.         if($config->get('multi')==1) {
  3.             $leng = Language::singleton();
  4.             $leng->get_session_handler();
  5.             $idiomaActual = $config->get('lenguaje');
  6.             setcookie ("leng", $idiomaActual, time () + 7*24*60*60);
  7.             $_SESSION['leng'] = $idiomaActual;
  8.             if(strlen($url->segment(0))<3 && $url->segment(0)!='') {
  9.                 setcookie ("leng", $url->segment(0), time () + 7*24*60*60);
  10.                 $idiomaActual = $url->segment(0);
  11.                 $_SESSION['leng'] = $idiomaActual;
  12.             }
  13.             elseif(isset($_REQUEST['leng'])) {
  14.                 //setcookie ("leng", $_REQUEST['leng'], time () + 7*24*60*60);
  15.                 $idiomaActual = $_REQUEST['leng'];
  16.                 $_SESSION['leng'] = $idiomaActual;
  17.             }
  18.             elseif(isset($_COOKIE['leng'])) {
  19.                 if(file_exists($config->get('root')."lenguajes/".$_COOKIE['leng'].".php")) {
  20.                     $idiomaActual = $_COOKIE['leng'];
  21.                     $_SESSION['leng'] = $idiomaActual;
  22.                 }
  23.             }
  24.             else {
  25.                 if(file_exists($config->get('root')."lenguajes/".$_SESSION['leng'].".php")) {
  26.                     $idiomaActual = $config->get('lenguaje');
  27.                     $_SESSION['leng'] = $idiomaActual;
  28.                 }
  29.             }
  30.             // Incluimos el archivo del idioma seleccionado
  31.             // o el archivo por defecto si no se seleccionó
  32.             // idioma o si no se encuentra el archivo
  33.             include $config->get('root')."/lenguajes/".$idiomaActual.".php";
  34.         }
  35.         else {
  36.             $leng = Language::singleton();
  37.             $leng->get_session_handler();
  38.             $idiomaActual = $config->get('lenguaje');
  39.             setcookie ("leng", $idiomaActual, time () + 7*24*60*60);
  40.             session_start();
  41.  
  42.             $_SESSION['leng'] = $idiomaActual;
  43.  
  44.             include $config->get('root')."/lenguajes/".$config->get('lenguaje').".php";
  45.         }

y por últmo esta es mi funcion que parsea la reglas de ruteo:
Código PHP:
Ver original
  1. private function parsearRuta() {
  2.         //creo una instancia de la clase url
  3.         $url = Url::singleton();
  4.         $config = Config::singleton();
  5.         $debug = firePHP::getInstance();
  6.  
  7.         //valido si la url es distinta a /
  8.         if($this->uri != '/') {
  9.             //valido si la url es literal
  10.             if (isset($this->routes[$this->uri])) {
  11.                 $this->uri = $this->routes[$this->uri];
  12.                 $url->uri_string = $this->uri;
  13.                 return $this->uri;
  14.             }
  15.             // recorro el arreglo de reglas router
  16.             foreach ($this->routes as $key => $val) {
  17.                 // Convierto los wild-cards a RegEx
  18.                 //$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
  19.                 //$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', str_replace(':alphanum','[a-z0-9]+',str_replace(':alpha','[a-z]+',$key))));
  20.                 if (strpos($key, ':') !== false) {
  21.                     $wildcard = array(':any', ':alphanum', ':num', ':alpha');
  22.                     $regex    = array('(.+)', '([a-z0-9]+)', '([0-9]+)', '([a-z]+)');
  23.                     $key    = str_replace($wildcard, $regex, $key);
  24.                 }
  25.  
  26.                 //valido si hay un lenguaje en la session
  27.                 if(!empty ($_SESSION['leng']) && $config->get('multi') && $config->get('prefix_multi')) {
  28.                     $key = $_SESSION['leng'].'/'.$key;
  29.                 }
  30.                 // Valido si existe coincidencia
  31.                 if (preg_match('#^'.$key.'$#', $this->uri)) {
  32.                     // Valido si hay concidencia con las back-reference?
  33.                     if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) {
  34.                         $val = preg_replace('#^'.$key.'$#', $val, $this->uri);
  35.                     }
  36.                     // setteo la uri final
  37.                     $this->uri = $val;
  38.                     $url->uri_string = $this->uri;
  39.                     return $this->uri;
  40.  
  41.                 }
  42.                 //valido si la regla esta dentro de la url
  43.                 elseif(strpos($this->uri, $key)!== FALSE) {
  44.                     $this->uri = $val;
  45.                     $url->uri_string = $this->uri;
  46.                     return $this->uri;
  47.                 }
  48.             }
  49.         }
  50.         else{
  51.             //si no esta dentro de una regla de ruteo armo la uri
  52.             // con los segmentos
  53.             $this->uri = implode('/', $url->segments);
  54.             $url->uri_string = $this->uri;
  55.         }
  56.     }

Esta linea:
Código PHP:
Ver original
  1. if(!empty ($_SESSION['leng']) && $config->get('multi') && $config->get('prefix_multi'))
lo que hace es validar si quiero tomar el prefijo del lenguaje (es,fr,en, etc) o no.
como dije antes, el tema donde se me complica es como cambiar el valor de la session para que me cambie de lenguaje. Hoy estuve probando de nuevo desde jquery que al hacer click en el link de las banderas haga esto:
Código Javascript:
Ver original
  1. $('#en').click(function(){
  2.                     var params = {
  3.                         'nuevoleng':'en'
  4.                     }
  5.                     $.ajax({
  6.                         url : '<?=$config->get('base') ?>index/cambiarSession',
  7.                         type: 'POST',
  8.                         data: params,
  9.                         dataType: 'html',
  10.                         success: function(v){
  11.                             console.log(v);
  12.                             if($.trim(v)=="1"){
  13.                                 //$(location).attr('href',$(this).attr('href'));
  14.                                 location.replace('index.php');
  15.                             }
  16.  
  17.  
  18.                         }
  19.                     })
  20.                     console.log($(this).attr('href'));
  21.  
  22.                 });
y mi método cambiarSession tiene esto:
Código PHP:
Ver original
  1. public function cambiarSession(){
  2.         $this->Debug->info($this->Session->get('leng'));
  3.         $antes = $this->Session->get('leng');
  4.         $this->Session->set('leng',$_REQUEST['nuevoleng']);
  5.         $this->Debug->warn($this->Session->get('leng'));
  6.         if($antes!=$this->Session->get('leng')){
  7.             echo 1;
  8.         }
  9.         else{
  10.             echo 0;
  11.         }
  12.         //echo 'en';
  13.     }
el cambio de session en el método me lo hace, pero cuando redirecciono con el jquery me sigue tomando el lenguaje por defecto y no entiendo porque :s