Conception BDD (attributs statique) + Modifications mineures

This commit is contained in:
xdrm-brackets 2016-02-03 23:22:18 +01:00
parent c9f9e2ab93
commit c1ebd2894d
45 changed files with 328 additions and 44 deletions

12
conception.sql Normal file
View File

@ -0,0 +1,12 @@
STATIQUES
- un utilisateur
- une machine
- un evenement -> journal
DYNAMIQUES
- options (utilisation des STATIQUES par cle etrangere)
MODELE

6
config/database.json Executable file
View File

@ -0,0 +1,6 @@
{
"host" : "localhost",
"dbname" : "stefproject",
"user" : "php",
"password" : "Qt358nUdyeTxLDM8"
}

11
config/dispatcher-extensions.json Normal file → Executable file
View File

@ -1,7 +1,8 @@
{
"extensions": {
"svg": "image/svg+xml",
"css": "text/css",
"js": "text/js"
}
"svg": "image/svg+xml",
"css": "text/css",
"js": "text/js",
"json": "application/json"
}

16
config/dispatcher-tree.json Normal file → Executable file
View File

@ -1,8 +1,12 @@
{
"parents": {
"st" : "/src/static",
"dy" : "/src/dynamic",
"css" : "/css",
"js" : "/js"
}
"st" : "/src/static",
"dy" : "/src/dynamic",
"conf" : "/config",
"css" : "/css",
"js" : "/js",
"cssview" : "/view/css",
"jsview" : "/view/js"
}

5
config/managers.json Normal file
View File

@ -0,0 +1,5 @@
{
"a" : "/firstManager",
"b" : "/secondManager",
"c" : "/thirdManager"
}

0
css/constants.css Normal file → Executable file
View File

0
css/constants.scss Normal file → Executable file
View File

View File

@ -1,2 +1,2 @@
#WRAPPER>#HEADER>.icon{display:block;position:absolute;top:0;left:0;width:4em;height:4em;background-color:#0082b8;background-image:url("../src/static/icon.svg");background-position:center center;background-repeat:no-repeat;background-size:50% 50%;cursor:pointer;transition:all .3s}#WRAPPER>#HEADER>.icon:hover{background-color:#00709f}#WRAPPER>#HEADER.loading>.icon{background-image:url("../src/static/loader.svg");background-size:70% 70%}
#WRAPPER>#HEADER>.icon{display:block;position:absolute;top:0;left:0;width:4em;height:4em;background-color:#0082b8;background-image:url("/f/svg/icon/st");background-position:center center;background-repeat:no-repeat;background-size:50% 50%;cursor:pointer;transition:all .3s}#WRAPPER>#HEADER>.icon:hover{background-color:#00709f}#WRAPPER>#HEADER.loading>.icon{background-image:url("/f/svg/loader/st");background-size:70% 70%}
/*# sourceMappingURL=header.css.map */

View File

@ -12,7 +12,7 @@
height: 4em;
background-color: darken($theme-color, 10);
background-image: url('../src/static/icon.svg');
background-image: url('/f/svg/icon/st');
background-position: center center;
background-repeat: no-repeat;
background-size: 50% 50%;
@ -30,7 +30,7 @@
/* Animation de chargement qudnd chargement ajax */
&.loading > .icon{
background-image: url('../src/static/loader.svg');
background-image: url('/f/svg/loader/st');
background-size: 70% 70%;
}

0
css/menu-side.css Normal file → Executable file
View File

0
css/submenu-side.css Normal file → Executable file
View File

0
css/submenu-side.scss Normal file → Executable file
View File

24
index.php Normal file → Executable file
View File

