Location: PHPKode > projects > ProjectSion > projectsion/index.php
<?php
//=============================================================================
// Déclarations des gestionnaires d'erreurs
//=============================================================================

/**
 * Le gestionnaire d'erreurs pour la classe base de données.
 * Cette fonction remplace la fonction par défaut contenue dans la classe "Database".
 *
 * Le tableau reçu en paramètre :
 * - $aError['code']    = Le numéro d'erreur Mysql.
 * - $aError['message'] = Le message d'erreur.
 * - $aError['sqltext'] = La requête ayant déclenché l'erreur.
 *
 * @author Lionel SAURON
 *
 * @param $aError(array) Tableau décrivant l'erreur.
 */
function globalDatabaseErrorHandler($aError)
{
	// Pour eviter de reboucler s'il y a une erreur là en dessous.
	static $s_StopErrorHandler = false;

	if($s_StopErrorHandler == true) return;
	$s_StopErrorHandler = true;

	// ===== Le message pour l'écran =====
	Message::addError(trim($aError['message']));
	Message::addError(trim($aError['sqltext']));

	$s_StopErrorHandler = false;
}

/**
 * Le gestionnaire d'erreurs pour PHP remplaçant la fonction par défaut.
 * Traite les erreurs de configuration pouvant résulter d'une mauvaise installation de l'application.
 *
 * @author Lionel SAURON
 *
 * @param $nErrorNo(int) Le niveau d'erreur.
 * @param $sErrorMsg(string) Le message d'erreur.
 * @param $sErrorFile(string) Le nom du fichier dans lequel l'erreur a été identifiée.
 * @param $nErrorLine(int) Le numéro de ligne à laquelle l'erreur a été identifiée.
 * @param $aErrorContext(array) Toutes les variables qui existaient lorsque l'erreur a été déclenchée.
 */
function installScriptErrorHandler($nErrorNo, $sErrorMsg, $sErrorFile, $nErrorLine, $aErrorContext)
{
	// ===== On filtre les messages d'erreur =====
	// On supprime les erreurs de php 4.
	if(($nErrorNo == E_STRICT) && (strpos($sErrorMsg, "var: Deprecated") !== false)) return;

	include("pages/error-install.inc.php");
	die();
}

/**
 * Le gestionnaire d'erreurs pour PHP remplaçant la fonction par défaut.
 * Traite les erreurs lors de l'exécution normal du site.
 *
 * @author Lionel SAURON
 *
 * @param $nErrorNo(int) Le niveau d'erreur.
 * @param $sErrorMsg(string) Le message d'erreur.
 * @param $sErrorFile(string) Le nom du fichier dans lequel l'erreur a été identifiée.
 * @param $nErrorLine(int) Le numéro de ligne à laquelle l'erreur a été identifiée.
 * @param $aErrorContext(array) Toutes les variables qui existaient lorsque l'erreur a été déclenchée.
 */
function globalScriptErrorHandler($nErrorNo, $sErrorMsg, $sErrorFile, $nErrorLine, $aErrorContext)
{
	// Pour eviter de reboucler s'il y a une erreur là en dessous.
	static $s_StopErrorHandler = false;

	if($s_StopErrorHandler == true) return;
	$s_StopErrorHandler = true;

	// ===== Le message pour l'écran =====
	Message::addError($sErrorMsg);
	Message::addError("Ligne {$nErrorLine} dans le fichier {$sErrorFile}");

	$s_StopErrorHandler = false;
}

//==============================================================================
// Initialisation de la page
//==============================================================================

// ===== Bufferisation de sortie =====

ob_start('ob_gzhandler');

// Le gestionnaire d'erreurs d'install pour PHP
set_error_handler("installScriptErrorHandler");

// ===== Les fichiers de configuration =====

// Le fichier principal
include_once("config/main.conf.php");

// Les autres fichiers de configurations
require_once(PATH_CONFIG."/database.conf.php");
require_once(PATH_CONFIG."/export.conf.php");

// ===== Les librairies et les classes =====

require_once(PATH_PHP_LIB."/utils.lib.php");
require_once(PATH_PHP_LIB."/css.lib.php");
require_once(PATH_PHP_LIB."/database.class.php");
require_once(PATH_PHP_LIB."/formvalidation.class.php");
require_once(PATH_PHP_LIB."/message.class.php");

require_once(PATH_APP_LIB."/display.lib.php");
require_once(PATH_APP_LIB."/profilmanager.class.php");

