Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problemas con cookies y su orden de ejecución

Estas en el tema de Problemas con cookies y su orden de ejecución en el foro de PHP en Foros del Web. Hola a todos, hoy vengo con una peli de cookies. Veamos, tengo el siguiente código nada más abrir el archivo, para que elimine la cookie ...
  #1 (permalink)  
Antiguo 05/12/2014, 10:35
Avatar de SirZoX  
Fecha de Ingreso: mayo-2006
Ubicación: Valencia
Mensajes: 124
Antigüedad: 17 años, 11 meses
Puntos: 2
Problemas con cookies y su orden de ejecución

Hola a todos, hoy vengo con una peli de cookies.

Veamos, tengo el siguiente código nada más abrir el archivo, para que elimine la cookie de idioma que pueda existir previamente, y después capturo desde la url el valor de "L" y genero una nueva cookie con validez para la sesión actual y le asigno el valor que corresponda según el lenguaje en el que se haya hecho click. Esto está comprobado que al hacer click en cada uno de los idiomas, el navegador efectivamente elimina la anterior y genera una nueva con el valor correcto.
Código PHP:
    setcookie ('idioma','',time()-1);
    
    switch(
$_GET['l']) {
        case 
'es'setcookie('idioma','es'); break;
        case 
'en'setcookie('idioma','en'); break;
        case 
'it'setcookie('idioma','it'); break;
    } 
Inmediatamente después tengo éste código, que en principio será el que gestione, en función del idioma que haya almacenado en la cookie, los define que contienen los textos que se mostrarán luego.
Código PHP:
    switch ($_COOKIE['idioma'])  {
        case 
'es':
        case 
NULL;
        case 
'':
            
define ("langTitleTag","title en ES");
        break;
        
        
        case 
'en':
            
define ("langTitleTag","title en EN");
        break;
        
        
        case 
'it':
            
define ("langTitleTag","title en IT");
        break;    
    } 
Pues el problema que me encuentro, es que $_COOKIE['idioma'] nunca captura el valor de la cookie a la primera, sino a la segunda. Es decir, me cargo la cookie del navegador para empezar la prueba limpio. Entro a la página y por defecto debe mostrarme en castellano, OK, esto funciona. Pulso cualquiera de los dos otros idiomas y al recargar la página sigue en castellano, pulso de nuevo en cualquiera de los dos idiomas, y ahora el title sale el que había pulsado la primera vez... Y no tengo ni idea de por donde meterle mano porque he probado hasta a colocar el switch($_COOKIE[]) dentro del body... que total por probar... pero nada.

A ver si alguien me puede arrojar algo de luz con esto, que llevo demasiadas horas perdidas con esto, y me he planteado otras soluciones como capturar la IP y guardar temporalmente en una BBDD el idioma asociado a una IP, pero la coña es que si entran desde la oficina del cliente, todos con la misma IP... ya va a fallar el asunto.
  #2 (permalink)  
Antiguo 05/12/2014, 11:52
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problemas con cookies y su orden de ejecución

Dicho comportamiento es normal, las cookies no se establecen en $_COOKIE de manera inmediata, la razón es que las cookies son un mecanismo propio del navegador.

Entonces, es el navegador es que combina las cookies que envía el servidor con las locales, y manda de nuevo hacia el servidor (en la próxima petición) todas las cookies, etc.

La única forma que tienes para lograr eso sería estableciendo una variable por ti mismo, y usar dicho valor además de establecer la cookie.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 05/12/2014, 12:23
Avatar de SirZoX  
Fecha de Ingreso: mayo-2006
Ubicación: Valencia
Mensajes: 124
Antigüedad: 17 años, 11 meses
Puntos: 2
Respuesta: Problemas con cookies y su orden de ejecución

Entonces la cookie realmente no me sirve de nada, sino que todos los enlaces que haya en la web o que se generan dinámicamente, deberían llevar el "&idioma=xx" para recogerlo luego por url y gestionarlo en toda la página. no?

Esto es lo que he entendido de la explicación que me acabas de dar.

He visto un par de hilos más por el foro [aquí]. Y por lo que parece, al final resultaba más efectivo con arrays, y en este caso acabo muriendo en lo mismo, en tener que meter en todos los enlaces la información necesaria para capturarla después por url :/

Última edición por SirZoX; 05/12/2014 a las 12:38
  #4 (permalink)  
Antiguo 06/12/2014, 17:06
 
Fecha de Ingreso: abril-2012
Mensajes: 87
Antigüedad: 12 años
Puntos: 1
Respuesta: Problemas con cookies y su orden de ejecución

Hola, tambien puedes detectar el idioma del cliente con $_SERVER["HTTP_ACCEPT_LANGUAGE"] y crear unos if con los idiomas que tengas en tu sitio web, yo en mi caso he usado alguna vez este codigo.

