-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSchedule.php
138 lines (114 loc) · 3.68 KB
/
Schedule.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
/**
* Třída určená pro stahování a přeformátování iCAL rozvrhů ze systému IS STAG.
*
* @author Ondřej Doktor <[email protected]>
* @link https://github.com/drml/rozvrhar
* @license MIT
*/
class Schedule {
private $stagHostname;
private $predmetInfoBuffer = array();
private $format;
/**
* V konstruktoru předejte hostname serveru, na které je dostupný IS STAG.
*
* @param string $stagHostname
*/
public function __construct($stagHostname)
{
$this->stagHostname = $stagHostname;
}
/**
*
* Nastaví výstupní formát popisu rozvrhových událostí.
* Jako argument bere řetězec označující formát:
*
* A: ABC/123 - Předmět - Přednáška
* B: ABC/123 - Předmět
* C: Předmět - Přednáška
* D: Předmět
*
* Pokud je zadán jiný řetězec, příp. je nastaveno NULL, ponechá se pole SUMMARY tak jak je.
*
* @param string|NULL $format
*/
public function setFormat($format)
{
$this->format = $format;
}
/**
* Interní metoda pro získávání rozvrhu osoby ve formáti iCAL ze serveru.
* Název metody i interface odpovídá API IS STAG.
*
* @param string $osoba Osobní číslo
* @param string $rok
* @param string $semestr Řetězec 'LS' nebo 'ZS'
* @return string|boolean Rozvrh ve formátu iCAL nebo FALSE
*/
private function getRozvrhByStudentICAL($osoba, $rok, $semestr){
return file_get_contents("https://$this->stagHostname/ws/services/rest/rozvrhy/getRozvrhByStudentICAL?semestr=$semestr&osCislo=$osoba&rok=$rok");
}
/**
* Interní metoda pro získávání informací o předmětu ze serveru.
* Název metody i interface odpovídá API IS STAG.
* Pro okapované dotazy využívá metoda vlastní cache.
*
* @param string $katedra
* @param string $zkratka
* @return stdObj|boolean Objekt s informacemi o předmětu nebo FALSE
*/
private function getPredmetInfo($katedra, $zkratka){
if (!isset($this->predmetInfoBuffer[$katedra.$zkratka])){
$json = file_get_contents("https://$this->stagHostname/ws/services/rest/predmety/getPredmetInfo?zkratka=$zkratka&outputFormat=json&katedra=$katedra");
if($json){
$this->predmetInfoBuffer[$katedra.$zkratka] = json_decode(str_replace(array('[', ']'), '', $json));
} else {
$this->predmetInfoBuffer[$katedra.$zkratka] = false;
}
}
return $this->predmetInfoBuffer[$katedra.$zkratka];
}
/**
* Pomocná metoda pro formátování iCAL pole SUMMARY.
* Metoda má rozhraní připravené pro preg_replace_callback.
*
* @param array $matches
* @return string
*/
private function formatSummary($matches)
{
$predmet = $this->getPredmetInfo($matches[1], $matches[2]);
if ($predmet === false || $this->format == null){
return $matches[0];
}
switch ($this->format){
case 'A':
return 'SUMMARY:'.$matches[1] . "/" . $matches[2] . " - " . $predmet->nazev . $matches[3];
break;
case 'B':
return 'SUMMARY:'.$matches[1] . "/" . $matches[2] . " - " . $predmet->nazev;
break;
case 'C':
return 'SUMMARY:'.$predmet->nazev . $matches[3];
break;
case 'D':
return 'SUMMARY:'.$predmet->nazev;
break;
default:
return $matches[0];
}
}
/**
* Metoda vrací rozvrh osoby ve fromátu iCAL, přeformátovaný podle nastaveného formátu.
*
* @param string $osoba Osobní číslo
* @param string $rok
* @param string $semestr Řetězec 'LS' nebo 'ZS'
* @return string Rozvrh ve formátu iCAL
*/
public function formatRozvrhByStudentICAL($osoba, $rok, $semestr){
$ical = $this->getRozvrhByStudentICAL($osoba, $rok, $semestr);
return preg_replace_callback('/^SUMMARY:(\w+)\/(\w+)(\s.*)$/m', array($this, 'formatSummary'), $ical);
}
}