require_once(PATH_ROOT."/libraries/metier/project.class.php");
require_once(PATH_ROOT."/libraries/metier/task.class.php");
require_once(PATH_ROOT."/libraries/metier/activity_summary.lib.php");
require_once(PATH_ROOT."/libraries/metier/project_summary.lib.php");
require_once(PATH_ROOT."/libraries/metier/application_summary.lib.php");

// Le gestionnaire d'erreurs global pour PHP
set_error_handler("globalScriptErrorHandler");

// ===== Format et timezone =====

// bcp de locales différentes car selon l'os, c'est géré différemment
setlocale(LC_TIME, 'french', 'fr', 'fr_FR', 'fr_FR.UTF8', 'fra', 'fra_fra');
// timezone
date_default_timezone_set('Europe/Paris');

// ===== La session =====

session_name('MAIN_PAGE');
session_start();

// Chargement des erreurs sauvegardés
Message::loadFromSession($_SESSION['ERROR_MESSAGE']);

// ===== La base de données =====

// Le gestionnaire d'erreurs de la base
Database::setErrorHandler("globalDatabaseErrorHandler");

// Connexion à la base
Database::openConnection(DATABASE_LOGIN, DATABASE_PASSWORD, DATABASE_NAME, DATABASE_SERVER);

// On précise à la base qu'on travaille en UTF-8
Database::execute("SET NAMES UTF8");

// ===== Le gestionnaire de profil =====

ProfilManager::loadRights();

//==============================================================================
// Préparation des données
//==============================================================================

// ===== Le tableau contenant les informations pour la navigation =====

$aNavigationPageData = array
(
	// ----- Basic -----
	'home'		    => "home.inc.php",
	'login_do'	    => "login_do.inc.php",
	'logout_do'	    => "logout_do.inc.php",
	'no_rights'		=> "error-rights.inc.php",
	'contributeurs'	=> "contributeurs.inc.php",

	// ----- Applications -----
	'applications' => array
	(
		''                            => "applications/list.inc.php",
		'add'                         => "applications/add.inc.php",
		'add_do'                      => "applications/add_do.inc.php",
		'edit'                        => "applications/edit.inc.php",
		'edit_do'                     => "applications/edit_do.inc.php",
		'delete'                      => "applications/delete.inc.php",
		'delete_do'                   => "applications/delete_do.inc.php",
		'summary_period_sans_detail'  => "applications/summary_period_sans_detail.inc.php",
	),

	// ----- Projets -----
	'projects' => array
	(
		''                           => "projects/list.inc.php",
		'add'                        => "projects/add.inc.php",
		'add_do'                     => "projects/add_do.inc.php",
		'edit'                       => "projects/edit.inc.php",
		'edit_do'                    => "projects/edit_do.inc.php",
		'delete'                     => "projects/delete.inc.php",
		'delete_do'                  => "projects/delete_do.inc.php",
		'delete_multiple'            => "projects/delete_multiple.inc.php",
		'delete_multiple_do'         => "projects/delete_multiple_do.inc.php",
		'view'                       => "projects/view.inc.php",
		'summary_sans_detail'        => "projects/summary_sans_detail.inc.php",
		'summary_detail'             => "projects/summary_detail.inc.php",
		'summary_period_sans_detail' => "projects/summary_period_sans_detail.inc.php",
		'summary_period_detail'      => "projects/summary_period_detail.inc.php",
		'finalisation'               => "projects/finalisation.inc.php",
		'finalisation_do'            => "projects/finalisation_do.inc.php",
		'saisies_multiples'          => "projects/saisies_multiples.inc.php",
		'saisies_multiples_do'       => "projects/saisies_multiples_do.inc.php",
	),

	// ----- Tâches -----
	'tasks' => array
	(
		''                  => "tasks/list.inc.php",
		'add_main'          => "tasks/add_main.inc.php",
		'add_main_do'       => "tasks/add_main_do.inc.php",
		'add_sub'           => "tasks/add_sub.inc.php",
		'add_sub_do'        => "tasks/add_sub_do.inc.php",
		'add_ttask'         => "tasks/add_ttask.inc.php",
		'add_ttask_do'      => "tasks/add_ttask_do.inc.php",
		'add_ttask_sub'     => "tasks/add_ttask_sub.inc.php",
		'add_ttask_sub_do'  => "tasks/add_ttask_sub_do.inc.php",
		'edit'              => "tasks/edit.inc.php",
		'edit_do'           => "tasks/edit_do.inc.php",
		'delete'            => "tasks/delete.inc.php",
		'delete_do'         => "tasks/delete_do.inc.php",
		'change_project'    => "tasks/change_project.inc.php",
		'change_project_do' => "tasks/change_project_do.inc.php",
		'change_parent'     => "tasks/change_parent.inc.php",
		'change_parent_do'  => "tasks/change_parent_do.inc.php",
	),

	// ----- Activités -----
	'activities' => array
	(
		''            => "activities/list.inc.php",
		'readonly'    => "activities/list_readonly.inc.php",
		'list_do'     => "activities/list_do.inc.php",
		'add'         => "activities/add.inc.php",
		'add_do'      => "activities/add_do.inc.php",
		'add_do2'     => "activities/add_do2.inc.php",
		'summary'     => "activities/summary.inc.php",
		'summary_all' => "activities/summary_all.inc.php",
		'task_summary'=> "activities/task_summary.inc.php",
	),

	// ----- Vacances -----
	'holidays' => array
	(
		''          => "holidays/list.inc.php",
		'budget'    => "holidays/budget.inc.php",
		'budget_do' => "holidays/budget_do.inc.php",
	),

	// ----- Profil -----
	'profils' => array
	(
		''                  => "profils/edit.inc.php",
		'edit'              => "profils/edit.inc.php",
		'edit_do'           => "profils/edit_do.inc.php",
	),

	// ----- Recherche -----
	'search' => array
	(
		''                  => "search/list.inc.php",
	),
);

