Add automatic agenda on front page.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side;
|
||||
|
||||
use \DateTime;
|
||||
use \DateTimeImmutable;
|
||||
|
||||
interface Activity {
|
||||
|
||||
|
83
src/pvv/side/agenda.php
Normal file
83
src/pvv/side/agenda.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side;
|
||||
|
||||
use \pvv\side\social\NerdepitsaActivity;
|
||||
use \pvv\side\social\AnimekveldActivity;
|
||||
|
||||
use \DateTimeImmutable;
|
||||
use \DateInterval;
|
||||
|
||||
class Agenda {
|
||||
|
||||
const TODAY = 0;
|
||||
const TOMORROW = 1;
|
||||
const THIS_WEEK = 2;
|
||||
const THIS_MONTH = 3;
|
||||
const NEXT_MONTH = 4;
|
||||
|
||||
public function __construct() {
|
||||
$this->activities = [
|
||||
new NerdepitsaActivity,
|
||||
new AnimekveldActivity,
|
||||
];
|
||||
}
|
||||
|
||||
public function getEventsBetween(DateTimeImmutable $from, DateTimeImmutable $to) {
|
||||
$results = [[], []];
|
||||
do {
|
||||
$run = false;
|
||||
for($i = 0; $i < sizeof($this->activities); $i++) {
|
||||
if (sizeof($results[$i])) {
|
||||
$date = end($results[$i])->getStop();
|
||||
} else {
|
||||
$date = $from;
|
||||
}
|
||||
$next = $this->activities[$i]->getNextEventFrom($date);
|
||||
if (isset($next) && $next->getStart() < $to) {
|
||||
$results[$i][] = $this->activities[$i]->getNextEventFrom($date);
|
||||
$run = true;
|
||||
}
|
||||
}
|
||||
} while ($run);
|
||||
$result = [];
|
||||
foreach($results as $a) foreach($a as $b) $result[] = $b;
|
||||
usort($result, function($a, $b) {
|
||||
return ($a->getStart() < $b->getStart()) ? -1 : 1;
|
||||
});
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getNextDays() {
|
||||
$result = [[], [], [], [], []];
|
||||
$events = $this->getEventsBetween(
|
||||
(new DateTimeImmutable)->sub(new DateInterval('PT1H')),
|
||||
(new DateTimeImmutable)->add(new DateInterval('P1M'))
|
||||
);
|
||||
foreach ($events as $event) {
|
||||
$index = self::NEXT_MONTH;
|
||||
if (self::isToday($event->getStart())) $index = self::TODAY;
|
||||
elseif (self::isTomorrow($event->getStart())) $index = self::TOMORROW;
|
||||
elseif (self::isThisWeek($event->getStart())) $index = self::THIS_WEEK;
|
||||
elseif (self::isThisMonth($event->getStart())) $index = self::THIS_MONTH;
|
||||
$result[$index][] = $event;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
public static function isToday(DateTimeImmutable $date) {
|
||||
return $date->format('dmY') == date('dmY');
|
||||
}
|
||||
|
||||
public static function isTomorrow(DateTimeImmutable $date) {
|
||||
return $date->sub(new DateInterval('P1D'))->format('dmY') == date('dmY');
|
||||
}
|
||||
|
||||
public static function isThisWeek(DateTimeImmutable $date) {
|
||||
return $date->format('WY') == date('WY');
|
||||
}
|
||||
|
||||
public static function isThisMonth(DateTimeImmutable $date) {
|
||||
return $date->format('mY') == date('mY');
|
||||
}
|
||||
|
||||
}
|
@@ -1,10 +1,20 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side;
|
||||
|
||||
interface Event extends Activity {
|
||||
use \DateTimeImmutable;
|
||||
|
||||
public function getStart(); /* : DateTime */
|
||||
abstract class Event implements Activity {
|
||||
|
||||
public function getStop(); /* : DateTime */
|
||||
private $start;
|
||||
|
||||
public function __construct(DateTimeImmutable $start) {
|
||||
$this->start = $start;
|
||||
}
|
||||
|
||||
public function getStart() {
|
||||
return $this->start;
|
||||
}
|
||||
|
||||
public abstract function getStop(); /* : DateTimeImmutable */
|
||||
|
||||
}
|
||||
|
@@ -1,10 +1,11 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side\social;
|
||||
|
||||
use \pvv\side\RepeatingActivity;
|
||||
use \DateTimeImmutable;
|
||||
use \DateInterval;
|
||||
|
||||
class AnimekveldActivity {
|
||||
class AnimekveldActivity implements RepeatingActivity {
|
||||
|
||||
public function nextDate(DateTimeImmutable $date) {
|
||||
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30)
|
||||
|
26
src/pvv/side/social/animekveldevent.php
Normal file
26
src/pvv/side/social/animekveldevent.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side\social;
|
||||
|
||||
use \pvv\side\Event;
|
||||
|
||||
use \DateInterval;
|
||||
|
||||
class AnimekveldEvent extends Event {
|
||||
|
||||
public function getStop() {
|
||||
return $this->getStart()->add(new DateInterval('PT4H1800S'));
|
||||
}
|
||||
|
||||
public function getName() /* : string */ {
|
||||
return "Animekveld";
|
||||
}
|
||||
|
||||
public function getLocation() /* : Location */ {
|
||||
return "Peppes Kjøpmansgata";
|
||||
}
|
||||
|
||||
public function getOrganiser() /* : User */ {
|
||||
return "Anders Christensen";
|
||||
}
|
||||
|
||||
}
|
26
src/pvv/side/social/nerdepitsaevent.php
Normal file
26
src/pvv/side/social/nerdepitsaevent.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php //declare(strict_types=1);
|
||||
namespace pvv\side\social;
|
||||
|
||||
use \pvv\side\Event;
|
||||
|
||||
use \DateInterval;
|
||||
|
||||
class NerdepitsaEvent extends Event {
|
||||
|
||||
public function getStop() {
|
||||
return $this->getStart()->add(new DateInterval('PT2H1800S'));
|
||||
}
|
||||
|
||||
public function getName() {
|
||||
return "Nerdepitsa";
|
||||
}
|
||||
|
||||
public function getLocation() /* : Location */ {
|
||||
return "Peppes Kjøpmansgata";
|
||||
}
|
||||
|
||||
public function getOrganiser() /* : User */ {
|
||||
return "Anders Christensen";
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user