Arf...
J'ai aucune prétention et si je savais tout je ne poserais pas de question... donc de là à sortir ce genre de réponse
Manifestement, on est bien sur HFR, pas de doute.
Les variables sont peut être toutes détruites, sauf que jusqu'à preuve du contraire, les "variables" prédéfinies (dsl ça s'appelle comme ça dans la doc php) ne sont pas détruites à la fin de l'exécution d'un script php (dsl pour le fichier à la place de script )
http://www.php.net/manual/fr/langu [...] efined.php
D'ou ma question sur $GLOBALS.
Par ailleur, voilà le code de "page_header.php" :
Code :
- <?php
- /***************************************************************************
- * page_header.php
- * -------------------
- * begin : Saturday, Feb 13, 2001
- * copyright : (C) 2001 The phpBB Group
- * email : support@phpbb.com
- *
- * $Id: page_header.php,v 1.106.2.20 2003/06/10 20:48:19 acydburn Exp $
- *
- *
- ***************************************************************************/
- /***************************************************************************
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- ***************************************************************************/
- if ( !defined('IN_PHPBB') )
- {
- die("Hacking attempt" );
- }
- define('HEADER_INC', TRUE);
- //
- // gzip_compression
- //
- $do_gzip_compress = FALSE;
- if ( $board_config['gzip_compress'] )
- {
- ...
|
Donc comme tu peux le voir, ce $board_config[] est bien définit ailleurs (en l'occurence dans "common.php" ) et est pourtant accessible de ce script.
Il y a donc bien un mécanisme qui le permet et c'est ce que je cherchais à comprendre dans ce cas précis (même si c'est pas la solution à mon pb).
Enfin, vu que vous avez l'air de vous faire plaisir à penser que je vous pose des questions débiles pour le fun alors que même si je ne suis pas un pro mon pb correspond bien à un besoin réel, voilà des infos plus détaillées :
En fait je suis l'auteur d'un MOD pour phpBB qui s'appelle Advanced time management 2.0.0
http://www.phpbb.com/phpBB/viewtopic.php?t=115692
Ce MOD sert entre autre à gérer l'heure d'été sur un forum phpBB, mais dispose aussi de 2 modes avancés qui permettent de prendre totalement en charge la gestion des heures du forum en la synchronisant :
- soit sur l'heure du serveur, avec application du fuseau horaire et de l'heure d'été du PC
- soit entièrement sur l'heure locale du PC.
Comme vous pouvez le voir, ces 2 modes nécessitent donc de rapatrier au plus vite (dès la première connexion), des infos du PC (en Javascript donc).
A partir de là, pour vous expliquer son fonctionnement, je vous donne la version actuelle (via les variables de session)...
A chaque affichage d'une page du forum, du code dans le fichier "page_header.php" est chargé de définir s'il y a lieu de récupérer des infos du PC (= si 1ère connexion ou non)...
Code :
- global $userdata;
- if ( ($userdata['user_id'] != ANONYMOUS && $userdata['user_time_mode'] >= 4) || ($userdata['user_id'] == ANONYMOUS && $board_config['default_time_mode'] >= 4) )
- {
- @ini_set('arg_separator.output', '&');
- session_start();
- if ( !isset($_SESSION['pc_timezoneoffset']) && !isset($_POST['pc_timezoneoffset']) )
- {
- $template->assign_block_vars('switch_pc_time_data_search', array());
- } else
- {
- $template->assign_block_vars('switch_no_pc_time_data_search', array());
- }
- } else
- {
- $template->assign_block_vars('switch_no_pc_time_data_search', array());
- }
|
Comme vous pouvez le voir, ce code teste si on est sur les modes 5 ou 6 (>=4), et dans ce cas si les infos du PC sont déjà dans la variable de session ou sur le formulaire de la page.
Si ça n'est pas le cas, il demande l'exécution du code ci-dessous sur la page à afficher...
Code :
- <script language="JavaScript" type="text/javascript">
- function pc_time_data() {
- var pc_dateTime = new Date()
- document.currentForm.pc_timezoneoffset.value = pc_dateTime.getTimezoneOffset();
- document.currentForm.pc_date.value = pc_dateTime.getFullYear()*10000 + (pc_dateTime.getMonth()+1)*100 + pc_dateTime.getDate();
- document.currentForm.pc_time.value = pc_dateTime.getHours()*3600 + pc_dateTime.getMinutes()*60 + pc_dateTime.getSeconds();
- document.currentForm.submit();
- }
- </script>
- </head>
- <body bgcolor="{T_BODY_BGCOLOR}" text="{T_BODY_TEXT}" link="{T_BODY_LINK}" vlink="{T_BODY_VLINK}" onload="pc_time_data()">
- <IFRAME name="RemoteScripting" width="0" height="0" frameborder="0" src="blank.htm"></IFRAME>
- <FORM action="{U_PC_TIME_DATA}" method="post" target="RemoteScripting" id="currentForm" name="currentForm">
- <input type="hidden" name="pc_timezoneoffset">
- <input type="hidden" name="pc_date">
- <input type="hidden" name="pc_time">
- </FORM>
|
Ce code récupère les infos du PC en Javascript, les place dans un tableau caché, et effectue un submit pour les faire passer en remote scripting via une IFRAME à un fichier "pc_time_data.php" qui va les traiter et les stocker pour les rendre disponible pour la fonction qui créer les dates/heures sur phpBB.
Tout l'intérêt de ce système réside dans le fait que sans rafraichissement, sans cookie, sans pop-up, sans en passer par les url car on ne sait pas sur quel lien va cliquer l'utilisateur du forum, je peux passer ces infos immédiatement au serveur pour servir à afficher la prochaine page que va demander l'utilisateur.
Elles sont donc immédiatement traitées par ce fichier "pc_time_data.php" et stockées dans des variables de session :
Code :
- @ini_set('arg_separator.output', '&');
- session_start();
- $_SESSION['pc_timezoneoffset'] = $_POST['pc_timezoneoffset'];
- $server_time = @gmdate(G)*3600 + @gmdate(i)*60 + @gmdate(s);
- if ( $_POST["pc_date"] == @gmdate(Ymd) )
- {
- $_SESSION['pc_time_offset'] = $_POST['pc_time'] - $server_time;
- } else
- {
- $_SESSION['pc_time_offset'] = 86400 - $server_time + $_POST['pc_time'];
- }
|
Enfin, ces infos sont utilisées tout au long de la connexion au forum par la fonction "create_date()" du fichier "functions.php" pour générer les dates/heures à afficher un peu partout sur le forum.
Voilà l'exemple du code du mode 5 :
Code :
- @ini_set('arg_separator.output', '&');
- session_start();
- if ( !$_SESSION['pc_timezoneoffset'] )
- {
- $tzo_sec = $userdata['user_pc_time_offset'];
- } else
- {
- $tzo_sec = $_SESSION['pc_timezoneoffset'] * (-60);
- }
- return ( !empty($translate) ) ? strtr(@gmdate($format, $gmepoch + $tzo_sec), $translate) : @gmdate($format, $gmepoch + $tzo_sec);
|
Donc...
Tout ceci, un peu résumé, marche parfaitement, mais... utilise des variables de session et donc nécessite des session_start()
Or les session_start() ne peuvent pas être placés avant un éventuel ob_start()
http://fr3.php.net/manual/fr/funct [...] -start.php
Or phpBB dispose d'une fonctionnalité de compression GZip qui utilise ob_start(). Et malheureusement, la fonction create_date() est appellée bien avant le code de compression GZip de phpBB contenant l'ob_start() ce qui me génère un message d'erreur.
Donc je n'ai de choix que soit d'arriver à détecter si un ob_start() doit être lancé et ne l'a pas encore été pour empêcher les session_start() temporairement (car une fois passé le 1er ob_start() plus de pb), soit de me passer de variables de session
Or j'ai pas trouvé comment détecter si un 1er ob_start() avait eu lieu ou non (car les ob_get_contents() sont toujours vides car vidés par le code phpBB), donc je me rabat sur la seconde solution : éviter les variables de session.
Pour celà, pc_time_data.php (qui n'est exécuté qu'une fois à l'arrivée sur le forum), doit pouvoir renseigner ces variables qui seront à dispo de page_header.php et functions.php tout au long de la connexion
Message édité par -ET- le 24-10-2003 à 02:57:39