2014-01-23 23:48:59 +01:00
< ? php
2014-01-24 18:07:59 +01:00
session_start ();
2014-01-24 01:02:21 +01:00
date_default_timezone_set ( " Europe/Paris " );
2014-01-24 18:07:59 +01:00
2014-01-24 01:02:21 +01:00
function search ( $array ) {
global $_POST ;
return in_array ( $_POST [ 'start_search' ], $array ) && in_array ( $_POST [ 'end_search' ], $array );
}
2014-01-23 23:48:59 +01:00
if ( is_file ( 'data/data' )) {
$data = unserialize ( gzinflate ( base64_decode ( file_get_contents ( 'data/data' ))));
}
else {
$data = array ();
}
2014-01-24 18:07:59 +01:00
if ( ! empty ( $_GET [ 'suppr' ]) && ! empty ( $_SESSION [ 'admin' ])) {
unlink ( $data [ $_GET [ 'suppr' ]]);
}
if ( ! empty ( $_GET [ 'deco' ])) {
session_destroy ();
}
if ( is_file ( 'data/config' )) {
$config = unserialize ( gzinflate ( base64_decode ( file_get_contents ( 'data/config' ))));
if ( ! empty ( $_GET [ 'code' ]) && $_GET [ 'code' ] == $config [ 0 ]) {
$_SESSION [ 'admin' ] = true ;
}
}
2014-01-24 01:02:21 +01:00
$search = false ;
if ( ! empty ( $_POST [ 'start_search' ]) && ! empty ( $_POST [ 'end_search' ])) {
$search = true ;
$data = array_filter ( $data , " search " );
}
2014-01-23 23:48:59 +01:00
if (( ! empty ( $_POST [ 'time_min' ]) || ! empty ( $_POST [ 'time_sec' ])) && ! empty ( $_POST [ 'start' ]) && ! empty ( $_POST [ 'end' ])) {
$min = ( ! empty ( $_POST [ 'time_min' ])) ? ( int ) $_POST [ 'time_min' ] : 0 ;
$sec = ( ! empty ( $_POST [ 'time_sec' ])) ? ( int ) $_POST [ 'time_sec' ] : 0 ;
2014-01-24 01:02:21 +01:00
$pseudo = ( ! empty ( $_POST [ 'pseudo' ])) ? $_POST [ 'pseudo' ] : " Anonyme " ;
2014-01-23 23:48:59 +01:00
2014-01-24 01:02:21 +01:00
$data [] = array ( " date " => time (), " start " => ( int ) $_POST [ 'start' ], " end " => ( int ) $_POST [ 'end' ], " min " => $min , " sec " => $sec , " pseudo " => $pseudo );
2014-01-23 23:48:59 +01:00
2014-01-24 01:02:21 +01:00
// TODO : Upload + taille max de l'upload
2014-01-23 23:48:59 +01:00
2014-01-24 01:02:21 +01:00
if ( count ( $data ) == 1 || $min != $data [ count ( $data ) - 2 ][ 'min' ] || $sec != $data [ count ( $data ) - 2 ][ 'sec' ] || $_POST [ 'start' ] != $data [ count ( $data ) - 2 ][ 'start' ] || $_POST [ 'end' ] != $data [ count ( $data ) - 2 ][ 'end' ] || $pseudo != $data [ count ( $data ) - 2 ][ 'pseudo' ]) {
2014-01-23 23:48:59 +01:00
file_put_contents ( 'data/data' , base64_encode ( gzdeflate ( serialize ( $data ))));
}
}
?>
<! DOCTYPE html >
< html lang = " fr " >
< head >
< meta charset = " utf-8 " >
2014-01-24 18:07:59 +01:00
< title > DéfiVélib </ title >
2014-01-23 23:48:59 +01:00
< meta name = " author " content = " phyks " >
2014-01-24 18:30:05 +01:00
< style type = " text/css " media = " screen " >
html , body {
margin : 0 ;
padding : 0 ;
width : 100 % ;
height : 100 % ;
font - family : sans - serif ;
background - color : lightgrey ;
background - image : url ( data : image / png ; base64 , iVBORw0KGgoAAAANSUhEUgAAAIQAAACECAYAAABRRIOnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1 +/ AAAABV0RVh0Q3JlYXRpb24gVGltZQAzLzEyLzEzP / y5FwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAACAASURBVHicbd1pkiPHkQVgR2KHURyJWu5 / Fx1Ao6E1W7pCoTagYNiBnB / FL + oh2WVGY1cByIzw9flzz8Don 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
}
#main {
width : 50 % ;
min - height : 50 % ;
margin : auto ;
background - color : white ;
text - align : center ;
padding : 1 em ;
- moz - box - sizing : border - box ; - webkit - box - sizing : border - box ; box - sizing : border - box ;
}
#main h1 {
margin : 0 ;
border : 1 px solid black ;
background - color : rgb ( 117 , 170 , 39 );
}
#main h2 {
text - align : left ;
}
#main h1 a {
color : black ;
text - decoration : none ;
font - size : 1.5 em ;
}
table td , th {
padding : 0.5 em ;
border : 1 px solid black ;
}
table th {
background - color : rgba ( 117 , 170 , 39 , 0.4 );
}
table {
border - collapse : collapse ;
margin : auto ;
}
fieldset {
background - color : rgba ( 17 , 78 , 121 , 0.1 );
}
</ style >
2014-01-23 23:48:59 +01:00
</ head >
< body >
< div id = " main " >
< h1 >< a href = " index.php " > DéfiVélib </ a ></ h1 >
< ? php
if ( ! is_dir ( 'data/' )) {
mkdir ( 'data/' );
}
if ( ! is_file ( 'data/config' )) //First run
{
//Define a new synchronisation code
$code_synchro = substr ( sha1 ( rand ( 0 , 30 ) . time () . rand ( 0 , 30 )), 0 , 10 );
file_put_contents ( 'data/config' , base64_encode ( gzdeflate ( serialize ( array ( $code_synchro ))))); //Save it in data/data file
$_GET [ 'code' ] = $code_synchro ;
echo " <p>
Définition du code de synchronisation .< br />
Vous pouvez désormais mettre à jour la liste des stations en visitant l ' adresse suivante ( update URL ) :< br />
< a href = 'http://" . $_SERVER["SERVER_NAME"].$_SERVER[' REQUEST_URI ']."?update=1&code=".$code_synchro."' > http :// " . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'] . " ? update = 1 & code = " . $code_synchro . " </ a >
</ p >
< p >
Il est possible d ' automatiser la tâche via une tâche cron . Par exemple ( see README ) :< br />
* * * * * wget - q - O < a href = 'http://" . $_SERVER["SERVER_NAME"].$_SERVER[' REQUEST_URI ']."?update=1&code=".$code_synchro."' > http :// " . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'] . " ? update = 1 & code = " . $code_synchro . " </ a > #Commande de mise a jour des stations de velib
</ p > " ;
}
if ( ! empty ( $_GET [ 'update' ]) || ! empty ( $code_synchro )) //If we want to make an update (or first run)
{
if ( empty ( $code_synchro ) && is_file ( 'data/config' )) //If not first run, get the synchronisation code from data file
{
$data = unserialize ( gzinflate ( base64_decode ( file_get_contents ( 'data/config' ))));
$code_synchro = $data [ 0 ];
}
if ( ! empty ( $_GET [ 'code' ]) && $_GET [ 'code' ] == $code_synchro ) //Once we have the code and it is correct
{
$stations_xml = simplexml_load_file ( 'http://www.velib.paris.fr/service/carto' );
$liste_stations = array ();
foreach ( $stations_xml -> markers -> marker as $station ) {
$liste_stations [( int ) $station [ 'number' ]] = array ( 'name' => ( string ) $station [ 'name' ], 'address' => ( string ) $station [ 'fullAddress' ], 'lat' => ( float ) $station [ 'lat' ], 'lng' => ( float ) $station [ 'lng' ]);
}
file_put_contents ( 'data/stations' , base64_encode ( gzdeflate ( serialize ( $liste_stations ))));
echo " <p>Mise à jour de la liste des stations effectuée avec succès (Update successful).</p> " ;
}
else
{
echo " <p>Mauvais code de vérification (Error : bad synchronisation code). Veuillez réessayer la mise à jour. Se référer au README pour plus d'informations sur la mise à jour.</p> " ;
}
echo " <p><a href='index.php'>Retourner à l'application (Back to index)</a></p></body></html> " ;
exit ();
}
$liste_stations = unserialize ( gzinflate ( base64_decode ( file_get_contents ( 'data/stations' ))));
?>
< h2 > Ajouter un trajet </ h2 >
2014-01-24 18:30:05 +01:00
< form method = " post " action = " index.php " > <!-- enctype = " multipart/form-data " -->
< fieldset >
< legend > Trajet </ legend >
2014-01-23 23:48:59 +01:00
< p >< label name = " start " > Station de départ : </ label >
2014-01-24 01:02:21 +01:00
< select name = " start " id = " start " >
2014-01-23 23:48:59 +01:00
< ? php
foreach ( $liste_stations as $key => $station ) {
echo " <option value= \" " . $key . " \" > " . $station [ 'name' ] . " </option> " ;
}
?>
</ select >
</ p >
< p >< label for = " end " > Station d ' arrivée : </ label >
2014-01-24 01:02:21 +01:00
< select name = " end " id = " end " >
2014-01-23 23:48:59 +01:00
< ? php
foreach ( $liste_stations as $key => $station ) {
echo " <option value= \" " . $key . " \" > " . $station [ 'name' ] . " </option> " ;
}
?>
</ select >
</ p >
< p >< label for = " time_min " > Durée du trajet : </ label >< input type = " int " name = " time_min " id = " time_min " size = " 2 " /> min < input type = " int " name = " time_sec " id = " time_sec " size = " 2 " /> s </ p >
2014-01-24 18:30:05 +01:00
</ fieldset >
< fieldset >
< legend > Informations </ legend >
2014-01-24 01:02:21 +01:00
< p >< label for = " pseudo " > Votre pseudo ( optionnel ) : </ label >< input type = " text " name = " pseudo " id = " pseudo " /></ p >
2014-01-24 18:30:05 +01:00
<!-- < p >< label for = " photo " > Photo du ticket ( ? max ) : </ label >< input type = " file " name = " photo " id = " photo " ></ p >-->
</ fieldset >
2014-01-24 01:02:21 +01:00
< p >
< input type = " submit " value = " Envoyer " >
2014-01-24 18:30:05 +01:00
<!-- < input type = " hidden " name = " MAX_FILE_SIZE " value = " 2097152 " >-->
2014-01-24 01:02:21 +01:00
</ p >
2014-01-23 23:48:59 +01:00
</ form >
2014-01-24 01:02:21 +01:00
< h2 >< ? php if ( $search ) { ?> Résultats<?php } else {?>Derniers trajets ajoutés<?php }?></h2>
2014-01-23 23:48:59 +01:00
< ? php
if ( ! empty ( $data )) {
?>
< table >
< tr >
2014-01-24 01:02:21 +01:00
< th > Date </ th >
2014-01-23 23:48:59 +01:00
< th > Départ </ th >
< th > Arrivée </ th >
< th > Temps </ th >
2014-01-24 01:02:21 +01:00
< th > Pseudo </ th >
2014-01-24 18:07:59 +01:00
< ? php
if ( ! empty ( $_SESSION [ 'admin' ])) {
?>
< th > Supprimer </ th >
< ? php
}
?>
2014-01-23 23:48:59 +01:00
</ tr >
< ? php
2014-01-24 01:02:21 +01:00
if ( $search ) {
$min = array ();
$sec = array ();
foreach ( $data as $key => $result ) {
$min [ $key ] = $result [ 'min' ];
$sec [ $key ] = $result [ 'sec' ];
}
array_multisort ( $min , SORT_DESC , $sec , SORT_DESC , $data );
2014-01-24 18:07:59 +01:00
foreach ( $data as $key => $result ) {
if ( ! empty ( $_SESSION [ 'admin' ])) {
$delete = " <td><a href= \" ?suppr= " . $key . " \" >Supprimer</a></td> " ;
}
else {
$delete = " " ;
}
echo " <tr><td> " . date ( 'd/m/Y à H:i' , $result [ 'date' ]) . " </td><td> " . htmlspecialchars ( $liste_stations [ $result [ 'start' ]][ 'name' ]) . " </td><td> " . htmlspecialchars ( $liste_stations [ $result [ 'end' ]][ 'name' ]) . " </td><td> " . ( int ) $result [ 'min' ] . " min " . ( int ) $result [ 'sec' ] . " s</td><td> " . htmlspecialchars ( $result [ 'pseudo' ]) . " </td> " . $delete . " </tr> " ;
2014-01-24 01:02:21 +01:00
}
}
else {
for ( $i = count ( $data ) - 1 ; $i >= max ( count ( $data ) - 10 , 0 ); $i -- ) {
2014-01-24 18:07:59 +01:00
if ( ! empty ( $_SESSION [ 'admin' ])) {
$delete = " <td><a href= \" ?suppr= " . $i . " \" >Supprimer</a></td> " ;
}
else {
$delete = " " ;
}
echo " <tr><td> " . date ( 'd/m/Y à H:i' , $data [ $i ][ 'date' ]) . " </td><td> " . htmlspecialchars ( $liste_stations [ $data [ $i ][ 'start' ]][ 'name' ]) . " </td><td> " . htmlspecialchars ( $liste_stations [ $data [ $i ][ 'end' ]][ 'name' ]) . " </td><td> " . ( int ) $data [ $i ][ 'min' ] . " min " . ( int ) $data [ $i ][ 'sec' ] . " s</td><td> " . htmlspecialchars ( $data [ $i ][ 'pseudo' ]) . " </td> " . $delete . " </tr> " ;
2014-01-24 01:02:21 +01:00
}
2014-01-23 23:48:59 +01:00
}
?>
</ table >
< ? php
}
else {
?>
< p > Aucun trajet enregistré .</ p >
< ? php
}
?>
2014-01-24 01:02:21 +01:00
< h2 > Recherche de trajets </ h2 >
< form method = " post " action = " index.php " >
2014-01-24 18:30:05 +01:00
< fieldset >
2014-01-24 01:02:21 +01:00
< p >< label name = " start_search " > Station de départ : </ label >
< select name = " start_search " id = " start_search " >
< ? php
foreach ( $liste_stations as $key => $station ) {
2014-01-24 18:07:59 +01:00
if ( ! empty ( $_POST [ 'start_search' ]) && $_POST [ 'start_search' ] == $key )
$selected = " selected " ;
else
$selected = " " ;
echo " <option value= \" " . $key . " \" " . $selected . " > " . $station [ 'name' ] . " </option> " ;
2014-01-24 01:02:21 +01:00
}
?>
</ select >
</ p >
< p >< label for = " end_search " > Station d ' arrivée : </ label >
< select name = " end_search " id = " end_search " >
< ? php
foreach ( $liste_stations as $key => $station ) {
2014-01-24 18:07:59 +01:00
if ( ! empty ( $_POST [ 'end_search' ]) && $_POST [ 'end_search' ] == $key )
$selected = " selected " ;
else
$selected = " " ;
echo " <option value= \" " . $key . " \" " . $selected . " > " . $station [ 'name' ] . " </option> " ;
2014-01-24 01:02:21 +01:00
}
?>
</ select >
</ p >
2014-01-24 18:30:05 +01:00
</ fieldset >
2014-01-24 01:02:21 +01:00
< p >
< input type = " submit " value = " Rechercher " >
</ p >
</ form >
2014-01-24 18:07:59 +01:00
< ? php
if ( ! empty ( $_SESSION [ 'admin' ])) {
?>
< p >< a href = " ?deco=1 " > Déconnexion </ a ></ p >
< ? php
}
?>
2014-01-23 23:48:59 +01:00
</ div >
</ body >
</ html >