Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2010, 00h55   #1
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Par défaut Modifier une variable de session sur onclick

Bonjour, je suis en train de me prendre la tête sur un problème qui à la base me semblait assez simple : modifier le contenu d'une variable de session lors du clic sur un href !!

Début de page, ouverture de la session puis assignation d'une valeur à la variable de session si celle-ci n'existe pas. Puis, deux liens href, avec sur le onclick la modification de la variable.

Or il s'avère lorsque je fais un echo, que la variable prend la dernière valeur lue, même si le onclick n'est pas réalisé.

Code :
1
2
3
4
5
6
7
8
9
10
<?php
session_start();
if (!isset($_SESSION['language'])) { $_SESSION['language']="en"; }
echo "Langue1 : ".$_SESSION['language'];
?>
 
<a href="#" id="lang-en" onclick="<?php $_SESSION['language']='en'; ?>"><img src="img/en.jpg" width="16px" height="11px" border="0" class="lang-en" /></a>
<a href="#" id="lang-fr" onclick="<?php $_SESSION['language']='fr'; ?>"><img src="img/fr.jpg" width="16px" height="11px" border="0" class="lang-fr" /></a>
 
<?php echo2 "Langue : ".$_SESSION['language']; ?>
Le echo1 m'indique bien "en", mais le echo2 m'indique "fr". Le php dans le onclick est interprété même sans que l'action ait lieu. Quel est le problème ?

Merci d'avance.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 01h02   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Il ne faut pas perdre de vue que PHP est exécuté côté serveur, JS côté client.

Ton script PHP délivre la page suivante (fais un "afficher la source" de ta page web si tu as un doute) :

Code :
1
2
3
4
5
6
Langue1 : en
 
<a href="#" id="lang-en" onclick=""><img src="img/en.jpg" width="16px" height="11px" border="0" class="lang-en" /></a>
<a href="#" id="lang-fr" onclick=""><img src="img/fr.jpg" width="16px" height="11px" border="0" class="lang-fr" /></a>
 
Langue2 : fr
... ce qui n'est pas ce que tu souhaites, notamment au niveau du JS, tu en conviendras ;-)
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 01h12   #3
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Ce qui veut dire donc que le php sera toujours interprété au chargement de la page, quelque soit son emplacement et sa "condition" d'exécution, c'est ça ?

Du coup, ajax ?
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 01h27   #4
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 301
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 301
Points : 4 479
Points : 4 479
bingo.
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h28   #5
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 815
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 815
Points : 3 440
Points : 3 440
Citation:
Du coup, ajax ?
Ou tu recharges la page en envoyant les paramètres quivontbien.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 11h57   #6
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Ok, ce sera ajax alors car j'aimerai ne pas avoir à recharger la page !
Je vais tenter ça.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 14h00   #7
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Citation:
Envoyé par nicolas2603
Ok, ce sera ajax alors car j'aimerai ne pas avoir à recharger la page !
Je vais tenter ça.
Si l'Ajax se contente de modifier coté serveur la langue (la session en faite), le contenu de la page coté client ne changera pas pour autant.
Ca sera une fois avoir cliquer sur un lien que cette fois le contenu sera en relation avec la nouvelle langue, ce qui revient presque à recharger la page.

Je vois d'ici les utilisateurs cliquer 10 fois sur le lien ne voyant pas le contenu changer de langue.
Ce qui suppose donc qu'au retour de l'Ajax, il faudrait afficher une message (un alert() par exemple) expliquant tout ça.
Mouais.


Puis n'oublie pas non plus que les moteurs de cherches n'exécutent pas Javascript (évènement onclick, connait pas), ce qui sous entend que les autres langues risquent d'être jamais parcourues, jamais référencées.

Faire ça en Ajax, faut voir.

Puis créer des liens de type <a href="#">, donc sans l'ombre d'une URL est presque qu'un non sens
Créer des liens sans liens, pourquoi donc créer des liens alors ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2010, 23h57   #8
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
En fait j'utilise un script jquery qui permet de modifier en ajax le contenu d'un texte lors d'un clic sur le langage (ChangeLang). Donc ça ça fonctionne, mais lors de la navigation dans les liens, le langage sélectionné n'est pas conservé et la nouvelle page s'affiche dans la langue par défaut. C'est pour ça que j'essaye en plus d'y associer une variable de session.

Voici le code utilisé dans mon html :
Code :
1
2
3
4
5
6
7
<script>
$("#lang-en").click(function(){$("body").changeLang({lang: "en", file: "language.xml"});});
$("#lang-fr").click(function(){$("body").changeLang({lang: "fr", file: "language.xml"});});
</script>
 