@ -1,5 +1,5 @@
<?php define('__ROOT__', dirname(__FILE__) );
require_once 'manager/autoloader.php';
require_once __ROOT__.'/manager/autoloader.php';
/*******************************************/
/* DEBUGGER */
@ -22,23 +22,25 @@
// nomPage/arg1/arg2 -> inclusion de la page
$R->get('dashboard(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
$R->get('profile(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
$R->get('machines(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
$R->get('users(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
$R->get('analytics(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
$R->get('settings(?:/[\w-]+)*/?', function(){ include __ROOT__.'/view.php'; });
// nomPage -> nomPage/
$R->get('dashboard', function(){ header('Location: /dashboard/'); });
$R->get('machines', function(){ header('Location: /machines/'); });
$R->get('users', function(){ header('Location: /users/'); });
$R->get('analytics', function(){ header('Location: /analytics/'); });
$R->get('settings', function(){ header('Location: /settings/'); });
$R->get('dashboard', function(){ header('Location: /dashboard/'); });
$R->get('profile', function(){ header('Location: /profile/'); });
$R->get('machines', function(){ header('Location: /machines/'); });
$R->get('users', function(){ header('Location: /users/'); });
$R->get('analytics', function(){ header('Location: /analytics/'); });
$R->get('settings', function(){ header('Location: /settings/'); });
$R->get('dashboard/', function(){ include __ROOT__.'/view.php'; });
$R->get('machines/', function(){ include __ROOT__.'/view.php'; });
$R->get('users/', function(){ include __ROOT__.'/view.php'; });
$R->get('analytics/', function(){ include __ROOT__.'/view.php'; });
$R->get('settings/', function(){ include __ROOT__.'/view.php'; });
// $R->get('dashboard/', function(){ include __ROOT__.'/view.php'; });
// $R->get('machines/', function(){ include __ROOT__.'/view.php'; });
// $R->get('users/', function(){ include __ROOT__.'/view.php'; });
// $R->get('analytics/', function(){ include __ROOT__.'/view.php'; });
// $R->get('settings/', function(){ include __ROOT__.'/view.php'; });
// Dispatcher
$R->get('f(?:/([\w-]+))*/?', function(){ new manager\ResourcesDispatcher($_GET['url']); });

4
js/lib/page-manager.js Normal file → Executable file
View File

@ -22,8 +22,8 @@ pageManagerClass.prototype = {
page: null, // l'indice de la page courante dans pagelist
vars: [], // les variables suivant le nom de la page dans l'URL
path: '', // le chemin du dossier contenant les pages (.php)
jsPath: 'js', // le chemin du dossier contenant les scripts (.js)
cssPath: 'css', // le chemin du dossier contenant les feuilles de style (.css)
jsPath: '/f/jsview/', // le chemin du dossier contenant les scripts (.js)
cssPath: '/f/cssview/', // le chemin du dossier contenant les feuilles de style (.css)
pagelist: null, // la liste des pages pouvant être chargées
container: null, // élément DOM qui contiendra le contenu des pages à charger
/* =======================================================================

0
js/lib/reset.js Normal file → Executable file
View File

104
manager/Database.php Executable file
View File

@ -0,0 +1,104 @@
<?php
namespace manager;
class DataBase{
/* ATTRIBUTS */
private $host;
private $dbname;
private $username;
private $password;
private static $pdo;
private static $instance;
public function __construct($host, $dbname, $username, $password){
$this->host = $host;
$this->dbname = $dbname;
$this->username = $username;
$this->password = $password;
// password: Qt358nUdyeTxLDM8
self::$pdo = new \PDO('mysql:host='.$host.';dbname='.$dbname, $username, $password);
}
/* retourne une instance de la classe */
public static function getInstance(){
if( self::$instance == null ){
// chargement de la configuration du server SQL
$conf = json_decode(file_get_contents('http://'.$_SERVER['HTTP_HOST'].'/f/json/database/conf'), true);
self::$instance = new DataBase($conf['host'], $conf['dbname'], $conf['user'], $conf['password']);
}
return self::$instance;
}
/* retourne la connection statique */
public static function getPDO(){
$instance = self::getInstance();
return self::$pdo;
}
/*************************************************************/
/* _____ ______ _ _ ______ _____ _ */
/* / ____| ____| \ | | ____| __ \ /\ | | */
/* | | __| |__ | \| | |__ | |__) | / \ | | */
/* | | |_ | __| | . ` | __| | _ / / /\ \ | | */
/* | |__| | |____| |\ | |____| | \ \ / ____ \| |____ */
/* \_____|______|_| \_|______|_| \_\/_/ \_\______| */
/* */
/*************************************************************/
/* SUPPRIME LES VALEURS À CLÉS NUMÉRIQUES DANS UN FETCH D'UNE TABLE DE LA BDD
*
* @fetchData<Array> le résultat d'une $requeteSQL->fetchAll()
*
* @return newFetchData<Array> retourne le tableau donné en paramètre mais sans les valeurs à clés numériques
*
*/
public static function delNumeric($fetchData, $oneDimension=false){
/* [1] 2 dimensions
===============================================*/
if( !$oneDimension ){
// on supprime les doublons des entrées (indice numérique)
for( $i = 0 ; $i < count($fetchData) ; $i++ ) // pour tout les utilisateurs
foreach($fetchData[$i] as $col => $val){ // pour toutes les entrées
if( !mb_detect_encoding($val, 'UTF-8') )
$fetchData[$i][$col] = utf8_encode($val);
if( is_int($col) ) // si l'indice est un entier
unset( $fetchData[$i][$col] ); // on le supprime
}
/* [2] 1 dimensions
===============================================*/
}else{
// on supprime les doublons des entrées (indice numérique)
foreach($fetchData as $i=>$val){ // pour toutes les entrées
if( !mb_detect_encoding($val, 'UTF-8') )
$fetchData[$i] = utf8_encode($val);
if( is_int($i) ) // si l'indice est un entier
unset( $fetchData[$i] ); // on le supprime
}
}
return $fetchData;
}
}
?>

View File

@ -31,11 +31,11 @@
/* [0] On met a jour la configuration
=====================================================*/
// Extensions supportees
$extensions_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$extension_config_path), true )['extensions'];
$extensions_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$extension_config_path), true );
self::$supported_extensions = $extensions_conf;
// Dossiers supportes
$parents_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$parents_config_path), true )['parents'];
$parents_conf = json_decode( file_get_contents('http://'.$_SERVER['HTTP_HOST'].self::$parents_config_path), true );
self::$supported_parents = $parents_conf;

