diff options
Diffstat (limited to '')
-rw-r--r-- | configs/conferences/31c3/config.php (renamed from configs/clients/31c3.php) | 2 | ||||
-rw-r--r-- | configs/conferences/gpn15/config.php | 421 | ||||
-rw-r--r-- | configs/conferences/gpn15/main.less | 92 | ||||
-rw-r--r-- | configs/conferences/gpn15/wolkenbar.png | bin | 0 -> 25703 bytes | |||
-rw-r--r-- | index.php | 106 | ||||
-rw-r--r-- | lib/helper.php | 24 | ||||
-rw-r--r-- | model/Conferences.php | 59 | ||||
-rw-r--r-- | template/page.phtml | 20 |
8 files changed, 658 insertions, 66 deletions
diff --git a/configs/clients/31c3.php b/configs/conferences/31c3/config.php index 391ca4d..a0f6383 100644 --- a/configs/clients/31c3.php +++ b/configs/conferences/31c3/config.php @@ -38,7 +38,7 @@ $GLOBALS['CONFIG']['CONFERENCE'] = array( * Der Boolean true ist aus Abwärtskompatibilitätsgründen äquivalent zu 'after'. False ist äquivalent * zu 'running'. */ - //'CLOSED' => false, + 'CLOSED' => false, /** * Titel der Konferenz (kann Leer- und Sonderzeichen enthalten) diff --git a/configs/conferences/gpn15/config.php b/configs/conferences/gpn15/config.php new file mode 100644 index 0000000..f81959e --- /dev/null +++ b/configs/conferences/gpn15/config.php @@ -0,0 +1,421 @@ +<?php +date_default_timezone_set('Europe/Berlin'); + +/** + * Während der Entwicklung wird die BASEURL automatisch erraten + * In Produktionssituationen sollte manuell eine konfiguriert werden um Überraschungen zu vermeiden + */ +if($_SERVER['HTTP_HOST'] != 'localhost') + $GLOBALS['CONFIG']['BASEURL'] = 'http://streaming.media.ccc.de/'; + + +$GLOBALS['CONFIG']['CONFERENCE'] = array( + /** + * Am Ende der Konferenz wird durch das Umlegen dieses Schalters auf True eine Danke-Und-Kommen-Sie- + * Gut-Nach-Hause-Seite sowie einem Ausblick auf die kommenden Events angezeigt. Während einer + * Konferenz kann dieser Schalter auskommentiert oder auf false gesetzt werden. + */ + 'CLOSED' => false, + + /** + * Titel der Konferenz (kann Leer- und Sonderzeichen enthalten) + * Dieser im Seiten-Header, im <title>-Tag, in der About-Seite und ggf. ab weiteren Stellen als + * Anzeigetext benutzt + */ + 'TITLE' => 'GPN15', + + /** + * Veranstalter + * Wird für den <meta name="author">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher + * <meta>-Tag generiert. + */ + 'AUTHOR' => 'Entropia e.V.', + + /** + * Beschreibungstext + * Wird für den <meta name="description">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher + * <meta>-Tag generiert. + */ + 'DESCRIPTION' => 'Gulaschprogrammiernacht 15', + + /** + * Schlüsselwortliste, Kommasepariert + * Wird für den <meta name="keywords">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher + * <meta>-Tag generiert. + */ + 'KEYWORDS' => 'GPN15, Hacking, Chaos Computer Club, Video, Media, Streaming, Hacker, Entropia, Gulasch', + + /** + * HTML-Code für den Footer (z.B. für spezielle Attribuierung mit <a>-Tags) + * Sollte üblicherweise nur Inline-Elemente enthalten + * Wird diese Zeile auskommentiert, wird die Standard-Attribuierung für (c3voc.de) verwendet + */ + 'FOOTER_HTML' => ' + by <a href="https://entropia.de">Entropia e.V</a> & + <a href="https://c3voc.de">c3voc</a> + ', + + /** + * HTML-Code für den Banner (nur auf der Startseite, direkt unter dem Header) + * wird üblicherweise für KeyVisuals oder Textmarke verwendet (vgl. Blaues + * Wischiwaschi auf http://media.ccc.de/) + * + * Dieser HTML-Block wird üblicherweise in der main.less speziell für die + * Konferenz umgestaltet. + * + * Wird diese Zeile auskommentiert, wird kein Banner ausgegeben. + */ + //'BANNER_HTML' => '31C3 – a new dawn', + + /** + * Link zu den Recordings + * Wird diese Zeile auskommentiert, wird der Link nicht angezeigt + */ + 'RELEASES' => 'http://media.ccc.de/browse/conferences/gpn/gpn15/index.html', + + /** + * Link zu einer (externen) ReLive-Übersichts-Seite + * Wird diese Zeile auskommentiert, wird der Link nicht angezeigt + */ + //'RELIVE' => 'http://vod.c3voc.de/', + + /** + * Alternativ kann ein ReLive-Json konfiguriert werden, um die interne + * ReLive-Ansicht zu aktivieren. + * + * Wird beides aktiviert, hat der externe Link Vorrang! + * Wird beides auskommentiert, wird der Link nicht angezeigt + */ + 'RELIVE_JSON' => 'http://live.dus.c3voc.de/releases/relive/index.json', + + /** + * APCU-Cache-Zeit in Sekunden + * Wird diese Zeile auskommentiert, werden die apc_*-Methoden nicht verwendet und + * das Relive-Json bei jedem Request von der Quelle geladen und geparst + */ + //'RELIVE_JSON_CACHE' => 30*60, +); + +/** + * Konfiguration der Stream-Übersicht auf der Startseite + */ +$GLOBALS['CONFIG']['OVERVIEW'] = array( + /** + * Abschnitte aud der Startseite und darunter aufgeführte Räume + * Es können beliebig neue Gruppen und Räume hinzugefügt werden + * + * Die Räume müssen in $GLOBALS['CONFIG']['ROOMS'] konfiguriert werden, + * sonst werden sie nicht angezeigt. + */ + 'GROUPS' => array( + 'Lecture Rooms' => array( + 'vortragssaal', + 'medientheater', + 'blauer-salon', + ), + ), +); + + + +/** + * Liste der Räume (= Audio & Video Produktionen, also auch DJ-Sets oä.) + */ +$GLOBALS['CONFIG']['ROOMS'] = array( + /** + * Array-Key ist der Raum-Slug, der z.B. auch zum erstellen der URLs, + * in $GLOBALS['CONFIG']['OVERVIEW'] oder im Feedback verwendet wird. + */ + 'vortragssaal' => array( + /** + * Angezeige-Name + */ + 'DISPLAY' => 'ZKM Vortragssaal', + + /** + * ID des Video/Audio-Streams. Die Stream-ID ist davon abhängig, welches + * Event-Case in welchem Raum aufgebaut wird und wird üblicherweise von + * s1 bis s5 durchnummeriert. + */ + 'STREAM' => 's2', + + /** + * Stream-Vorschaubildchen auf der Übersichtsseite anzeigen + * Damit das funktioniert muss der entsprechende runit-Task auf dem + * CDN-Quell-Host (live.ber) laufen. + */ + 'PREVIEW' => true, + + /** + * Übersetzungstonspur aktivieren + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist werden nur + * die native-Streams verwendet, andernfalls wird native und translated + * angeboten und auch für beide Tonspuren eine Player-Seite angezeigt. + */ + 'TRANSLATION' => false, + + /** + * stereo-Tonspur statt native-Tonspur benutzen + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist werden + * die "native"-Mono-Streams verwendet, andernfalls wird statt "native" + * der Streamname "stereo" eingesetzt. Im normalen Konferenz-Setup + * müssen dann beide Kanäle der Kamera mit einem Signal bespielt werden. + */ + 'STEREO' => false, + + /** + * SD-Video-Stream (1024×576) verfügbar + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein SD-Video + * angeboten. Wird auch HD_VIDEO auf false gesetzt oder auskommentiert ist, wird + * für diesen Raum überhaupt kein Video angeboten. + * + * In diesem Fall wird, sofern jeweils aktiviert, Slides, Audio und zuletzt Musik + * als Default-Stream angenommen. + */ + 'SD_VIDEO' => true, + + /** + * HD-Video-Stream (1920×1080) verfügbar + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein HD-Video + * angeboten. Wird auch SD_VIDEO auf false gesetzt oder auskommentiert ist, wird + * für diesen Raum überhaupt kein Video angeboten. + * + * In diesem Fall wird, sofern jeweils aktiviert, Slides, Audio und zuletzt Musik + * als Default-Stream angenommen. + */ + 'HD_VIDEO' => false, + + /** + * Slide-Only-Stream (1024×576) verfügbar + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Slide-Only- + * Stream angeboten. Für diesen Raum wird dann keim Slides-Tab angeboten. + * + * In diesem Fall wird, sofern jeweils aktiviert, Audio und zuletzt Musik als + * Default-Stream angenommen. + */ + 'SLIDES' => false, + + /** + * Audio-Only-Stream verfügbar + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Audio-Only- + * Stream angeboten. Für diesen Raum wird dann keim Audio-Tab angeboten. + * + * In diesem Fall wird, sofern aktiviert, Musik als Default-Stream angenommen. + */ + 'AUDIO' => true, + + /** + * Musik-Stream verfügbar + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Musik-Stream + * angeboten. Für diesen Raum wird dann keim Musik-Tab angeboten. + * + * Ist kein einziger Stream angebote, wird statt der Stream-Seite ein 404-Fehler + * angezeigt. + */ + 'MUSIC' => false, + + /** + * Fahrplan-Ansicht auf der Raum-Seite aktivieren (boolean) + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * wird der Raum nicht im Fahrplan gesucht und auch auf der Startseite + * findet keine Darstellung statt. + * + * Ebenso können alle Fahrplan-Funktionialitäten durch auskommentieren + * des globalen $GLOBALS['CONFIG']['SCHEDULE']-Blocks deaktiviert werden + */ + 'SCHEDULE' => true, + + /** + * Name des Raums im Fahrplan + * Wenn diese Zeile auskommentiert ist wird der Raum-Slug verwendet + */ + 'SCHEDULE_NAME' => 'ZKM-Vortragssaal', + + /** + * Feedback anzeigen (boolean) + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * taucht der Raum auch im globalen Feedback-Formular nicht auf. + * + * Ebenso können alle Feedback-Funktionialitäten durch auskommentieren + * des globalen $GLOBALS['CONFIG']['FEEDBACK']-Blocks deaktiviert werden + */ + 'FEEDBACK' => false, + + /** + * Subtitles-Player aktivieren (boolean) + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * wird der Subtitles-Button und die damit verbundenen Funktionen deaktiviert. + * + * Ebenso können alle Subtitles-Funktionialitäten durch auskommentieren + * des globalen $GLOBALS['CONFIG']['SUBTITLES']-Blocks deaktiviert werden + */ + 'SUBTITLES' => false, + + /** + * Embed-Form aktivieren (boolean) + * + * Ist dieses Feld auf true gesetzt, wird ein Embed-Tab unter dem Video + * angezeigt. Darüber kann der Player als iframe eingebunden werden. + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * wird kein Embed-Tab angeboten und die URL zum Einbetten existiert nicht. + * + * Ebenso können alle Embedding-Funktionialitäten durch auskommentieren + * des globalen $GLOBALS['CONFIG']['EMBED']-Blocks deaktiviert werden + */ + 'EMBED' => false, + + /** + * IRC-Link aktivieren (boolean) + * + * Solange Twitter oder IRC aktiviert ist, wird ein "Chat"-Tab mit den + * jeweiligen Links angezeigt. + * + * Ist dieses Feld auf true gesetzt, wird ein irc://-Link angezeigt. + * WebIrc wird nach dem Congress nicht mehr unterstützt ;) + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * wird kein IRC-Link angezeigt + * + * Ebenso können alle IRC-Links durch auskommentieren + * des globalen $GLOBALS['CONFIG']['IRC']-Blocks deaktiviert werden + */ + 'IRC' => false, + + /** + * Mit dem Angaben in diesem Block können die Vorgaben aus dem + * globalen $GLOBALS['CONFIG']['IRC'] Block überschrieben werden. + * + * Der globale $GLOBALS['CONFIG']['IRC']-Block muss trotzdem existieren, + * da sonst überhaupt kein IRC-Link erzeugt wird. (ggf. einfach `= true` setzen) + */ + 'IRC_CONFIG' => array( + 'DISPLAY' => '#31C3-hall-1 @ hackint', + 'URL' => 'irc://irc.hackint.eu:6667/31C3-hall-1', + ), + + /** + * Twitter-Link aktivieren (boolean) + * + * Ist dieses Feld auf true gesetzt, wird ein Link zu Twitter angezeigt. + * + * Solange Twitter oder IRC aktiviert ist, wird ein "Chat"-Tab mit den + * jeweiligen Links angezeigt. + * + * Wenn diese Zeile auskommentiert oder auf false gesetzt ist, + * wird kein Twitter-Link angezeigt + * + * Ebenso können alle Twitter-Links durch auskommentieren + * des globalen $GLOBALS['CONFIG']['TWITTER']-Blocks deaktiviert werden + **/ + 'TWITTER' => false, + + /** + * Mit dem Angaben in diesem Block können die Vorgaben aus dem + * globalen $GLOBALS['CONFIG']['TWITTER'] Block überschrieben werden. + * + * Der globale $GLOBALS['CONFIG']['TWITTER']-Block muss trotzdem existieren, + * da sonst überhaupt kein IRC-Link erzeugt wird. (ggf. einfach `= true` setzen) + */ + 'TWITTER_CONFIG' => array( + 'DISPLAY' => '#hall1 @ twitter', + 'TEXT' => '#31C3 #hall1', + ), + ), + + 'medientheater' => array( + 'DISPLAY' => 'Medientheater', + 'STREAM' => 's3', + 'PREVIEW' => true, + + 'TRANSLATION' => false, + 'SD_VIDEO' => true, + 'HD_VIDEO' => false, + 'AUDIO' => true, + 'SLIDES' => false, + 'MUSIC' => false, + + 'SCHEDULE' => true, + 'SCHEDULE_NAME' => 'Medientheater', + 'FEEDBACK' => false, + 'SUBTITLES' => false, + 'EMBED' => false, + 'IRC' => false, + 'TWITTER' => false, + ), + + 'blauer-salon' => array( + 'DISPLAY' => 'Blauer Salon', + 'STREAM' => 's4', + 'PREVIEW' => true, + + 'TRANSLATION' => false, + 'SD_VIDEO' => true, + 'HD_VIDEO' => false, + 'AUDIO' => true, + 'SLIDES' => false, + 'MUSIC' => false, + + 'SCHEDULE' => false, + 'FEEDBACK' => false, + 'SUBTITLES' => false, + 'EMBED' => false, + 'IRC' => false, + 'TWITTER' => false, + ), +); + + + +/** + * Konfigurationen zum Konferenz-Fahrplan + * Wird dieser Block auskommentiert, werden alle Fahrplan-Bezogenen Features deaktiviert + */ +$GLOBALS['CONFIG']['SCHEDULE'] = array( + /** + * URL zum Fahrplan-XML + * + * Diese URL muss immer verfügbar sein, sonst können kann die Programm-Ansicht + * aufhören zu funktionieren. Wenn die Quelle unverlässlich ist ;) sollte ein + * externer HTTP-Cache vorgeschaltet werden. + */ + 'URL' => 'http://bl0rg.net/~andi/gpn15-fahrplan/schedule.xml', + + /** + * Nur die angegebenen Räume aus dem Fahrplan beachten + * + * Wird diese Zeile auskommentiert, werden alle Räume angezeigt + */ + 'ROOMFILTER' => array('Medientheater', 'ZKM-Vortragssaal'), + + /** + * APCU-Cache-Zeit in Sekunden + * Wird diese Zeile auskommentiert, werden die apc_*-Methoden nicht verwendet und + * der Fahrplan bei jedem Request von der Quelle geladen und geparst + */ + //'CACHE' => 30*60, + + /** + * Skalierung der Programm-Vorschau in Sekunden pro Pixel + */ + 'SCALE' => 7, + + /** + * Simuliere das Verhalten als wäre die Konferenz bereits heute + * + * Diese folgende Beispiel-Zeile Simuliert, dass das + * Konferenz-Datum 2014-12-29 auf den heutigen Tag 2015-02-24 verschoben ist. + */ + //'SIMULATE_OFFSET' => strtotime(/* Conference-Date */ '2014-12-28') - strtotime(/* Today */ '2015-03-01'), + 'SIMULATE_OFFSET' => 0, +); diff --git a/configs/conferences/gpn15/main.less b/configs/conferences/gpn15/main.less new file mode 100644 index 0000000..7706c49 --- /dev/null +++ b/configs/conferences/gpn15/main.less @@ -0,0 +1,92 @@ +@import "../../../assets/css/_structure.less"; + +// conference specific styles here + +// often configured values (and their defaults): +// +// @brand-primary: #337ab7; +// @text-color: @gray-dark; +// +// @link-color: @brand-primary; +// @link-hover-color: darken(@link-color, 15%); +// +// @navbar-default-color: #777777; +// @navbar-default-bg: #f8f8f8; +// +// @navbar-default-link-color: #777; +// @navbar-default-link-hover-color: #333; + +html, body { + min-height: 100%; +} + +body { + background-image: url("wolkenbar.png"); + background-repeat: repeat-x; + background-position: bottom left; +} + +.navbar-fixed-top { + background: @body-bg url("wolkenbar.png") repeat-x left -46px; + border-color: #000; +} + +footer { + background-color: rgba(255,255,255,0.35); + a { + color: #777; + text-decoration: underline; + } +} + + +/* +@gray-darker: #369; // #222 +@gray: #445; // #555 +@gray-light: #030333; // #999 +@gray-lighter: #0D0FAE; // #eee +*/ + +@body-bg: rgba(0, 122, 186, 1); +@text-color: white; + +@panel-bg: lighten(@body-bg, 5%); + +@link-color: #ccc; +@well-bg: @panel-bg; +@panel-primary-border: #FFFFFF; +@panel-default-heading-bg: darken(@body-bg, 2%); +@panel-default-text: #FFFFFF; + +@navbar-default-link-color: #fff; +@navbar-default-link-hover-color: #fff; +@navbar-default-link-active-color: #fff; + +@nav-tabs-active-link-hover-color: #fff; +@nav-link-hover-bg: lighten(@body-bg, 1%); + +// colors of the schedule ("Fahrplan") widget below the video-player +// +// @schedule-now: @brand-danger; +// @schedule-now-bg: fade(lighten(@brand-danger, 5%), 60%); +// @schedule-border: lighten(@brand-primary, 50%); +// +// @schedule-room: darken(@brand-primary, 15%); +// @schedule-author: #444; +// +// @schedule-selected-room: lighten(@brand-success, 10%); +@schedule-selected-room: #72b3d2; +.schedule a { + color: #333; +} + +// +// @schedule-daychange: darken(@brand-primary, 20%); +// @schedule-daychange-bg: fade(white, 30%); +// +// @schedule-gap: darken(@brand-primary, 20%); +// @schedule-gap-bg: fade(white, 30%); +// +// @schedule-pause: white; +@schedule-pause: #333; +// @schedule-pause-bg: lighten(black, 85%); diff --git a/configs/conferences/gpn15/wolkenbar.png b/configs/conferences/gpn15/wolkenbar.png Binary files differnew file mode 100644 index 0000000..b1ffae2 --- /dev/null +++ b/configs/conferences/gpn15/wolkenbar.png @@ -5,35 +5,47 @@ if(!ini_get('short_open_tag')) require_once('lib/helper.php'); -$route = @$_GET['route']; -$route = rtrim($route, '/'); +require_once('lib/PhpTemplate.php'); +require_once('lib/Exceptions.php'); +require_once('lib/less.php/Less.php'); -if($route == '') -{ - // list of clients - $clients = array_values(array_filter(array_map(function($file) - { - $info = pathinfo($file); +require_once('model/ModelBase.php'); +require_once('model/Conferences.php'); +require_once('model/Conference.php'); +require_once('model/Feedback.php'); +require_once('model/Schedule.php'); +require_once('model/Overview.php'); +require_once('model/Room.php'); +require_once('model/RoomTab.php'); +require_once('model/RoomSelection.php'); +require_once('model/Stream.php'); +require_once('model/Relive.php'); +require_once('model/Upcoming.php'); - if($info['extension'] == 'php') - return $info['filename']; - }, scandir('configs/clients/')))); +$route = @$_GET['route']; +$route = rtrim($route, '/'); +@list($mandator, $route) = explode('/', $route, 2); +if(!$mandator) +{ + // root requested - if(count($clients) == 0) + if(Conferences::getActiveConferencesCount() == 0) { // no clients // error - die('no clients'); + var_dump('no clients'); + exit; } - else if(count($clients) == 1) + else if(Conferences::getActiveConferencesCount() == 1) { // one client // redirect - header('Location: '.baseurl().$clients[0].'/'); + $clients = Conferences::getActiveConferences(); + header('Location: '.forceslash( baseurl() . $clients[0] )); exit; } else @@ -42,35 +54,23 @@ if($route == '') // show overview // TODO Template - print_r($clients); + $clients = Conferences::getActiveConferences(); + var_dump('multiple clients'); + var_dump($clients); exit; } } -else +else if(!Conferences::exists($mandator)) { - list($client, $route) = explode('/', $route, 2); - - $GLOBALS['CLIENT'] = $client; - require_once('configs/clients/'.$client.'.php'); + // old url OR wrong client OR + // -> error + die('unknown conference '.$mandator); } +Conferences::load($mandator); -require_once('lib/PhpTemplate.php'); -require_once('lib/Exceptions.php'); -require_once('lib/less.php/Less.php'); - -require_once('model/ModelBase.php'); -require_once('model/Conference.php'); -require_once('model/Feedback.php'); -require_once('model/Schedule.php'); -require_once('model/Overview.php'); -require_once('model/Room.php'); -require_once('model/RoomTab.php'); -require_once('model/RoomSelection.php'); -require_once('model/Stream.php'); -require_once('model/Relive.php'); -require_once('model/Upcoming.php'); +// PER-CONFERENCE CODE $conference = new Conference(); $tpl = new PhpTemplate('template/page.phtml'); @@ -96,7 +96,7 @@ if(startswith('//', @$GLOBALS['CONFIG']['BASEURL'])) ob_start(); try { - + // ALWAYS AVAILABLE ROUTES if($route == 'feedback/read') { require('view/feedback-read.php'); @@ -114,29 +114,25 @@ try { else if($route == 'gen/main.css') { - $dir = forceslash(sys_get_temp_dir()); - - $css_file = Less_Cache::Get([ - 'assets/css/main.less' => '../../assets/css/', - ], [ - 'sourceMap' => true, - 'compress' => true, - 'relativeUrls' => true, - - 'cache_dir' => $dir, - ]); - - $css = file_get_contents($dir.$css_file); - header('Content-Type: text/css'); - header('Content-Length: '.strlen($css)); - print($css); + if(Conferences::hasCustomStyles($mandator)) + { + handle_lesscss_request( + Conferences::getCustomStyles($mandator), + '../../'.Conferences::getCustomStylesDir($mandator) + ); + } + else { + handle_lesscss_request('assets/css/main.less', '../../assets/css/'); + } } + // HAS-NOT-BEGUN VIEW else if(!$conference->hasBegun()) { require('view/not-started.php'); } + // ROUTES AVAILABLE AFTER BUT NOT BEFORE THE CONFERENCE else if(preg_match('@^relive/([0-9]+)$@', $route, $m)) { $_GET = array( @@ -150,11 +146,14 @@ try { require('view/relive.php'); } + + // HAS-ENDED VIEW else if($conference->hasEnded()) { require('view/closed.php'); } + // ROUTES AVAILABLE ONLY DURING THE CONFERENCE else if($route == '') { require('view/overview.php'); @@ -226,6 +225,7 @@ try { require('view/embed.php'); } + // UNKNOWN ROUTE else { throw new NotFoundException(); diff --git a/lib/helper.php b/lib/helper.php index eb9fc6d..0d4d868 100644 --- a/lib/helper.php +++ b/lib/helper.php @@ -18,14 +18,14 @@ function baseurl() if(startswith('//', $base)) $base = proto().':'.$base; - return forceslash($base.'/'.$GLOBALS['CLIENT']); + return forceslash(forceslash($base).@$GLOBALS['MANDATOR']); } $base = ssl() ? 'https://' : 'http://'; $base .= $_SERVER['HTTP_HOST']; $base .= forceslash(dirname($_SERVER['SCRIPT_NAME'])); - return forceslash($base.$GLOBALS['CLIENT']); + return forceslash(forceslash($base).@$GLOBALS['MANDATOR']); } function forceslash($url) @@ -41,3 +41,23 @@ function startswith($needle, $haystack) { return substr($haystack, 0, strlen($needle)) == $needle; } + +function handle_lesscss_request($lessfile, $relative_path) +{ + $dir = forceslash(sys_get_temp_dir()); + + $css_file = Less_Cache::Get([ + $lessfile => $relative_path, + ], [ + 'sourceMap' => true, + 'compress' => true, + 'relativeUrls' => true, + + 'cache_dir' => $dir, + ]); + + $css = file_get_contents($dir.$css_file); + header('Content-Type: text/css'); + header('Content-Length: '.strlen($css)); + print($css); +} diff --git a/model/Conferences.php b/model/Conferences.php new file mode 100644 index 0000000..05d3c52 --- /dev/null +++ b/model/Conferences.php @@ -0,0 +1,59 @@ +<?php + +class Conferences extends ModelBase +{ + const MANDATOR_DIR = 'configs/conferences/'; + + public static function getConferences() { + return array_values(array_filter(scandir(forceslash(Conferences::MANDATOR_DIR)), function($el) { + return $el[0] != '.'; + })); + } + public static function getConferencesCount() { + return count(Conferences::getConferences()); + } + + public static function getActiveConferences() { + return array_values(array_filter( + Conferences::getConferences(), ['Conferences', 'isActive'] + )); + } + + public static function getActiveConferencesCount() { + return count(Conferences::getActiveConferences()); + } + + public static function exists($mandator) { + return in_array($mandator, Conferences::getConferences()); + } + + public static function isActive($mandator) { + if(isset($GLOBALS['CONFIG'])) + $saved_config = $GLOBALS['CONFIG']; + + Conferences::load($mandator); + $conf = new Conference(); + $active = !$conf->isClosed(); + unset($GLOBALS['CONFIG']); + + if(isset($saved_config)) + $GLOBALS['CONFIG'] = $saved_config; + + return $active; + } + + public static function hasCustomStyles($mandator) { + return file_exists(Conferences::getCustomStyles($mandator)); + } + public static function getCustomStyles($mandator) { + return forceslash(Conferences::getCustomStylesDir($mandator)).'main.less'; + } + public static function getCustomStylesDir($mandator) { + return forceslash(Conferences::MANDATOR_DIR).forceslash($mandator); + } + + public static function load($mandator) { + $GLOBALS['MANDATOR'] = $mandator; + include(forceslash(Conferences::MANDATOR_DIR).forceslash($mandator).'config.php'); + } +} diff --git a/template/page.phtml b/template/page.phtml index bd73065..37f192a 100644 --- a/template/page.phtml +++ b/template/page.phtml @@ -29,20 +29,20 @@ <base href="<?=h($baseurl)?>" /> <link href="<?=h($canonicalurl)?>" rel="canonical" /> - <link href="assets/img/apple-touch-icon.png" rel="apple-touch-icon" /> - <link href="assets/img/favicon.png" rel="icon" type="image/png" /> + <link href="../assets/img/apple-touch-icon.png" rel="apple-touch-icon" /> + <link href="../assets/img/favicon.png" rel="icon" type="image/png" /> - <link type="text/css" rel="stylesheet" href="assets/mejs/mediaelementplayer.min.css" /> + <link type="text/css" rel="stylesheet" href="../assets/mejs/mediaelementplayer.min.css" /> <link type="text/css" rel="stylesheet" href="gen/main.css" /> - <script type="text/javascript" src="assets/js/lib/jquery.min.js"></script> - <script type="text/javascript" src="assets/js/lib/jquery.scrollTo.min.js"></script> - <script type="text/javascript" src="assets/js/lib/bootstrap.min.js"></script> - <script type="text/javascript" src="assets/js/lib/bootstrap-datepicker.min.js"></script> - <script type="text/javascript" src="assets/js/lib/moment.min.js"></script> + <script type="text/javascript" src="../assets/js/lib/jquery.min.js"></script> + <script type="text/javascript" src="../assets/js/lib/jquery.scrollTo.min.js"></script> + <script type="text/javascript" src="../assets/js/lib/bootstrap.min.js"></script> + <script type="text/javascript" src="../assets/js/lib/bootstrap-datepicker.min.js"></script> + <script type="text/javascript" src="../assets/js/lib/moment.min.js"></script> - <script type="text/javascript" src="assets/mejs/mediaelement-and-player.min.js"></script> - <script type="text/javascript" src="assets/js/lustiges-script.js"></script> + <script type="text/javascript" src="../assets/mejs/mediaelement-and-player.min.js"></script> + <script type="text/javascript" src="../assets/js/lustiges-script.js"></script> </head> <body class="<?=h(is_numeric($page[0]) ? 'e'.$page : $page)?>"> <? if(!@$naked): ?> |