View added + db management of each course + now GMT managed directly in scale for reading image
This commit is contained in:
parent
9fb8327c24
commit
c5ae428db4
|
@ -3,6 +3,7 @@
|
||||||
namespace router\controller;
|
namespace router\controller;
|
||||||
|
|
||||||
use \database\core\DatabaseDriver;
|
use \database\core\DatabaseDriver;
|
||||||
|
use \service\CalendarExtractor as CE;
|
||||||
|
|
||||||
|
|
||||||
class ics{
|
class ics{
|
||||||
|
@ -49,6 +50,152 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function view(){
|
||||||
|
|
||||||
|
/* [1] Get periods
|
||||||
|
=========================================================*/ {
|
||||||
|
|
||||||
|
/* (1) Get the list of available periods */
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->query("SELECT * from period");
|
||||||
|
$periods = $sqlr->fetchAll();
|
||||||
|
|
||||||
|
/* (2) Manage error */
|
||||||
|
if( !$periods )
|
||||||
|
die("Error cannot get config");
|
||||||
|
|
||||||
|
/* (3) Begin html */
|
||||||
|
echo "<head>";
|
||||||
|
echo " <title>ICS UPPA university</title>";
|
||||||
|
echo " <meta name='author' content='xdrm-brackets (Adrien Marquès)'>";
|
||||||
|
echo " <link type='text/css' rel='stylesheet' href='/css/layout.css' />";
|
||||||
|
echo "</head>";
|
||||||
|
echo "<body>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* [2] For each period (week)
|
||||||
|
=========================================================*/ {
|
||||||
|
|
||||||
|
echo "<div class='null'>";
|
||||||
|
|
||||||
|
$cal_height = 54; // in css:vw
|
||||||
|
|
||||||
|
foreach($periods as $period){
|
||||||
|
|
||||||
|
echo "</div><div class='period'>";
|
||||||
|
|
||||||
|
/* (1) Display week number */
|
||||||
|
$days = [
|
||||||
|
date('Y-m-d', strtotime($period['monday'].' + 0 days')),
|
||||||
|
date('Y-m-d', strtotime($period['monday'].' + 1 days')),
|
||||||
|
date('Y-m-d', strtotime($period['monday'].' + 2 days')),
|
||||||
|
date('Y-m-d', strtotime($period['monday'].' + 3 days')),
|
||||||
|
date('Y-m-d', strtotime($period['monday'].' + 4 days'))
|
||||||
|
];
|
||||||
|
echo "<div class='title'>Week from ${days[0]} to ${days[4]}</div>";
|
||||||
|
|
||||||
|
echo "<div class='null'>";
|
||||||
|
|
||||||
|
/* (2) For each day */
|
||||||
|
foreach($days as $day_n=>$day){
|
||||||
|
|
||||||
|
/* (2.1) Display day grid */
|
||||||
|
echo "</div><div class='day d$day_n'>";
|
||||||
|
|
||||||
|
/* (2.2) Get available courses */
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT
|
||||||
|
DATE_FORMAT(c.start_date, '%H:%i') as startd,
|
||||||
|
DATE_FORMAT(c.stop_date, '%H:%i') as stopd,
|
||||||
|
l.basename as lbname,
|
||||||
|
l.name as lname,
|
||||||
|
e.basename as ebname,
|
||||||
|
e.name as ename,
|
||||||
|
e.color as color
|
||||||
|
FROM event as e, location as l, course as c
|
||||||
|
WHERE e.id_diplome = :idd
|
||||||
|
AND c.id_event = e.id_event
|
||||||
|
AND c.id_location = l.id_location
|
||||||
|
AND DATE_FORMAT(c.start_date, '%Y-%m-%d') = :day
|
||||||
|
ORDER BY startd ASC");
|
||||||
|
$sqlr->execute([
|
||||||
|
':idd' => $this->diplome_id,
|
||||||
|
':day' => $day
|
||||||
|
]);
|
||||||
|
$courses = $sqlr->fetchAll();
|
||||||
|
|
||||||
|
/* (2.3) Manage error */
|
||||||
|
if( !$courses )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* (2.4) For each course */
|
||||||
|
foreach($courses as $course){
|
||||||
|
|
||||||
|
$start_hour = 0;
|
||||||
|
$stop_hour = 0;
|
||||||
|
|
||||||
|
/* (2.4.1) Extract time in hour */
|
||||||
|
if( preg_match('@^(\d+):(\d+)$@', $course['startd'], $m) )
|
||||||
|
$start_hour = $m[1] + $m[2]/60;
|
||||||
|
|
||||||
|
if( preg_match('@^(\d+):(\d+)$@', $course['stopd'], $m) )
|
||||||
|
$stop_hour = $m[1] + $m[2]/60;
|
||||||
|
|
||||||
|
/* (2.4.2) Calc positionning */
|
||||||
|
$top = ($start_hour-CE::$start_h) * $cal_height / (CE::$stop_h-CE::$start_h);
|
||||||
|
$height = ($stop_hour-CE::$start_h) * $cal_height / (CE::$stop_h-CE::$start_h) - $top;
|
||||||
|
$color = $course['color'];
|
||||||
|
|
||||||
|
/* (2.4.3) Position <div> according to hours */
|
||||||
|
echo "<div class='course' style='top: ${top}vw; height: ${height}vw; background-color: $color;'>";
|
||||||
|
|
||||||
|
echo "<div class='start'>".$course['startd']."</div>";
|
||||||
|
echo "<div class='stop'>".$course['stopd']."</div>";
|
||||||
|
echo "<div class='container'>";
|
||||||
|
echo "<span><b>".$course['ename']."</b></span>";
|
||||||
|
echo "<span>".$course['lname']."</span>";
|
||||||
|
echo "</div>";
|
||||||
|
|
||||||
|
echo "</div>";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "</div>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "</div>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
echo "</body>";
|
||||||
|
|
||||||
|
|
||||||
|
// echo "<form method='POST' action='/xlessons/".$this->diplome_id."'>";
|
||||||
|
// echo "<table><thead style='font-weight: bold;'><tr><td>Read name</td><td>Correction</td></tr></thead><tbody>";
|
||||||
|
|
||||||
|
// foreach($d_cols as $data){
|
||||||
|
|
||||||
|
// $id = $data['id_event'];
|
||||||
|
// $basename = $data['basename'];
|
||||||
|
// $color = $data['color'];
|
||||||
|
// $name = $data['name'];
|
||||||
|
|
||||||
|
// echo "<tr><td>$basename</td><td><input type='text' style='display: inline-block; margin: 1em .2em; padding: .2em; border: none; background-color: $color;' name='name[$id]' value='$name'></td></tr>";
|
||||||
|
|
||||||
|
// }
|
||||||
|
// echo "</tbody></table>";
|
||||||
|
|
||||||
|
// echo "<input type='submit' value='SAVE'>";
|
||||||
|
|
||||||
|
// echo "</form>";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function lessons(){
|
public function lessons(){
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
/* [2] Display the links
|
/* [2] Display the links
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
echo "<table><thead style='font-weight: bold;'><tr><td>Diplome</td><td>Lessons' name</td><td>Location</td><td>Link</td><td>Last Update</td></tr></thead><tbody>";
|
echo "<table><thead style='font-weight: bold;'><tr><td>Diplome</td><td>Lessons' name</td><td>Location</td><td>View</td><td>Link</td><td>Last Update</td></tr></thead><tbody>";
|
||||||
|
|
||||||
foreach($diplomes as $id=>$data){
|
foreach($diplomes as $id=>$data){
|
||||||
|
|
||||||
|
@ -66,6 +66,12 @@
|
||||||
if( file_exists($link) )
|
if( file_exists($link) )
|
||||||
echo " href='/ics/$id.ics'";
|
echo " href='/ics/$id.ics'";
|
||||||
|
|
||||||
|
// link to view
|
||||||
|
echo "<td><a href='/view/$id'>View</a></td>";
|
||||||
|
echo "<td><a";
|
||||||
|
if( file_exists($link) )
|
||||||
|
echo " href='/ics/$id.ics'";
|
||||||
|
|
||||||
// link to .ics
|
// link to .ics
|
||||||
echo ">https://$url</a></td>";
|
echo ">https://$url</a></td>";
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
public static $start_y = 79; // start y
|
public static $start_y = 79; // start y
|
||||||
public static $stop_y = 699; // stop y
|
public static $stop_y = 699; // stop y
|
||||||
public static $start_h = 8; // start hour
|
public static $start_h = 6; // start hour (GMT)
|
||||||
public static $stop_h = 20; // stop hour
|
public static $stop_h = 18; // stop hour (GMT)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
throw new \Exception("CalendarExtractor.__construct(<String>, <URL>, <String>) received but cannot reach <URL>");
|
throw new \Exception("CalendarExtractor.__construct(<String>, <URL>, <String>) received but cannot reach <URL>");
|
||||||
|
|
||||||
/* (3) Check @start_d format */
|
/* (3) Check @start_d format */
|
||||||
if( !preg_match("@^\d{1,2}-\d{1,2}-\d{3,}$@", $start_d) )
|
if( !preg_match("@^\d{3,}-\d{1,2}-\d{1,2}$@", $start_d) )
|
||||||
throw new \Exception("CalendarExtractor.__construct(<String>, <String>, <DATE>) received <DATE> has not the correct format");
|
throw new \Exception("CalendarExtractor.__construct(<String>, <String>, <DATE>) received <DATE> has not the correct format");
|
||||||
|
|
||||||
/* (4) Check @d_uid format */
|
/* (4) Check @d_uid format */
|
||||||
|
@ -158,13 +158,14 @@
|
||||||
|
|
||||||
// {1} calculate time //
|
// {1} calculate time //
|
||||||
$start_y = $y;
|
$start_y = $y;
|
||||||
$time = $this->yToTime($day_n, $start_y);
|
$time_start = $this->yToTime($day_n, $start_y);
|
||||||
|
$date_start = date('Ymd\THis\Z', $time_start);
|
||||||
|
|
||||||
// {2} Incr uid //
|
// {2} Incr uid //
|
||||||
$uid++;
|
$uid++;
|
||||||
|
|
||||||
// {3} Store event start //
|
// {3} Store event start //
|
||||||
$this->event[$uid][$time] = [];
|
$this->event[$uid][$date_start] = [];
|
||||||
|
|
||||||
// {4} Seek end of event //
|
// {4} Seek end of event //
|
||||||
$y++;
|
$y++;
|
||||||
|
@ -173,10 +174,11 @@
|
||||||
|
|
||||||
|
|
||||||
// {5} If end reached //
|
// {5} If end reached //
|
||||||
$this->event[$uid][$time] = [ $this->yToTime($day_n, $y) ];
|
$time_stop = $this->yToTime($day_n, $y);
|
||||||
|
$this->event[$uid][$date_start] = [ date('Ymd\THis\Z', $time_stop) ];
|
||||||
|
|
||||||
// {6} Exctract event's image //
|
// {6} Exctract event's image //
|
||||||
$ev = $this->extractEvent("$time-$uid", [$col_x, $start_y+1], [$col_ind[$day_n+1]-1, $y]);
|
$ev = $this->extractEvent("$date_start-$uid", [$col_x, $start_y+1], [$col_ind[$day_n+1]-1, $y]);
|
||||||
|
|
||||||
/* {7} Check @event if already exists */ {
|
/* {7} Check @event if already exists */ {
|
||||||
|
|
||||||
|
@ -226,8 +228,35 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (9) Check @course if already exists */ {
|
||||||
|
|
||||||
|
$date = [
|
||||||
|
'start' => date('Y-m-d H:i:s', $time_start),
|
||||||
|
'stop' => date('Y-m-d H:i:s', $time_stop)
|
||||||
|
];
|
||||||
|
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT c.id_course as idc FROM course as c, event as e, location as l WHERE c.id_event = e.id_event AND c.id_location = l.id_location AND e.name = :ename AND l.name = :lname AND e.id_event = :ide AND l.id_location = :idl AND c.start_date = :startd AND c.stop_date = :stopd");
|
||||||
|
$sqlr->execute([ ':ename' => $read_name, ':lname' => $read_location, ':ide' => $event_id, ':idl' => $location_id, ':startd' => $date['start'], ':stopd' => $date['stop'] ]);
|
||||||
|
$fetched = $sqlr->fetch();
|
||||||
|
|
||||||
|
// {8.1} If not found in db -> insert //
|
||||||
|
if( !$fetched ){
|
||||||
|
|
||||||
|
// {8.2} Insert new location //
|
||||||
|
$sqlr = DatabaseDriver::getPDO()->prepare("INSERT INTO course(id_course,id_event,id_location,start_date,stop_date) VALUES(DEFAULT,:ide,:idl,:startd,:stopd)");
|
||||||
|
$sqlr->execute([ ':ide' => $event_id, ':idl' => $location_id, ':startd' => $date['start'], ':stopd' => $date['stop'] ]);
|
||||||
|
|
||||||
|
// {8.3} Store id in current location //
|
||||||
|
$course_id = DatabaseDriver::getPDO()->lastInsertId();
|
||||||
|
|
||||||
|
|
||||||
|
}else
|
||||||
|
$course_id = $fetched['idc'];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* (9) Store local data for ics */
|
/* (9) Store local data for ics */
|
||||||
$this->event[$uid][$time][1] = $location_id;
|
$this->event[$uid][$date_start][1] = $location_id;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -352,7 +381,7 @@
|
||||||
* @day_n<int> Day relative index
|
* @day_n<int> Day relative index
|
||||||
* @y<int> y Coordinate
|
* @y<int> y Coordinate
|
||||||
*
|
*
|
||||||
* @return time<String> Formatted time (HH:mm)
|
* @return time<int> GMT timestamp
|
||||||
*
|
*
|
||||||
---------------------------------------------------------*/
|
---------------------------------------------------------*/
|
||||||
private function yToTime($day_n, $y){
|
private function yToTime($day_n, $y){
|
||||||
|
@ -394,13 +423,13 @@
|
||||||
/* [3] Convert to GMT (UTC+0)
|
/* [3] Convert to GMT (UTC+0)
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
/* (1) Set fixed timezone offset */
|
/* (1) Set fixed timezone offset */
|
||||||
$tz_offset = +2;
|
// $tz_offset = +2;
|
||||||
|
|
||||||
/* (2) Get GMT (UTC+0) timestamp */
|
/* (2) Get GMT (UTC+0) timestamp */
|
||||||
$ts = strtotime("${day} $hour:$min:00") - (3600*$tz_offset);
|
$ts = strtotime("${day} $hour:$min:00");
|
||||||
|
|
||||||
/* (3) Return GMT date */
|
/* (3) Return GMT date */
|
||||||
return date("Ymd\THis\Z", $ts);
|
return $ts;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@
|
||||||
$month = self::monthAsso()[ $m[2] ];
|
$month = self::monthAsso()[ $m[2] ];
|
||||||
|
|
||||||
// {3} Get monday date //
|
// {3} Get monday date //
|
||||||
$mon = date( 'd-m-Y', strtotime("${m[1]}-$month-${m[3]} - 5 days") );
|
$mon = date( 'Y-m-d', strtotime("${m[3]}-$month-${m[1]} - 5 days") );
|
||||||
|
|
||||||
// {4} Register into the list //
|
// {4} Register into the list //
|
||||||
$p_list[ "S${m[4]}" ] = $mon;
|
$p_list[ "S${m[4]}" ] = $mon;
|
||||||
|
@ -279,8 +279,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* [2] Return the instance
|
/* [2] Return the instance
|
||||||
=========================================================*/
|
=========================================================*/
|
||||||
return new Config($d_list, $p_list);
|
return new Config($d_list, $p_list);
|
||||||
|
|
|
@ -28,6 +28,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"/view/{diplome_id}": {
|
||||||
|
"methods": ["GET"],
|
||||||
|
"controller": "ics:view",
|
||||||
|
"arguments": {
|
||||||
|
"diplome_id": "T\\d+"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"/lessons/{diplome_id}": {
|
"/lessons/{diplome_id}": {
|
||||||
"methods": ["GET"],
|
"methods": ["GET"],
|
||||||
"controller": "ics:lessons",
|
"controller": "ics:lessons",
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
body{
|
||||||
|
font-family: 'Lato', 'Open Sans';
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.null{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.period{
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
left: 10vw;
|
||||||
|
margin-top: 10vw;
|
||||||
|
|
||||||
|
width: 80vw;
|
||||||
|
height: 54vw;
|
||||||
|
|
||||||
|
background: red;
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > .title{
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
margin-top: -1.2em;
|
||||||
|
left: 50%;
|
||||||
|
|
||||||
|
transform: translateX(-50%);
|
||||||
|
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d]{
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
width: calc( 80vw / 5 - 1px );
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
border-right: 1px solid black;
|
||||||
|
|
||||||
|
background-color: #F8F8F8;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > .d1{
|
||||||
|
left: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > .d2{
|
||||||
|
left: 40%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > .d3{
|
||||||
|
left: 60%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > .d4{
|
||||||
|
left: 80%;
|
||||||
|
border-right: none;
|
||||||
|
width: calc( 80vw / 5 );
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d] > .course{
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 0;
|
||||||
|
|
||||||
|
font-size: 1.2vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d] > .course > .start{
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
left: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d] > .course > .stop{
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 1px;
|
||||||
|
right: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d] > .course > .container{
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.period > [class^=d] > .course > .container *{
|
||||||
|
text-align: center;
|
||||||
|
}
|
Loading…
Reference in New Issue