Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

remover lenguaje en url

Estas en el tema de remover lenguaje en url en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, en mi framework cuando tenia sitio en varios idioma, usaba las url de esta manera: www.misitio.com/es/hola/mundo.php www.misitio.com/en/hello/world.php bien, ahora estoy intentando hacer ...
  #1 (permalink)  
Antiguo 04/05/2012, 19:57
Avatar de 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
remover lenguaje en url

Hola a todos,
en mi framework cuando tenia sitio en varios idioma, usaba las url de esta manera:
www.misitio.com/es/hola/mundo.php
www.misitio.com/en/hello/world.php

bien, ahora estoy intentando hacer mas flexible el framework para estas cuestiones y lo que quiero lograr es que quede asi:
www.misitio.com/hola/mundo.php
www.misitio.com/hello/world.php

obviamente el tema es poder cambiar la session para saber que archivo de lenguaje levantar.
Intente (sin exito) cambiar la session con un evento jquery + ajax, ya que nunca me terminaba de cambiar la session.
Se podra borrar la sigla del idioma desde htacces.
Alguien se le ocurrio hacer algo parecido o soy yo solamente el loco que lo quiere intentar :P
  #2 (permalink)  
Antiguo 04/05/2012, 20:18
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 8 meses
Puntos: 461
Respuesta: remover lenguaje en url

te serviría algo así como un routing al estilo symfony http://symfony.com/doc/current/book/routing.html que te permite indicar el patrón y este automáticamente sabe a cual archivo ir
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 04/05/2012, 20:24
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: remover lenguaje en url

Claro que se puede, de hecho en cualquier mayor fw es algo trivial(como te muestra el link de carlos) ahora como implementarlo en tu fw es otra historia, deberías mostrar tu router.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 05/05/2012, 16:28
Avatar de 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
  #5 (permalink)  
Antiguo 05/05/2012, 17:25
Avatar de 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 (solucionado)

Solucionado!!!!
el problema estaba en esta linea:
Código PHP:
Ver original
  1. $idiomaActual = $config->get('lenguaje');
siempre me tomaba el lenguaje que leia desde el archivo de configuracion jejeje
y agregar un if antes de validar si esta seteada la cookie.

Etiquetas: framework, lenguaje, php, remover, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:11.