//==============================================================================
// Validation du formulaire
//==============================================================================

// ===== Navigation entre les pages =====

$objFormNavigation = new FormValidation();

$sPageId = $objFormNavigation->getValue('page', $_GET, 'is_string', "home");
$sMode   = $objFormNavigation->getValue('mode', $_GET, 'is_string', "");

//==============================================================================
// Actions du formulaire
//==============================================================================

// ===== Recherche de la page à afficher =====

$sPageName = "error404.inc.php";

if(array_key_exists($sPageId, $aNavigationPageData) == true)
{
	// Il faut être identifié pour voir une page autre que
	// 'no_rights', 'login_do' ou 'home'
	if(($sPageId != 'no_rights') && ($sPageId != 'login_do') && ($sPageId != 'home')
	&& (isset($_SESSION['user_id']) != true))
	{
		$sPageId = 'home';
	}

	$aNavigationModeData = $aNavigationPageData[$sPageId];

	// Y a t'il des modes pour cette page ?
	if(is_array($aNavigationModeData) == true)
	{
		if(array_key_exists($sMode, $aNavigationModeData) == true)
		{
			$sPageName = $aNavigationModeData[$sMode];
		}
	}
	else
	{
		$sPageName = $aNavigationModeData;
	}

	// Le fichier existe ?
	if(is_file(PATH_PAGES."/{$sPageName}") == false)
	{
		$sPageName = "error404.inc.php";
	}
}

//==============================================================================
// Traitement des données
//==============================================================================

//==============================================================================
// Préparation de l'affichage
//==============================================================================

// Récupère le navigateur pour discriminer l'utilisation d'ie
$sAgent = $_SERVER['HTTP_USER_AGENT'];

// ===== Lancer l'install ? =====

// TODO : Enlever le test de l'existence de la colonne dès que l'on enlève la compatibilité avec la v3.2.0

$bNeedInstall = false;

// Si la version présente en BDD est égale ou inférieure à la v3.2.0
// alors la BDD ne contient pas la colonne DATE_VERSION donc on test.

$aTemp = Database::fetchOneRow("SHOW COLUMNS FROM PARAMETRES LIKE 'DATE_VERSION'");
if($aTemp !== false)
{
	$nDateVersion = Database::fetchOneValue("SELECT UNIX_TIMESTAMP(DATE_VERSION) FROM PARAMETRES");
	$nDateFileHome = filemtime(PATH_PAGES."/release_notes.inc.php");

	if($nDateVersion != $nDateFileHome)
	{
		$bNeedInstall = true;
	}
}
else
{
	$bNeedInstall = true;
}

// ===== Mise en forme pour la popup =====

$sGuiBodyCssClass = ($bNeedInstall == true) ? "popup_stop_scroll" : "";