Código PHP:
$dectectar substr($_SERVER["HTTP_ACCEPT_LANGUAGE"] , 02);

if(
$dectectar == "en"){
    include(
"lang/en.php");
    
$idioma "en";
    
}else{
    include(
"lang/es.php");
    
$idioma "es";

Tambien una vez generado el idioma del cliente puede guardala en un cookie y verificar la proxima vez si al cookie existe no llamar al codigo o si es diferente a la actual.

Espero haberte ayudado!!
  #5 (permalink)  
Antiguo 09/12/2014, 08:10
Avatar de SirZoX  
Fecha de Ingreso: mayo-2006
Ubicación: Valencia
Mensajes: 124
Antigüedad: 17 años, 11 meses
Puntos: 2
Respuesta: Problemas con cookies y su orden de ejecución

Sí, también había leído sobre esta posibilidad, pero si no me equivoco, el idioma que retorna es el idioma del navegador. Sé que quizá soy algo rebuscado, pero no tengo ganas de que me busquen las cosquillas luego. En el caso de que llegara el típico personaje que se descarga versiones beta de sistemas operativos o navegadores, estaría siempre o casi siempre en inglés y no sería del todo válida la aplicación entonces.

De todos modos, ya había pensado implementar esta solución, puesto que de todas las que se me han ocurrido, he encontrado y me habéis comentado, es la que más porcentaje de acierto sobre el cliente creo que tiene. De modo que sí, la implementaré y pondré también el registro de cookies para que en la próxima visita ignore el idioma del navegador en caso de que ya tenga cookie establecida.

Gracias a todos por responder.
  #6 (permalink)  
Antiguo 09/12/2014, 08:44
Avatar de SirZoX  
Fecha de Ingreso: mayo-2006
Ubicación: Valencia
Mensajes: 124
Antigüedad: 17 años, 11 meses
Puntos: 2
Respuesta: Problemas con cookies y su orden de ejecución

De todas maneras, pongo el código como lo he hecho yo, que ha sido con una pequeña "trampa" pero que funciona a la primera y sin mucha historia.

creas tu archivo php, por ejemplo index.php con este comienzo antes del doctype
Código PHP:
<?php 
    $idioma 
$_COOKIE['idioma'];
    include (
'idiomas.php');
?>
Y ya dentro del body, colocas la típica imagen de la banderita del país del idioma que quieras mostrar colocando un enlace a la página "lang.php" y pasando como parámetro cada uno de los idiomas y además la URI en la que estamos. De manera que si estamos en una página que viene creada por alguna variable por ejemplo "pagina.php?ID=10", recogemos toda la URI para luego desde lang.php poder devolvernos a la misma página con el idioma ya cambiado.
Código PHP:
    <a href="lang.php?l=es&source=<?php echo $_SERVER['REQUEST_URI']; ?>"><img src="ESP.png" alt="img"></a><br>
    <a href="lang.php?l=en&source=<?php echo $_SERVER['REQUEST_URI']; ?>"><img src="GBR.png" alt="img"></a><br>
    <a href="lang.php?l=it&source=<?php echo $_SERVER['REQUEST_URI']; ?>"><img src="ITA.png" alt="img"></a>
Ahora el contenido de "lang.php", donde capturamos desde la URL tanto el lenguaje ("l") como la página origen ("source").
Con el switch determinamos cual es el idioma en que queremos ver la página, establecemos la cookie de turno y refrescamos la página devolviéndonos a la página original, ya con cookies establecidas, de manera que cuando cargue, mostrará el idioma deseado.
Código PHP:
<?php
$source 
$_GET['source'];
$idioma $_GET['l'];
    
switch(
$idioma) {
    case 
'es'setcookie('idioma','es'); refresh(0,$source); break;
    case 
'en'setcookie('idioma','en'); refresh(0,$source); break;
    case 
'it'setcookie('idioma','it'); refresh(0,$source); break;
}
?>
Quedaría mostrar el contenido de "idiomas.php" que podría ser algo de este estilo:
Código PHP:
<?php
        
//hemos capturado $idioma a través de $idioma=$_COOKIE['idioma'] al inicio del archivo "index.php" por tanto la tenemos disponible aquí.
    
switch ($idioma)  {
        case 
'es':
        case 
NULL;
        case 
'':
            
define ("saludo","Hola");
        break;
        
        
        case 
'en':
            
define ("saludo","Hello");
        break;
        
        
        case 
'it':
            
define ("saludo","Ciao");
        break;
        
    }
    


?>
Y con un simple "echo saludo" tendríamos el saludo impreso por pantalla en el idioma seleccionado.

Espero que se me haya entendido bien, es la primera vez creo que pongo tanta explicación y no sé si el orden y la explicación será del todo correcta, pero bueno, esperemos que le valga a alguien.

Etiquetas: cookies
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 03:32.