<a href="#" id="lang-en"><img src="img/en.jpg" width="16px" height="11px" border="0" class="lang-en" /></a>
<a href="#" id="lang-fr"><img src="img/fr.jpg" width="16px" height="11px" border="0" class="lang-fr" /></a>
Et voici la fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(function($) {
$.fn.changeLang = function(params){
	var defaults = {
		file: 'language.xml',
		lang: 'en'
	}
	var aTexts = new Array();
	if(params) $.extend(defaults, params);
	$.ajax({
		type: "GET",
		url: defaults.file,
		dataType: "xml",
		success: function(xml) {
			$(xml).find("text").each(function()	{
				var textId = $(this).attr("id");
		        	var text = $(this).find(defaults.lang).text();
				aTexts[textId] = text;
			});
			$.each($("*"), function(i, item) {
				if($(item).attr("langtag") != null) {
						$(item).fadeOut(150).fadeIn(150).text(aTexts[$(item).attr("langtag")]);
				}
			});
		}
	});
};
})(jQuery);
Effectivement je n'ai pas le réflexe de coder l'action sur le clic sur l'image directement, c'est pour ça que j'ai des liens href="#". Mais effectivement, je vais corriger ça, et puisque ma fonction est déjà de l'ajax, je vais essayer d'y intégrer la modification de la variable de session.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h19   #9
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 695
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 695
Points : 3 262
Points : 3 262
Citation:
Envoyé par nicolas2603
C'est pour ça que j'essaye en plus d'y associer une variable de session.
Tout à fait, la session est prévue pour conserver une persistance tout au long de la navigation pour chaque utilisateur.
Il faut donc modifier la session pour que la fois d'après (prochaine page que demandera l'utilisateur) le contenu soit en rapport avec la nouvelle langue, en rapport avec cette variable de session ($_SESSION['language']).

Pour modifier une variable de session (language) en Ajax il faut que l'URL + la langue en paramètre pointe vers une page Php (genre changeLang.php) qui s'occupera de le faire.


Après, que tu souhaite que le contenu actuel soit quand même modifié (tout ou en partie, peu importe), ce que fait ton code actuellement, pourquoi pas.
Mais l'URL pointe sur un fichier XML (language.xml), ceci ne te donne pas la possibilité de faire du Php.
Dans ce cas là, il faut donc bien voir qu'il y a 2 choses différentes : Modifier la session pour la navigation futur + modifier le contenu actuel.

Enfin, si j'ai bien compris le truc.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 15h27   #10
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Ce que je tente de faire à l'heure actuelle, c'est de rajouter au code qui gère déjà le contenu EN-FR via AJAX la partie qui modifie la variable de session.

Car lord du clic sur mes éléments #lang-en et #lang-fr, le contenu de la page change déjà via AJAX, ça ça fonctionne.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 16h02   #11
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Bonjour, j'ai réussi à modifié ma variable de session en AJAX, un alert m'en donne bien la preuve, mais apparemment elle ne reste pas en mémoire !

Mon fichier index.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
session_start();
if (!isset($_SESSION['language'])) { $_SESSION['language']="en"; }
?>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<script language="javascript" type="text/javascript" src="css/jquery-1.4.4.min.js"></script>
<script>$("body").changeLang({lang: "<?php echo $_SESSION['language']; ?>", file: "language.xml"});</script>
<script>
$(".lang-en").click(function(){$("body").changeLang({lang: "en", file: "language.xml"});});
$(".lang-fr").click(function(){$("body").changeLang({lang: "fr", file: "language.xml"});});
</script>
</head>
<body>
 
<div id="global">
     <div id="header">
          <img src="img/en.jpg" width="16px" height="11px" border="0" class="lang-en" />
          <img src="img/fr.jpg" width="16px" height="11px" border="0" class="lang-fr" />
     </div>
</div>
 
</body>
</html>
Le script qui modifie le contenu du texte en fonction de la langue, et qui modifie également la variable de session via le fichier language.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
(function($) {
	$.fn.changeLang = function(params){
		var aTexts = new Array();
		$.ajax({
			type: "GET",
			url: params.file,
			dataType: "xml",
			success: function(xml) {
				$(xml).find("text").each(function()	{
					var textId = $(this).attr("id");
		        	var text = $(this).find(params.lang).text();
					aTexts[textId] = text;
				});
				$.each($("*"), function(i, item) {
					if($(item).attr("langtag") != null) {
						$(item).fadeOut(150).fadeIn(150).text(aTexts[$(item).attr("langtag")]);
					}
				});
				$.get("language.php", { id:params.lang });
			}
		});
	};
})(jQuery);
Et pour finir mon fichier language.php tout simple
Code :
1
2
3
4
<?php
$_SESSION['language']=$_GET['id'];
echo $_SESSION['language'];
?>
Quand je clique sur chaque image ça m'indique bien Langage modifié:fr ou Langage modifié:en, donc la variable est bien modifiée, mais lorsque je clique sur une autre page, elle reprend sa valeur 'en' comme si elle n'existait pas.

Une idée d'où vient mon erreur ?
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 17h28   #12
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 656
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 656
Points : 5 359
Points : 5 359
Il ne manquerait pas un session_start() dans ton fichier language.php ?
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 17h54   #13
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
effectivement, à force de me creuser la tête, j'en ai fait une erreur de débutant !!!!

Merci beaucoup, ça fonctionne maintenant !
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h45.


 
 
 
 
Partenaires

Hébergement Web