-ET- a écrit :
1/ Avec le code JS actuel, on est d'accord que la seconde ligne du code JS envoi l'info dans un cookie de session (non enregistré sur le disque) ?
|
Oui session !
Oui pas sur disque !
Mais on peut aussi le faire en une seule ligne :
<SCRIPT>document.cookie = "time_offset=" + new Date().getTimezoneOffset();</SCRIPT> |
-ET- a écrit :
2/ On est aussi d'accord que même ces cookies de session peuvent être désactivés, au moins sur certains navigateurs ?
|
Oui, c'est possible, même si celà ne sert à rien !
-ET- a écrit :
3/ Enfin on est aussi d'accord que ces cookies de session sont créés par phpBB quand il y a session, pas par le script JS, et qu'on vient juste le mettre à jour s'il existe ?
|
NON, NON, NON !
Le cookie "time_offset" est créé par JavasCript !
Pour que le cookie soit créé par PHPBB, il faudrait quelque-part dans le code PHP, un truc du genre setcookie( "time_offset", ...)
-ET- a écrit :
4/ Pour ce qui est de JavaScript, on est aussi d'accord qu'on peut le désactiver TOTALEMENT, donc y compris les fonctions date/time ?
Il faut donc qu'un minimum de JS soit activé pour que cette manip fonctionne ?
|
Heu.... Oui !
-ET- a écrit :
Pour ce qui est de l'écriture dans la BD maintenant...
5/ Tu n'as pas été très clair sur la possibilité via le code JS d'envoyer la donnée directement dans la BD (comme on le fait avec le cookie).
Q : C'est totalement impossible quelque soit l'emplacement du code JS (dans le <head> ou dans un fichier php), où suivant cet emplacement ça peut être possible ?
Car Ptirhiik me propose de déplacer ce code dans le fichier sessions.php, ça changerait quelque chose ou non ?
http://forums.phpbb-fr.org/viewtopic.php?t=17107
|
Je ne suis pas allé voir http://forums.phpbb-fr.org/viewtopic.php?t=17107 !
Mais il faut parler clairement :
Dire "la possibilité via le code JS d'envoyer la donnée directement dans la BD (comme on le fait avec le cookie)" est une hérésie !
Soit c'est un raccourci malencontreux, soit tu ne comprends rien au fonctionnement HTTP,JS, PHP, Client, Serveur...
Pour être clair :
- L'info dont on parle, c'est "time_offset" !
- Cette info est disponible sur le Client. Le Serveur ne la connait pas, et pourtant c'est là qu'on en a besoin.
- Cette info ne peut être récupérée automatiquement QUE PAR JAVASCRIPT.
Les seules autres solutions sont :
La demander à l'utilisateur. Pourquoi pas ? S'il désactive les cookies et javascript y'a qu'à le faire bosser un peu !
Utiliser l'adresse IP de l'utilisateur pour essayer d'en déduire sa zone géographique. Mais bien sûr pour les paranos qui désactivent JS et les cookies, ben on peut être sûr qu'ils passent par des anonymiseurs. . .
- Une navigation type avec cookie et javascript actifs se passe comme çà (Sans gestion de session coté serveur):
1- Le client envoie une requête HTTP au serveur. Cette requête est généralement un simple GET + URL.
2- Le serveur reçois la requêtte HTTP. Tout ce qu'il sait du client à ce moment là, c'est l'adresse IP et le port où il doit envoyer la réponse. A ce moment là, il n'a pas l'info "time_offset" ! Une fois cette réponse envoyée, le serveur ne connait plus le client !
3- Le client reçois une page HTML. Cette page contient un bout de script qui lui demande de générer un cookie "time_offset". Le client prépare le cookie, mais il ne l'envoie pas. Il le garde en mémoire avec une référence au serveur qui lui à fournis la page.
4- L'utilisateur clique sur un lien ou sur un boutton de formulaire (ou bien c'est Javascript qui le fait, comme dans la première solution que je t'avais proposé : "myForm.submit();" ).
5- Le client envoie une requête HTTP au serveur. Mais comme il à un cookie pour ce serveur, il l'envoie dans la requête.
6- Le serveur reçois la requêtte HTTP. Cette requête contient l'info "time_offset" dans un cookie, il peut donc l'utiliser. Il prépare la réponse, et l'envoie au client.
7- Retour à l'étape 3
8- L'utilisateur ferme son navigateur, le cookie qui était conservé en mémoire est perdu.
Note : Le cookie reste en mémoire tant que le navigateur reste ouvert, même si l'utilisateur va visiter un autre site. Le cookie est associé au serveur (celui qui lui avait envoyé la page ayant servi à le créer), il ne sera pas envoyé à un autre serveur.
Donc, pour qu'une donnée générée par JS soit enregistrée en BD, il faut :
- Que cette donnée soit mise par JS dans un cookie, dans l'url, dans un champs de formulaire.
- Le serveur recoit l'info à la requête suivante. c'est un script PHP qui la récupère et qui la met en BD.
-ET- a écrit :
6/ Enfin, du coup on a pas parlé du fond du pb, comment récupérer la valeur de DatePC.getTimezoneOffset() puisque qu'on va essayer d'éviter les cookie et que tu me confirmes qu'il faut donc passer par un formulaire ou l'url (mais l'url ça me dit rien car mettre une date dedans va géner les bookmarks).
Donc on revient à ce script qu'il faut adapter si j'ai bien compris ?
<?php
if( ! isset( $_POST['time_offset'] ) )
{
// On n'a pas reçu le décalage, donc on le demande...
?>
<HTML>
<HEAD>
<SCRIPT>
function sendTimeZoneOffset()
{
myDate = new Date();
myForm.time_offset.value = myDate.getTimezoneOffset();
myForm.submit();
}
</SCRIPT>
</HEAD>
<BODY onload="sendTimeZoneOffset();">
<FORM action="index.php" method="post" id="myForm">
<input type="hidden" name="time_offset" id="time_offset">
</FORM>
</BODY>
</HTML>
<?php
// Fin du formulaire de demande du décalage.
exit;
}
// Traitement si on a le décalage
echo( "Le décalage est de {$_POST['time_offset']} minutes !" );
// Ton code ici ...
?> |
Dans ce cas, on a toujours ce pb de nom de la page php fixée en dur et qui empêche de l'utiliser avec toutes les solutions ne nécessitant qu'une seule modif au lieu d'une par page : overall_header.tpl, sessions.php ou functions.php Bref je sais toujours pas comment faire concrêtement 7/ Enfin tu penses quoi de cette idée ?
http://forum.2037.biz/viewtopic.ph [...] c&start=30
|
Ben c'est l'adaptation à PHPBB de ce que je proposais au début.
Tu as une page standard qui génère le <head></head>. C'est donc de çà qu'il faut se servir (si tu n'aime pas la solution cookie).
Dans ton script qui génère <HEAD>
<?php if( ! isset( $_GET['NoScript'] ) )
{
if( ! isset( $_POST['time_offset'] ) ) { // On n'a pas reçu le décalage, donc on le demande... ?> <HTML> <HEAD> <SCRIPT> <!--
function sendTimeZoneOffset() { myDate = new Date(); myForm.time_offset.value = myDate.getTimezoneOffset(); myForm.submit(); } -->
</SCRIPT> <NOSCRIPT>
<META HTTP-EQUIV=Refresh CONTENT="1; URL=<?php
// Ici, on met l'URL qu'avait demandé l'utilisateur au début :
echo( $_SERVER['REQUEST_URI'] . "?NoScript" );
?>">
</NOSCRIPT>
</HEAD> <BODY onload="sendTimeZoneOffset();"> <FORM action="<?php
// Ici, on met l'URL qu'avait demandé l'utilisateur au début :
echo( $_SERVER['REQUEST_URI'] );
?>" method="post" id="myForm"> <input type="hidden" name="time_offset" id="time_offset"> </FORM> </BODY> </HTML> <?php // Fin du formulaire de demande du décalage. // Le formulaire sera automatiquement renvoyé à la même URL que celle qu'avait demandé l'utilisateur.
exit; } else
{
$time_offset = $_POST['time_offset'];
}
}
else
{
$time_offset = 0;
}
echo( "\$time_offset = $time_offset<br>\n" );
// Traitement Normal, le décalage est dans $time_offset.
// S'il n'a pas été possible de récupérer le décallage, $time_offset vaut 0.
//
// Ton code ici ... // Par exemple la génération du <head></head> normal
?> |
J'espère que tu comprends ce que çà fait !
Message édité par Mara's dad le 03-07-2003 à 19:19:24
---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.