//==============================================================================
// Affichage de la page
//==============================================================================
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
	<title>Gestionnaire de projets</title>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
	<meta name="author" content="Lionel SAURON" />
	<meta name="author" content="Antoine Romain DUMONT" />

	<link rel="stylesheet" type="text/css" href="default.css" media="all" />
	<link rel="stylesheet" type="text/css" href="main.css" media="all" />
	<!--[if gt IE 6]>
	<link rel="stylesheet" type="text/css" href="main-ie.css" media="all" />
	<![endif]-->
	<!--[if lte IE 6]>
	<link rel="stylesheet" type="text/css" href="main-ie6.css" media="all" />
	<![endif]-->

	<script type="text/javascript" src="<?php echo URL_JAVASCRIPT; ?>/dom_extend.lib.js"></script>

	<!-- calendar stylesheet -->
	<link rel="stylesheet" type="text/css" media="all" href="<?php echo URL_JAVASCRIPT; ?>/jscalendar-1.0/calendar-blue2.css" title="calendar-blue2" />
	<!-- main calendar program -->
	<script type="text/javascript" src="<?php echo URL_JAVASCRIPT; ?>/jscalendar-1.0/calendar.js"></script>
	<!-- language for the calendar -->
	<script type="text/javascript" src="<?php echo URL_JAVASCRIPT; ?>/jscalendar-1.0/lang/calendar-en.js"></script>
	<!-- the following script defines the Calendar.setup helper function, which makes adding a calendar a matter of 1 or 2 lines of code. -->
	<script type="text/javascript" src="<?php echo URL_JAVASCRIPT; ?>/jscalendar-1.0/calendar-setup.js"></script>
	<!-- fonctions utilitaires de javascript -->
	<script type="text/javascript" src="<?php echo URL_JAVASCRIPT; ?>/utils.inc.js"></script>

	<script type="text/javascript">
	window.onload = function()
	{
		document.onkeypress = submitFormWithEnter;
	};
	</script>
</head>
<!-- ================================================== -->
<body class="<?php echo($sGuiBodyCssClass); ?>">
	<?php if($bNeedInstall == true): ?>
	<div id="struct_popup_mask"></div>
	<div id="struct_popup">
		<h1>Problème de version</h1>
		<p>Il semblerait que vous soyez en train d'installer une nouvelle version de ProjectSion car les versions de la
		base de données et de l'application ne correspondent pas.</p>
		<p>Afin de pouvoir utiliser cette application, veuillez suivre les indications de l'installeur.<br />
		<a href="install/">Mise à jour de ProjectSion</a></p>
	</div>
	<?php endif; ?>
	<!-- ==================== -->
	<div id="struct_left_panel">
		<div id="struct_identity">
			<?php require_once(PATH_PAGES."/menu/user_identity.inc.php"); ?>
		</div>
		<!-- ==================== -->
		<div id="struct_menu">
			<?php if(isset($_SESSION['user_id']) == true): /* Utilisateur connecté */ ?>
				<?php require_once(PATH_PAGES."/menu/user_menu.inc.php"); ?>
			<?php else:  /* Utilisateur non connecté */ ?>
				<h1>Menu</h1>
				<p>Identification requise</p>
			<?php endif; ?>
		</div>
		<!-- ==================== -->
		<div id="struct_licence">
			<?php require_once(PATH_PAGES."/menu/licence.inc.php"); ?>
		</div>
		<?php if(preg_match("/microsoft internet explorer/i", $sAgent) || preg_match("/msie/i", $sAgent)): ?>
			<div style="text-align:left;color:red;">
				Ce site est optimisé pour Mozilla Firefox ou tout navigateur respectant <a href="http://www.w3c.org/">les standards web</a> (chromium, chrome, epiphany, icecat, konqueror, opera, seamonkey, etc...).<br />
				Votre navigateur étant Microsoft Internet Explorer ou l'une de ses moutures, vous risquez de perdre en ergonomie d'utilisation avec cette application.<br />
			</div>
		<?php endif; ?>
	</div>
	<!-- ==================== -->
	<div id="struct_main" class="<?php echo($sPageId); ?>">
		<?php include(PATH_PAGES."/{$sPageName}"); ?>
	</div>
</body>
</html>
<?php
//==============================================================================
// Cloture de la page
//==============================================================================

// ===== La base de données =====

Database::closeConnection();

// ===== La session =====

// Sauvegarde des erreurs
$_SESSION['ERROR_MESSAGE'] = Message::saveToSession();

session_write_close();

// ===== Bufferisation de sortie =====

ob_end_flush();
?>
Return current item: ProjectSion