univ-pau-ics/build/router/controller/ics.php

332 lines
8.0 KiB
PHP

<?php
namespace router\controller;
use \database\core\DatabaseDriver;
class ics{
private $diplome_id;
/* PRE-CALL
*
* @url<String> Calling URI
*
*/
public function __construct($url){
$this->diplome_id = $url['diplome_id'];
}
/* CALL
*
*/
public function download(){
/* [1] Check .ics file
=========================================================*/
/* (1) Set file name */
$file_name = __ROOT__."/tmp/".$this->diplome_id.".ics";
/* (2) Check if exists */
if( !file_exists($file_name) )
die("An error occured. Please contact the developers.\n");
/* [2] Display file
=========================================================*/
/* (1) Headers */
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename='.$this->diplome_id.'.ics');
/* (2) Body */
readfile($file_name);
}
public function lessons(){
/* [1] Get database data
=========================================================*/
/* (1) Get the list of available events */
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT * FROM event WHERE id_diplome = :idd");
$sqlr->execute([ ':idd' => $this->diplome_id ]);
$d_cols = $sqlr->fetchAll();
/* (2) Manage error */
if( !$d_cols )
die("Correction not available for this diplome");
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>";
}
// todo
public function location(){
/* [1] Get events data
=========================================================*/
/* (1) Get the list of available events */
// $sqlr = DatabaseDriver::getPDO()->prepare("SELECT * FROM event WHERE id_diplome = :idd");
// $sqlr->execute([ ':idd' => $this->diplome_id ]);
// $events = $sqlr->fetchAll();
/* (2) Manage error */
// if( !$events )
// die("Correction not available for this diplome");
/* [2] Get location data
=========================================================*/
// foreach($events as &$event){
$location = [];
/* (1) Get the list of available locations*/
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT l.id_location as idl, l.name as name, l.basename as basename, e.name as ename, e.color as color FROM location as l, event as e WHERE l.id_event = e.id_event AND e.id_diplome = :idd GROUP BY idl, name, basename, ename, color");
$sqlr->execute([ ':idd' => $this->diplome_id ]);
$fetched = $sqlr->fetchAll();
if( !$fetched ){
$fetched[] = [];
$locdata[] = [];
}
foreach($fetched as $raw){
if( !isset($location[$raw['ename']]) )
$location[$raw['ename']] = [];
$location[$raw['ename']][] = intval( $raw['idl'] );
$locdata[$raw['ename']] = [ $raw['name'], $raw['basename'], $raw['color'] ];
}
// }
echo "<form method='POST' action='/xlocation/".$this->diplome_id."'>";
echo "<table><thead style='font-weight: bold;'><tr><td>Lesson</td><td>Read name</td><td>Correction</td></tr></thead><tbody>";
foreach($location as $ename=>$ids){
$color = $locdata[$ename][2];
$id = implode(",", $ids);
$name = $locdata[$ename][0];
$basename = $locdata[$ename][1];
echo "<tr><td><b>$ename</b></td><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 correct_lessons(){
/* [1] Update data
=========================================================*/ {
/* (1) Check $_POST['name'] */
if( !isset($_POST['name']) || !is_array($_POST['name']) )
die("No data received");
/* (2) Store corrections */
foreach($_POST['name'] as $id=>$correct){
if( !empty(trim($correct)) ){
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE event SET name = :name WHERE id_event = :ide");
$sqlr->execute([ ':name' => $correct, ':ide' => $id ]);
}
}
}
/* [2] Update file one the fly
=========================================================*/
/* (1) Get corrections */
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT id_event, name FROM event WHERE id_diplome = :idd");
$sqlr->execute([ ':idd' => $this->diplome_id ]);
/* (2) Manage error */
if( !($fetched=$sqlr->fetchAll()) )
die("Cannot update the .ics file now");
/* (3) Format data */
$corrections = [];
foreach($fetched as $c)
$corrections[$c['id_event']] = $c['name'];
/* (3) Get file pointer */
$fp = @file_get_contents(__ROOT__."/tmp/".$this->diplome_id.".ics");
/* (4) Manage error */
if( !$fp )
die("Cannot update the .ics file now");
/* (4) Read line by line */
$line = explode("\n", $fp);
for( $l = 0 ; $l < count($line)-1 ; $l++ ){
// {1} If got the right pointer //
if( preg_match('@^DESCRIPTION:event\@(\d+)$@', $line[$l], $m) ){
// {2} If is in the list of correction //
if( !isset($corrections[$m[1]]) )
continue;
// {3} Rewrite name //
$line[++$l] = "SUMMARY:".$corrections[$m[1]];
}
}
/* (5) Back in file */
file_put_contents(__ROOT__."/tmp/".$this->diplome_id.".ics", implode("\n", $line));
header('Location: /');
}
// todo
public function correct_location(){
/* [1] Update data
=========================================================*/ {
/* (1) Check $_POST['name'] */
if( !isset($_POST['name']) || !is_array($_POST['name']) )
die("No data received");
/* (2) Store corrections */
foreach($_POST['name'] as $ids=>$correct){
if( !empty(trim($correct)) ){
// check if containing id list
if( !preg_match('@^\d+(,\d+)*$@', $ids) )
continue;
// update for each location
$id_list = explode(',', $ids);
foreach($id_list as $id){
$sqlr = DatabaseDriver::getPDO()->prepare("UPDATE location SET name = :name WHERE id_location = :idl");
$sqlr->execute([ ':name' => $correct, ':idl' => $id ]);
}
}
}
}
/* [2] Update file one the fly
=========================================================*/
/* (1) Get corrections */
$sqlr = DatabaseDriver::getPDO()->prepare("SELECT l.id_location as id_location, l.name as name FROM location as l, event as e WHERE l.id_event = e.id_event AND e.id_diplome = :idd");
$sqlr->execute([ ':idd' => $this->diplome_id ]);
/* (2) Manage error */
if( !($fetched=$sqlr->fetchAll()) )
die("Cannot update the .ics file now");
/* (3) Format data */
$corrections = [];
foreach($fetched as $c)
$corrections[$c['id_location']] = $c['name'];
/* (3) Get file pointer */
$fp = @file_get_contents(__ROOT__."/tmp/".$this->diplome_id.".ics");
/* (4) Manage error */
if( !$fp )
die("Cannot update the .ics file now");
/* (4) Read line by line */
$line = explode("\n", $fp);
for( $l = 0 ; $l < count($line)-1 ; $l++ ){
// {1} If got the right pointer //
if( preg_match('@^DESCRIPTION:location\@(\d+)$@', $line[$l], $m) ){
// {2} If is in the list of correction //
if( !isset($corrections[$m[1]]) )
continue;
// {3} Rewrite name //
$line[++$l] = "LOCATION:".$corrections[$m[1]];
}
}
/* (5) Back in file */
file_put_contents(__ROOT__."/tmp/".$this->diplome_id.".ics", implode("\n", $line));
header('Location: /');
}
/* POST-CALL
*
*/
public function __destruct(){
}
}