4
manager/autoloader.php Normal file → Executable file
View File

@ -1,6 +1,6 @@
<?php
function autoLoader($className){
function autoloader($className){
$path = '';
/* [1] On utilise le namespace pour localiser
@ -15,7 +15,7 @@
}
// On definit l'autoloader
spl_autoload_register('autoLoader', false, true);
spl_autoload_register('autoloader', false, true);
?>

0
router/Route.php Normal file → Executable file
View File

0
router/Router.php Normal file → Executable file
View File

0
src/dynamic/create.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

0
src/dynamic/edit.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 311 B

0
src/dynamic/filter.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
src/dynamic/remove.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 254 B

After

Width:  |  Height:  |  Size: 254 B

0
src/dynamic/search.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
src/static/loader.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 709 B

0
src/static/menu-side/users2.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

0
src/static/sub-menu-side/analytics.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

0
src/static/sub-menu-side/create.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

0
src/static/sub-menu-side/edit.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

0
src/static/sub-menu-side/filter.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
enable-background="new 0 0 44 43"
height="32"
id="Layer_1"
version="1.1"
viewBox="0 0 32 32"
width="32"
xml:space="preserve"
inkscape:version="0.48.4 r9939"
sodipodi:docname="1454540685_key.svg"><metadata
id="metadata9"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs7" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1056"
id="namedview5"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-page="true"
inkscape:zoom="5.4883721"
inkscape:cx="-7.6149683"
inkscape:cy="21.645"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><path
d="M 21.920296,15.883621 C 23.266261,12.043768 22.689733,6.9789776 19.40367,3.6929146 14.963084,-0.74693744 7.7843571,-0.76674144 3.3452383,3.6731146 -1.0953476,8.1129666 -1.1246875,15.341571 3.3151653,19.781424 c 3.3850849,3.385085 8.1916847,4.360634 12.4885057,2.43374 l 2.128606,2.128606 0.07995,0.07995 2.995598,-0.523716 -0.0132,3.132762 3.112957,0.0059 -0.39022,3.090219 1.548411,1.548411 c 0.0044,0.0044 0.0044,0.0044 0.0073,0.0073 l 0.115159,-0.114426 c 0.54352,0.493643 0.369682,0.26846 0.4511,0.26846 l 5.334018,0.161369 c 0.440098,0 0.825917,-0.324939 0.82665,-0.76577 l -0.207579,-5.378727 c 0,-0.08215 0.239853,0.10709 -0.25379,-0.437164 l -0.04254,0.04328 c -0.0022,-0.0029 -0.0022,-0.0022 -0.0044,-0.0051 L 21.920296,15.883621 z M 9.6173641,10.403671 c -1.1464545,1.146455 -3.0036669,1.146455 -4.1493879,0 -1.145721,-1.1464544 -1.1464545,-3.0029324 0,-4.1493874 1.1464545,-1.146454 3.0036669,-1.146454 4.1493879,0 1.1457209,1.146455 1.1464549,3.003667 0,4.1493874 z"
id="path3"
inkscape:connector-curvature="0"
style="fill:#231f20" /></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

0
src/static/sub-menu-side/remove.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

0
src/static/sub-menu-side/search.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

0
src/static/sub-menu-side/sync.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

0
src/static/sub-menu-side/view.svg Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

13
todo.md Normal file → Executable file
View File

@ -4,16 +4,27 @@
- [ ] Dev des managers et de l'API et liste des acces
- [ ] Creation de la base des managers et de l'API
- [ ] Conception des managers et de l'API
- [ ] Conception BDD + ameliorations
- [ ] Definir graphiquement le #CONTAINER
- [ ] Structure
- [ ] Elements
- [ ] Affichages
- [ ] Styles globaux
############
# EN COURS #
############
- [x] Conception BDD + ameliorations
- [x] Liste des tables
- [x] Liste de attributs
- [ ] Attributs statiques
- utilisateur (id, )
- machine
- journal
- [ ] Attributs dynamiques
- les options
- les addons des attributs statiques
- [ ] Ameliorations et genericite possibles
########

View File

@ -10,20 +10,20 @@
<meta name='desctiption' content="Système de gestion des véhicules pour STEF.">
<!-- Dépendences CSS -->
<link type='text/css' rel='stylesheet' href='/css/reset.css' /> <!-- Reset du css natif des browsers -->
<link type='text/css' rel='stylesheet' href='/css/font.css' /> <!-- Positionnement global des pages -->
<link type='text/css' rel='stylesheet' href='/css/layout.css' /> <!-- Positionnement global des pages -->
<link type='text/css' rel='stylesheet' href='/css/header.css' /> <!-- Gestion du header -->
<link type='text/css' rel='stylesheet' href='/css/menu-side.css' /> <!-- Gestion du menu -->
<link type='text/css' rel='stylesheet' href='/css/submenu-side.css'/> <!-- Gestion du sous-menu -->
<link type='text/css' rel='stylesheet' href='/css/container.css' /> <!-- Gestion du container -->
<link type='text/css' rel='stylesheet' href='/css/global.css' /> <!-- Style global -->
<link type='text/css' rel='stylesheet' href='/f/css/reset/css' /> <!-- Reset du css natif des browsers -->
<link type='text/css' rel='stylesheet' href='/f/css/font/css' /> <!-- Positionnement global des pages -->
<link type='text/css' rel='stylesheet' href='/f/css/layout/css' /> <!-- Positionnement global des pages -->
<link type='text/css' rel='stylesheet' href='/f/css/header/css' /> <!-- Gestion du header -->
<link type='text/css' rel='stylesheet' href='/f/css/menu-side/css' /> <!-- Gestion du menu -->
<link type='text/css' rel='stylesheet' href='/f/css/submenu-side/css'/> <!-- Gestion du sous-menu -->
<link type='text/css' rel='stylesheet' href='/f/css/container/css' /> <!-- Gestion du container -->
<link type='text/css' rel='stylesheet' href='/f/css/global/css' /> <!-- Style global -->
<!-- Dépendences Javascript -->
<script type='text/javascript' src='/js/lib/reset.js' ></script> <!-- Corrections Javascript natif (ajouts) -->
<script type='text/javascript' src='/f/js/reset/js/lib' ></script> <!-- Corrections Javascript natif (ajouts) -->
<!-- <script type='text/javascript' src='/js/lib/API.js' ></script> Gestion des dialogues client/serveur -->
<script type='text/javascript' src='/js/lib/page-manager.js' ></script> <!-- Gestion réseau/chargement/liens/URL -->
<script type='text/javascript' src='/f/js/page-manager/js/lib' ></script> <!-- Gestion réseau/chargement/liens/URL -->
<!-- <script type='text/javascript' src='/js/lib/shortcut-manager.js' ></script> Gestion des raccourcis clavier -->
</head>
@ -42,7 +42,7 @@
<!-- MENU DE LA PAGE -->
<nav id='MENU-SIDE'>
<span data-link='profile' data-desc='Profil' class='mb' ><?php echo file_get_contents( 'http://'.$_SERVER['HTTP_HOST'].'/f/svg/menu-dashboard/st/menu-side' ); ?></span>
<span data-link='profile' data-desc='Profil' class='mb' ><?php echo file_get_contents( 'http://'.$_SERVER['HTTP_HOST'].'/f/svg/menu-dashboard/st/menu-side' ); ?></span>
<span data-link='dashboard' data-desc='Tableau de bord' class='apart' ><?php echo file_get_contents( 'http://'.$_SERVER['HTTP_HOST'].'/f/svg/menu-dashboard/st/menu-side' ); ?></span>
@ -62,7 +62,7 @@
<!-- Dépendences Javascript après chargement des éléments -->
<script type='text/javascript' src='/js/action-script.js'></script>
<script type='text/javascript' src='/f/js/action-script/js'></script>
</body>
</html>

6
view/analytics.php Normal file → Executable file
View File

@ -1,3 +1,8 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>
@ -42,6 +47,7 @@
echo '<section>';
echo 'Statistiques';
var_dump( manager\Database::getPDO()->query('SELECT * from user')->fetchAll() );
echo '</section>';
}

4
view/dashboard.php Normal file → Executable file
View File

@ -1,3 +1,7 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>

0
view/js/analytics.js Executable file
View File

4
view/machines.php Normal file → Executable file
View File

@ -1,3 +1,7 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>

67
view/profile.php Normal file
View File

@ -0,0 +1,67 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>
<span data-sublink='view'>
<span class='svg'><?php echo file_get_contents( 'http://'.$_SERVER['HTTP_HOST'].'/f/svg/view/st/sub-menu-side'); ?></span>
<span>Mon Profil</span>
</span>
<span data-sublink='password'>
<span class='svg'><?php echo file_get_contents( 'http://'.$_SERVER['HTTP_HOST'].'/f/svg/password/st/sub-menu-side'); ?></span>
<span>Mot de passe</span>
</span>
</nav>
<?php
$post = array();
foreach($_POST as $k=>$v)
array_push($post, $k);
$sublink = $post[0];
/* MON PROFIL
*
*/
if( $sublink == 'view' ){
echo '<section>';
echo 'Profil';
echo '</section>';
}
/* CHANGER MOT DE PASSE
*
*/
if( $sublink == 'password' ){
echo '<section>';
echo 'Changement de mot de passe';
echo '</section>';
}
?>

4
view/settings.php Normal file → Executable file
View File

@ -1,3 +1,7 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>

4
view/users.php Normal file → Executable file
View File

@ -1,3 +1,7 @@
<?php define('__ROOT__', dirname(dirname(__FILE__)) );
require_once __ROOT__.'/manager/autoloader.php';
?>
<!-- [1] Gestion du sous-menu de gauche -->
<nav class='sub-menu-side'>