Merge branch 'homepage' of https://gitea.cwsvjudo.dedyn.io/marko/cwsvJudo into homepage

This commit is contained in:
marko
2023-12-23 15:03:35 +01:00
30 changed files with 716 additions and 184 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

View File

@@ -13,31 +13,44 @@
</style> </style>
<h2 style="text-align:center;">Herzlich Willkommen auf der offiziellen Homepage des Chemnitzer Freizeit- und <h2 style="text-align:center;">Herzlich Willkommen auf der offiziellen Homepage des Chemnitzer Freizeit- und
Wohngebietssportverein e. V.</h2> Wohngebietssportverein e. V.</h2>
<!-- Eine kleiner Bereich für aktuelle Neuigkeiten--> <!-- Eine kleiner Bereich für aktuelle Neuigkeiten--> <!-- Nicht zu vieles, aktuell halten!!!-->
<!-- Nicht zu vieles, aktuell halten!!!-->
<!-- Idee: jede News ist eine h4-Überschrift und ein center-Element in einer div--> <!-- Idee: jede News ist eine h4-Überschrift und ein center-Element in einer div-->
<!-- Idee: nur centerElement, wenn es nur ein Bild ist. Text sollte linksbündig sein.--> <!-- Idee: nur centerElement, wenn es nur ein Bild ist. Text sollte linksbündig sein.-->
<!--Verleihung des Ehren-Chemmys--> <!-- Gewinner Sportvereinswettbewerb -->
<div class="newsBox"> <div class="newsBox">
<h4>Normaler Trainingsbetrieb</h4> <h4>Gewinner Sportvereinswettbewerb</h4>
<hr /> <hr />
<center> Der Trainingsbetrieb findet derzeit ohne Einschr&auml;nkungen statt. </center> <center>Der Chemnitzer Freizeit- und Wohngebietssportverein ist Gewinner im <a
href="https://www.so-geht-saechsisch.de/gewinner-vereinssportwettbewerb">Sportvereinswettbewerb des
Landessportbundes Sachsen</a></center>
<div style="text-align:center;">
<a href="https://www.so-geht-saechsisch.de/gewinner-vereinssportwettbewerb">
<img src="https://img.webme.com/pic/c/cwsv-sport/preisverleihung-sportvereinswettbewerb-2023.jpg"
title="Ehrung Chemnitzer WSV Sportvereinswettbewerb 2023" style="width:100%;"
alt="Ehrung Chemnitzer WSV Sportvereinswettbewerb 2023" hspace="25" />
</a>
</div>
<div style="text-align:center;">
<a href="https://www.so-geht-saechsisch.de/gewinner-vereinssportwettbewerb">
<img src="https://img.webme.com/pic/c/cwsv-sport/sportvereinswettbewerb-2023.png"
title="Gewinner Sportvereinswettbewerb 2023" style="width:100%;"
alt="Gewinner Sportvereinswettbewerb 2023" hspace="25" />
</a>
</div>
</div> </div>
<hr /> <hr />
<!-- Spenden Button--> <!-- Spenden Button--> <!-- Sollte vlt. nach corona nicht mehr so präsent mittig plaziert werden -->
<!-- Sollte vlt. nach corona nicht mehr so präsent mittig plaziert werden -->
<div style="display: flex;justify-content: center;" align="center"> <div style="display: flex;justify-content: center;" align="center">
<form action="https://www.paypal.com/donate" method="post" target="_top"> <form action="https://www.paypal.com/donate" method="post" target="_top">
<input type="hidden" name="hosted_button_id" value="8RYJXHP5X53LA" /> <input type="image" <input type="hidden" name="hosted_button_id" value="8RYJXHP5X53LA" /> <input type="image"
src="&#xA;https://www.paypalobjects.com/de_DE/DE/i/btn/btn_donateCC_LG.gif" name="submit" src="&#xA;https://www.paypalobjects.com/de_DE/DE/i/btn/btn_donateCC_LG.gif" name="submit"
title="PayPal - The safer, easier way to pay&#xA;online!" alt="Donate with PayPal button" border="0" /> <img title="PayPal - The safer, easier way to pay&#xA;online!" alt="Donate with PayPal button" border="0" /> <img
alt="" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" style="display: none !important;" x3i433pnl="" alt="" src="https://www.paypal.com/de_DE/i/scr/pixel.gif" style="display: none !important;" x3i433pnl=""
d22q4wuy3="" xmqo9fcaa="" width="1" hidden="" height="1" border="0" /> d22q4wuy3="" xmqo9fcaa="" pv56i2hu5="" width="1" hidden="" height="1" border="0" />
</form> </form>
</div> </div>
<h3 style="text-align:center;">CWSV e.V. - Sport f&uuml;r jedermann</h3> <h3 style="text-align:center;">CWSV e.V. - Sport f&uuml;r jedermann</h3>
<div style="text-align:center;"> <div style="text-align:center;"><!--Automatisches Weihnachts- und Sylvesterlogo-->
<!--Automatisches Weihnachts- und Sylvesterlogo-->
<script language="JavaScript"> <script language="JavaScript">
function getSeasonBanner() { function getSeasonBanner() {
var curDateTime = new Date() var curDateTime = new Date()
@@ -52,8 +65,7 @@
} }
document.write(getSeasonBanner()) document.write(getSeasonBanner())
</script> </script> <!--Standardlogo, falls kein JavaScript verfügbar ist--> <noscript>
<!--Standardlogo, falls kein JavaScript verfügbar ist--> <noscript>
<img src="//img.webme.com/pic/c/cwsv-sport/cwsvLogo.x300.png" height="300" hspace="25" alt="CWSV e. V." /> <img src="//img.webme.com/pic/c/cwsv-sport/cwsvLogo.x300.png" height="300" hspace="25" alt="CWSV e. V." />
</noscript> <a href="http://www.integration-durch-sport.de"> <img </noscript> <a href="http://www.integration-durch-sport.de"> <img
src="//img.webme.com/pic/c/cwsv-sport/IntegrationDurchSport-2022.png" src="//img.webme.com/pic/c/cwsv-sport/IntegrationDurchSport-2022.png"

View File

@@ -44,4 +44,4 @@ participo::init($cwsvJudoConfig);
</main> </main>
</body> </body>
</html> </html>

View File

@@ -1,33 +1,32 @@
<?php <?php
setlocale (LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge'); setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
set_include_path(get_include_path() . PATH_SEPARATOR . "./lib/"); set_include_path(get_include_path() . PATH_SEPARATOR . './lib/');
require_once("participoLib/participo.php"); require_once 'participoLib/participo.php';
require_once("participoLib/planer.php"); require_once 'participoLib/planer.php';
require_once("config/participo.php"); require_once 'config/participo.php';
require_once("./local/dbConf.php"); require_once './local/dbConf.php';
require_once("./local/cwsvJudo.php"); require_once './local/cwsvJudo.php';
require_once("./lib/db.php"); require_once './lib/db.php';
require_once("./lib/api.php"); require_once './lib/api.php';
require_once($config['basePath']."/config/cwsvJudo.config.php"); require_once $config['basePath'] . '/config/cwsvJudo.config.php';
dbConnector::connect( dbConnector::connect(
$cwsvJudoConfig["db"]["host"], $cwsvJudoConfig['db']['host'],
$cwsvJudoConfig["db"]["name"], $cwsvJudoConfig['db']['name'],
$cwsvJudoConfig["db"]["user"], $cwsvJudoConfig['db']['user'],
$cwsvJudoConfig["db"]["password"] $cwsvJudoConfig['db']['password']
); );
participo::authentificate(); participo::authentificate();
$userData = getUserData(dbConnector::getDbConnection(), $_SESSION['user']['userId']); $userData = getUserData(dbConnector::getDbConnection(), $_SESSION['user']['userId']);
$meta = array( $meta = [
'title' => "Event Planer", 'title' => 'Event Planer',
'description' => "Planung von (Nicht-)Teilnahmen an Wettkämpfen und anderen Veranstaltungen" 'description' => 'Planung von (Nicht-)Teilnahmen an Wettkämpfen und anderen Veranstaltungen'
); ];
?>

View File

@@ -2,16 +2,14 @@
<div> <div>
<nav class="indigo darken-4"> <nav class="indigo darken-4">
<div class="nav-wrapper"> <div class="nav-wrapper">
<div class="col s12"> <a href="http://cwsvjudo.bplaced.net/participo" class="breadcrumb">cwsvJudo-Apps</a>
<a href="http://cwsvjudo.bplaced.net/participo" class="breadcrumb">cwsvJudo-Apps</a> <a href="http://cwsvjudo.bplaced.net/participo/events" class="breadcrumb">
<a href="http://cwsvjudo.bplaced.net/participo/events" class="breadcrumb"> <?php echo($meta['title']); ?>
<?php echo($meta['title']); ?> </a>
</a> <a class="right top-nav sidenav-trigger waves-effect waves-light hide-on-large-only" href="#"
<a class="right top-nav sidenav-trigger waves-effect waves-light hide-on-large-only" href="#" data-target="nav-mobile">
data-target="nav-mobile"> <i class="material-icons">menu</i>
<i class="material-icons">menu</i> </a>
</a>
</div>
</div> </div>
<a class="right top-nav sidenav-trigger waves-effect waves-light hide-on-large-only" href="#" <a class="right top-nav sidenav-trigger waves-effect waves-light hide-on-large-only" href="#"

View File

@@ -1,4 +1,5 @@
<?php <?php
function createDb($dbConnection){ function createDb($dbConnection){
<<<SQL <<<SQL
CREATE TABLE `cwsvjudo`.`anwesenheit` ( CREATE TABLE `cwsvjudo`.`anwesenheit` (

View File

@@ -93,10 +93,32 @@ class Event
return $this->shiai; return $this->shiai;
} }
public static function loadFromDb(int $id) /** load the Event by id from the db
*
* - Frontend function: sanitizes the input and calls the backend function
*
* @param integer>0 $id id of the Event to load from the data base
* @return Event Event from the db with this id, null in case the Event couldn't be loaded
*/
public static function loadFromDb($id)
{ {
$id = filterId($id); $id = filterId($id);
if ($id) {
return self::loadFromDbById($id);
}
return null;
}
/**
* loads an event from the db by id
*
* - Backend function, input is supposed to be sanitized
*
* @param integer>0 $id sanitized id of the event to load
* @return Event Event from the db with this id, null in case the Event couldn't be loaded
*/
private static function loadFromDbById(int $id)
{
$query = 'SELECT * FROM `cwsvjudo`.`wkParticipo_Events` WHERE `id` = :id;'; $query = 'SELECT * FROM `cwsvjudo`.`wkParticipo_Events` WHERE `id` = :id;';
$params = [':id' => ['value' => $id, 'data_type' => PDO::PARAM_INT]]; $params = [':id' => ['value' => $id, 'data_type' => PDO::PARAM_INT]];
$response = dbConnector::query($query, $params); $response = dbConnector::query($query, $params);
@@ -108,6 +130,16 @@ class Event
return self::fromDbArray($response[0]); return self::fromDbArray($response[0]);
} }
public function htmlDate($format = 'Y-m-d')
{
return $this->date->format($format);
}
public function htmlDeadLine($format = 'Y-m-d')
{
return $this->deadline->format($format);
}
/** Representation of an event as (materializeCss) card /** Representation of an event as (materializeCss) card
* *
* @return string string with the html code of the event * @return string string with the html code of the event
@@ -121,9 +153,9 @@ class Event
'<span class="card-title">' . $shiai->getHtmlName() . '</span>' . '<span class="card-title">' . $shiai->getHtmlName() . '</span>' .
'<dl>' . '<dl>' .
'<dt>Datum</dt>' . '<dt>Datum</dt>' .
'<dd>' . $this->date->format('Y-m-d') . '</dd>' . '<dd>' . $this->htmlDate() . '</dd>' .
'<dt>Einschreibefrist</dt>' . '<dt>Einschreibefrist</dt>' .
'<dd>' . $this->deadline->format('Y-m-d') . '</dd>' . '<dd>' . $this->htmlDeadLine() . '</dd>' .
'<dt>Altersklassen</dt>' . '<dt>Altersklassen</dt>' .
'<dd>' . $this->shiai()->getHtmlDescriptiveAgeClasses() . '</dd>' . '<dd>' . $this->shiai()->getHtmlDescriptiveAgeClasses() . '</dd>' .
'</dl>' . '</dl>' .
@@ -131,12 +163,23 @@ class Event
'</div>'; '</div>';
} }
public function getHtmlEventDetails()
{
$html .= '<dl>';
$html .= '<dt>Datum</dt><dd>' . $this->event()->htmlDate() . '</dd>';
$html .= '<dt>Deadline zum Einschreiben:</dt><dd>' . $this->event()->htmlDeadline() . '</dd>';
$html .= '</dl>';
$html .= $this->event()->shiai()->getHtml();
$html .= $this->event()->getHtmlStarterStatistic();
$html .= $this->event()->getHtmlStarterList();
}
public function htmlTableRow() public function htmlTableRow()
{ {
$shiai = $this->shiai(); $shiai = $this->shiai();
return return
'<tr>' . '<tr>' .
'<td>' . $this->date->format('Y-m-d') . '</td>' . '<td>' . $this->htmlDate() . '</td>' .
'<td><a href="/participo/events#' . $this->id . '" >' . $shiai->getHtmlName() . '</a></td>' . '<td><a href="/participo/events#' . $this->id . '" >' . $shiai->getHtmlName() . '</a></td>' .
'<td>' . $shiai->getHtmlDescriptiveAgeClasses() . '</td>' . '<td>' . $shiai->getHtmlDescriptiveAgeClasses() . '</td>' .
'<td><a class="waves-effect waves-light btn modal-trigger" href="#event-modal-' . $this->id . '"><i class="material-icons">zoom_in</i></a></td>' . '<td><a class="waves-effect waves-light btn modal-trigger" href="#event-modal-' . $this->id . '"><i class="material-icons">zoom_in</i></a></td>' .
@@ -149,10 +192,13 @@ class Event
'<div id="event-modal-' . $this->id . '" class="modal black-text">' '<div id="event-modal-' . $this->id . '" class="modal black-text">'
. '<div class="modal-content">' . '<div class="modal-content">'
. $this->shiai->getHtml() . $this->shiai->getHtml()
. '<hr />'
. $this->getHtmlStarterStatistic() . $this->getHtmlStarterStatistic()
. $this->getHtmlStarterList(); . '<hr />'
. $this->getHtmlStarterList()
. '<hr />';
$modal .= '<div class="row">'; $modal .= '<div class="row">';
$modal .= '<div class="s12">Deadline zum Eintragen: ' . $this->deadline->format('Y-m-d') . '</div>'; $modal .= '<div class="s12">Deadline zum Eintragen: ' . $this->htmlDeadLine() . '</div>';
$today = new DateTime(); $today = new DateTime();
if ( if (
@@ -163,13 +209,6 @@ class Event
foreach ($kids as $k) { foreach ($kids as $k) {
$modal .= $this->getHtmlAddStarterForm($k, ['returnToUrl' => '/participo/events#' . $this->id]); $modal .= $this->getHtmlAddStarterForm($k, ['returnToUrl' => '/participo/events#' . $this->id]);
} }
// foreach ($this->shiai()->ageGroups() as $ageClass => $starterList) {
// // $modal .= '<h3>' . $ageClass ?? 'keiner Altersklasse zugeordnet' . '</h3>';
// foreach ($starterList as $starter) {
// $modal .= $this->getHtmlAddStarterForm($k, ['returnToUrl' => '/participo/events#' . $this->id]);
// }
// }
} else { } else {
$modal .= '<div>Es ist leider zu spät noch jemanden einzutragen!</div>'; $modal .= '<div>Es ist leider zu spät noch jemanden einzutragen!</div>';
} }
@@ -178,7 +217,7 @@ class Event
$modal .= $modal .=
'</div>' . // end modal-content '</div>' . // end modal-content
'<div class="modal-footer">' . '<div class="modal-footer">' .
'<a href="/pages/desktop/wkParticipo/showWkEvent.php?eventId=' . $this->id . '" class="modal-close waves-effect waves-green btn-flat">Zum Event im Planer</a>' . '<a href="/pages/desktop/wkParticipo/showWkEvent.php?eventId=' . $this->id . '" class="modal-close waves-effect waves-green btn-flat">Zum Event im alten Planer</a>' .
'<a href="#!" class="modal-close waves-effect waves-green btn-flat">Schließen</a>' . '<a href="#!" class="modal-close waves-effect waves-green btn-flat">Schließen</a>' .
'</div>' . // end modal-footer '</div>' . // end modal-footer
'</div>'; '</div>';
@@ -209,7 +248,7 @@ class Event
* *
* @todo docu * @todo docu
*/ */
private function getStarter() public function getStarter()
{ {
$userId = $_SESSION['user']['userId'] ?? null; $userId = $_SESSION['user']['userId'] ?? null;
@@ -224,7 +263,7 @@ class Event
$starter = []; $starter = [];
foreach ($response as $r) { foreach ($response as $r) {
$starter[] = Starter::loadFromDb($r['starterId']); $starter[$r['starterId']] = Starter::loadFromDb($r['starterId']);
} }
return $starter; return $starter;
} }
@@ -253,16 +292,21 @@ class Event
public function getHtmlStarterStatistic() public function getHtmlStarterStatistic()
{ {
$isEmpty = true;
$retHtml = '<dl>'; $retHtml = '<dl>';
foreach ([StartingType::Fighter, StartingType::NoParticipation, StartingType::Audience] as $type) { foreach ([StartingType::Fighter, StartingType::NoParticipation, StartingType::Audience] as $type) {
$count = $this->getStarterCount($type); $count = $this->getStarterCount($type);
if ($count > 0) { if ($count > 0) {
$isEmpty = false;
$retHtml .= '<dt>' . StartingType::$AsString[$type] . '</dt><dd>' . $count . '</dd>'; $retHtml .= '<dt>' . StartingType::$AsString[$type] . '</dt><dd>' . $count . '</dd>';
} }
} }
$retHtml .= '<dt>Mitfahrgelegenheiten</dt><dd>' . $this->getSeatCount() . '</dd>'; if ($this->getSeatCount() > 0) {
$isEmpty = false;
$retHtml .= '<dt>Mitfahrgelegenheiten</dt><dd>' . $this->getSeatCount() . '</dd>';
}
$retHtml .= '</dl>'; $retHtml .= '</dl>';
return $retHtml; return $isEmpty ? '' : $retHtml;
} }
public static function fromDbArray($member) public static function fromDbArray($member)
@@ -308,7 +352,7 @@ class Event
{ {
$defaults = [ $defaults = [
'formClass' => 's12 m6 xl3', 'formClass' => 's12 m6 xl3',
'inputClass' => 'input-field col s12', 'inputClass' => 'col s12',
'buttonClass' => 'btn' 'buttonClass' => 'btn'
]; ];
@@ -325,14 +369,29 @@ class Event
. '<input type="hidden" name="userId" id="userId" value="' . $user->getId() . '">' . '<input type="hidden" name="userId" id="userId" value="' . $user->getId() . '">'
. '<input type="hidden" name="returnToUrl" id="returnToUrl" value="' . $returnToUrl . '" >' . '<input type="hidden" name="returnToUrl" id="returnToUrl" value="' . $returnToUrl . '" >'
. '<div class="' . $options['inputClass'] . '">' . '<div class="' . $options['inputClass'] . '">'
. '<label for="' . $selectId . '">' . $user->getName() . ', ' . $user->getFirstname() . '</label>' . '<fieldset id="' . $selectId . '>'
. '<select id="' . $selectId . '" name="type">' . '<label for="' . $selectId . '">' . $user->getName() . ', ' . $user->getFirstname() . '</label>'
. '<option value="1" selected="">als Starter</option>' . '<p>'
. '<option value="2">als Zuschauer</option>' . '<label for="' . $selectId . '-asStarter">'
. '<option value="3">keine Teilnahme</option>' . '<input name="type" type="radio" id="' . $selectId . '-asStarter" value="1" />'
. '</select>' . '<span>als Starter</span>'
. '</label>'
. '</p>'
. '<p>'
. '<label for="' . $selectId . '-asWatcher">'
. '<input name="type" type="radio" id="' . $selectId . '-asWatcher" value="2" />'
. '<span>als Zuschauer</span>'
. '</label>'
. '</p>'
. '<p>'
. '<label for="' . $selectId . '-asNone">'
. '<input name="type" type="radio" id="' . $selectId . '-asNone" value="3" checked />'
. '<span>keine Teilnahme</span>'
. '</label>'
. '</p>'
. '<input class="' . $options['buttonClass'] . '" type="submit" name="submit" value="eintragen" />'
. '</fieldset>'
. '</div>' . '</div>'
. '<input class="' . $options['buttonClass'] . '" type="submit" name="submit" value="eintragen">'
. '</form>'; . '</form>';
return $form; return $form;

View File

@@ -0,0 +1,96 @@
<?php
class EventPage
{
public function __construct($eventId = null)
{
$this->eventId = filterId($eventId);
}
public function init()
{
$params = participo::parseParams(
['eventId' => function ($param) {return filterId($param); }]
);
$this->eventId = $params['eventId'];
return;
}
public function getHtmlNotFound()
{
return '<div>Der Event "' . $this->id . '" existiert leider nicht!</div>'
. '<h2>Anstehende Termine</h2>'
. eventPlaner::getHtmlEventTable(
eventPlaner::getComingWkEvents()
);
}
public function getHtml()
{
if (!$this->event()) {
return $this->getHtmlNotFound();
}
$html = '';
$html .=
'<div>'
. '<dl>'
. '<dt>Termine</dt>'
. '<dd>
<dl>'
. '<dt>Datum</dt><dd>' . $this->event()->htmlDate() . '</dd>'
. '<dt>Deadline zum Einschreiben:</dt><dd>' . $this->event()->htmlDeadline() . '</dd>'
. '</dl>';
// Not all Events have a shiai linked to them
if ($this->event()->shiai()) {
$html .=
'<dt>Wettkampfdetails</dt><dd>' . $this->event()->shiai()->getHtmlDetails() . '</dd>';
}
$html .=
'<dt>Einschreibungen</dt><dd>' . $this->event()->getHtmlStarterStatistic() . '</dd>'
. '<dt>Eigene, gemeldete Starter</dt><dd>' . $this->event()->getHtmlStarterList() . '</dd>'
. '</dl>'
. '</div>';
$html .=
'<div>';
foreach ($this->event()->shiai()->ageGroups() as $ageClass => $starterList) {
$html .=
'<dl>' .
'<dt>' . (!empty($ageClass) ? $ageClass : 'keiner Altersklasse zugeordnet') . '</dt>'
. '<dd>
<ul>';
foreach ($starterList as $starter) {
if (!array_key_exists($starter->getId(), $this->event()->getStarter())) {
$html .=
'<li>' . $starter->getName() . ', ' . $starter->getFirstname() . ' - ' . $starter->yearOfBirth() . '
</li>';
}
}
$html .= '
</dd>
</ul>';
}
$html .= '</div>';
return $html;
}
public function html()
{
echo($this->getHtml());
}
private function event(bool $forceLoading = false)
{
if (!$this->event || $forceLoading) {
$this->event = Event::loadFromDb($this->eventId);
}
return $this->event;
}
private $eventId = null;
private $event = null;
}

View File

@@ -2,12 +2,29 @@
require_once 'participoLib/dbConnector.php'; require_once 'participoLib/dbConnector.php';
require_once 'participoLib/user.php'; require_once 'participoLib/user.php';
require_once 'participoLib/event.php';
require_once 'participoLib/eventPage.php';
require_once 'participoLib/starter.php';
require_once 'participoLib/planer.php';
/** /**
* FrameWork for the participoApp * FrameWork for the participoApp
*/ */
class participo class participo
{ {
/** a page describing an event */
private static $eventPage = null;
/** getter for the eventPage, creates a new one if not already created */
public static function eventPage()
{
if (!self::$eventPage) {
self::$eventPage = new EventPage();
}
self::$eventPage->init();
return self::$eventPage;
}
private static $db = null; private static $db = null;
private static $message = ['error' => null, 'success' => null, 'notice' => null]; private static $message = ['error' => null, 'success' => null, 'notice' => null];
@@ -131,6 +148,64 @@ class participo
} }
} }
/** Initialize the participoApp
*
* - validate the login
* - init the db connection
*
* @param [type] $config
* @return void
*/
public static function init($config)
{
self::authentificate();
self::initDb(
$config['db']['host'],
$config['db']['name'],
$config['db']['user'],
$config['db']['password']
);
}
private static function initDb($host, $name, $user, $password)
{
dbConnector::connect($host, $name, $user, $password);
}
/** Framework to parse parameters get/post requests
*
* - Each param given in to this function is looked up in the request and put through the parsing function.
* - Params in the request that aren't in given a parsing function aren't parsed and hence not returned.
*
* @param [array(paramName => parseFunction)] $params array of the name of the param and a sanitizer/parsing/input function
* @return array(parsedParam=>paramValue) Associative array of the name of the param and its parsed value
*/
public static function parseParams($params)
{
$method = $_SERVER['REQUEST_METHOD'];
$request = explode('/', substr(@$_SERVER['PATH_INFO'], 1));
$parsedParams = [];
foreach ($params as $paramName => $parseFunction) {
$parsedParams[$paramName] = null;
switch ($method) {
// case 'PUT':
// do_something_with_put($request);
// break;
case 'POST':
$parsedParams[$paramName] = $parseFunction($_POST[$paramName]);
break;
case 'GET':
$parsedParams[$paramName] = $parseFunction($_GET[$paramName]);
break;
default:
// handle_error($request);
break;
}
}
return $parsedParams;
}
public static function getMessages() public static function getMessages()
{ {
return self::$message; return self::$message;
@@ -209,8 +284,13 @@ class participo
$query = $query =
'SELECT * FROM `wkParticipo_Users` ' 'SELECT * FROM `wkParticipo_Users` '
. 'INNER JOIN `vormundschaft` ON `wkParticipo_Users`.`id` = `vormundschaft`.`kidId` ' . 'INNER JOIN `vormundschaft` '
. 'WHERE `vormundschaft`.`userId` = :userId;'; . 'ON `wkParticipo_Users`.`id` = `vormundschaft`.`kidId` '
. 'INNER JOIN `wkParticipo_user<=>userAttributes` '
. 'ON `wkParticipo_Users`.`id` = `wkParticipo_user<=>userAttributes`.`userId`'
. 'WHERE `vormundschaft`.`userId` = :userId '
. 'AND `vormundschaft`.`userId` = :userId '
. 'AND `wkParticipo_user<=>userAttributes`.`attributeId` = 4;';
$params = [':userId' => ['value' => $userId, 'data_type' => PDO::PARAM_INT]]; $params = [':userId' => ['value' => $userId, 'data_type' => PDO::PARAM_INT]];
$response = dbConnector::query($query, $params); $response = dbConnector::query($query, $params);

View File

@@ -58,6 +58,16 @@ class Shiai
return ($this->place != null ? $this->place : '-'); return ($this->place != null ? $this->place : '-');
} }
public function getAnnouncementUrl()
{
return $this->announcementUrl;
}
public function getRouteUrl()
{
return $this->routeUrl;
}
public static function loadFromDb(int $id) public static function loadFromDb(int $id)
{ {
$id = filterId($id); $id = filterId($id);
@@ -97,16 +107,28 @@ class Shiai
$retHtml = ''; $retHtml = '';
$retHtml = $retHtml =
'<div>' . '<div>' .
'<h3>' . $this->getHtmlName() . '</h3>' . '<h3><a href="' . $this->announcementUrl . '">' . $this->getHtmlName() . '</a></h3>' .
'<dl>' . '<dl>' .
'<dt>Datum</dt><dd>' . $this->getHtmlDate() . '</dd>' . '<dt>Datum</dt><dd>' . $this->getHtmlDate() . '</dd>' .
'<dt>Altersklassen</dt><dd>' . $this->getHtmlDescriptiveAgeClasses() . '</dd>' . '<dt>Altersklassen</dt><dd>' . $this->getHtmlDescriptiveAgeClasses() . '</dd>' .
'<dt>Ort</dt><dd>' . $this->getPlace() . '</dd>' . '<dt>Ort</dt><dd><a href="' . $this->routeUrl . '">' . $this->getPlace() . '</a></dd>' .
'</dl>' . '</dl>' .
'</div>'; '</div>';
return $retHtml; return $retHtml;
} }
public function getHtmlDetails()
{
return
'<dl>'
. '<dt>Name</dt><dd><a href="' . $this->announcementUrl . '">' . $this->getHtmlName() . '</a></dd>'
. '<dt>Datum</dt><dd>' . $this->getHtmlDate() . '</dd>'
. '<dt>Altersklassen</dt><dd>' . $this->getHtmlDescriptiveAgeClasses() . '</dd>'
. '<dt>Ort</dt><dd><a href="' . $this->routeUrl . '">' . $this->getPlace() . '</a></dd>' .
'</dl>'
;
}
public function getHtmlDescriptiveAgeClasses() public function getHtmlDescriptiveAgeClasses()
{ {
$retList = []; $retList = [];
@@ -128,121 +150,121 @@ class Shiai
return implode(', ', $retList); return implode(', ', $retList);
} }
/** convert a list of age class formatted strings into a list of intervals of years /** convert a list of age class formatted strings into a list of intervals of years
* *
* @param string $akListString * @param string $akListString
* @param int $year * @param int $year
* @return list[array(int,int)] list of tupels with lower/upper bound in date year of the age classes * @return list[array(int,int)] list of tupels with lower/upper bound in date year of the age classes
*/ */
private static function akListString2jgArray(string $akListString, int $year = null) private static function akListString2jgArray(string $akListString, int $year = null)
{ {
$year = filterPosInt($year) ?? filterPosInt((new DateTime)->format('Y')); $year = filterPosInt($year) ?? filterPosInt((new DateTime)->format('Y'));
$ret = []; $ret = [];
foreach (explode(' ', $akListString) as $ak) { foreach (explode(' ', $akListString) as $ak) {
$ret[$ak] = self::akString2jgIntervall($ak, $year); $ret[$ak] = self::akString2jgIntervall($ak, $year);
}
return $ret;
} }
return $ret;
}
/** convert age class from formatted string to interval of years /** convert age class from formatted string to interval of years
* *
* @param [string] $akString * @param [string] $akString
* @param [type] $year * @param [type] $year
* @return array(int,int) [x,y] with x the lower bound and y the upper bound of the age class in years. Both bounds are still included in the interval. * @return array(int,int) [x,y] with x the lower bound and y the upper bound of the age class in years. Both bounds are still included in the interval.
*/ */
private static function akString2jgIntervall(string $akString, int $year /*= null*/) private static function akString2jgIntervall(string $akString, int $year /*= null*/)
{ {
// input sanitation // input sanitation
$year = filterPosInt($year) ?? filterPosInt((new DateTime)->format('Y')); $year = filterPosInt($year) ?? filterPosInt((new DateTime)->format('Y'));
$ret = [null, null]; $ret = [null, null];
// Matching against the different age class formats // Matching against the different age class formats
// - ..Ux // - ..Ux
// - Jg.x-y // - Jg.x-y
// Case Ux // Case Ux
$akUmatchString = '/(.*)U(.*)/'; $akUmatchString = '/(.*)U(.*)/';
$matches = []; $matches = [];
preg_match($akUmatchString, $akString, $matches); preg_match($akUmatchString, $akString, $matches);
// The found match should cover the whole string. Otherwise it isn't applicable. // The found match should cover the whole string. Otherwise it isn't applicable.
if ($matches[0] == $akString) { if ($matches[0] == $akString) {
// The x in Ux should be a positive integer. // The x in Ux should be a positive integer.
$ageLimit = filterPosInt($matches[2]); $ageLimit = filterPosInt($matches[2]);
if ($ageLimit) { if ($ageLimit) {
$ret[0] = $year - $ageLimit + 1; $ret[0] = $year - $ageLimit + 1;
// lowering the lower bound according to the modifiers // lowering the lower bound according to the modifiers
if ($matches[1] == '') { if ($matches[1] == '') {
$ret[1] = $year - $ageLimit + 2; $ret[1] = $year - $ageLimit + 2;
} elseif ($matches[1] == '-') { } elseif ($matches[1] == '-') {
$ret[1] = $year - $ageLimit + 3; $ret[1] = $year - $ageLimit + 3;
} elseif ($matches[1] == '--') { } elseif ($matches[1] == '--') {
$ret[1] = $year - $ageLimit + 4; $ret[1] = $year - $ageLimit + 4;
} elseif (in_array($matches[1], ['<=', '&le;', '&#x2264;', '&#8804;', '≤'])) { } elseif (in_array($matches[1], ['<=', '&le;', '&#x2264;', '&#8804;', '≤'])) {
$ret[1] = $year; $ret[1] = $year;
}
return $ret;
} }
}
// Case Jg.x-y
$akUmatchString = "/Jg\.(.*)\-{1,2}(.*)/";
$matches = [];
preg_match($akUmatchString, $akString, $matches);
// The found match should cover the whole string. Otherwise it isn't applicable.
if ($matches[0] == $akString) {
$ret[0] = filterPosInt($matches[1]);
$ret[1] = filterPosInt($matches[2]);
return $ret; return $ret;
} }
}
// Case Jg.x-y
$akUmatchString = "/Jg\.(.*)\-(.*)/";
$matches = [];
preg_match($akUmatchString, $akString, $matches);
// The found match should cover the whole string. Otherwise it isn't applicable.
if ($matches[0] == $akString) {
$ret[0] = filterPosInt($matches[1]);
$ret[1] = filterPosInt($matches[2]);
return $ret; return $ret;
} }
return $ret; /** grouping users kids by ageGroups
} *
* @return array(ageGroup => list(users in ageGroup))
/** grouping users kids by ageGroups */
* public function ageGroups()
* @return array(ageGroup => list(users in ageGroup)) {
*/ $kids = participo::getKids();
public function ageGroups() return self::ageClassGrouping($this->ageclasses, $kids);
{
$kids = participo::getKids();
return self::ageClassGrouping($this->ageclasses, $kids);
}
/** grouping users by given age class
*
* @param array $ageClassList as array string representation of age class => [lower year bound, upper year bound]
* @param array $starterList list of starter (User)
* @return array of string representation of age class => array of user in this class
*/
private static function ageClassGrouping(array $ageClassList, array $starterList)
{
$grouping = [];
foreach ($ageClassList as $ageClass => $yearBoundaries) {
$grouping[$ageClass] = [];
} }
$grouping[null] = [];
foreach ($starterList as $starter) { /** grouping users by given age class
$startersAgeClass = $starter->yearOfBirth() ? self::getAgeClassFromYear($starter->yearOfBirth(), $ageClassList) : null; *
array_push($grouping[$startersAgeClass], $starter); * @param array $ageClassList as array string representation of age class => [lower year bound, upper year bound]
} * @param array $starterList list of starter (User)
return $grouping; * @return array of string representation of age class => array of userId=>user in this class
} */
private static function ageClassGrouping(array $ageClassList, array $starterList)
private static function getAgeClassFromYear(int $year, array $ageClassList) {
{ $grouping = [];
foreach ($ageClassList as $ageClass => $yearBoundaries) { foreach ($ageClassList as $ageClass => $yearBoundaries) {
if (($yearBoundaries[0] <= $year) && ($year <= $yearBoundaries[1])) { $grouping[$ageClass] = [];
return $ageClass;
} }
$grouping[null] = [];
foreach ($starterList as $starter) {
$startersAgeClass = $starter->yearOfBirth() ? self::getAgeClassFromYear($starter->yearOfBirth(), $ageClassList) : null;
$grouping[$startersAgeClass][$starter->getId()] = $starter;
}
return $grouping;
}
private static function getAgeClassFromYear(int $year, array $ageClassList)
{
foreach ($ageClassList as $ageClass => $yearBoundaries) {
if (($yearBoundaries[0] <= $year) && ($year <= $yearBoundaries[1])) {
return $ageClass;
}
}
return null;
} }
return null;
}
} // end class shiai } // end class shiai

View File

@@ -0,0 +1,60 @@
[
{
"id": "1",
"loginName": "marko",
"eMail": [
"marko.bunzel@arcor.de"
]
},
{
"id": "77",
"loginName": "elternHaeuberer",
"eMail": [
"julia.haeuberer@gmx.de",
"norman.haeuberer@gmail.com"
]
},
{
"id": "85",
"loginName": "elternGerlach",
"eMail": [
"manja.bunzel@gmx.de"
]
},
{
"id": "96",
"loginName": "elternMaiatska",
"eMail": [
"ice_0605@i.ua"
]
},
{
"id": "103",
"loginName": "elternBoehme",
"eMail": [
"jeannette.boehme@mail.de"
]
},
{
"id": "110",
"loginName": "elternOrtmans",
"eMail": [
"jortmans@gmx.de",
"peter.weissbrod@t-online.de"
]
},
{
"id": "113",
"loginName": "ElternEberlein",
"eMail": [
"jana.eberlein@yahoo.de"
]
},
{
"id": "115",
"loginName": "elternKutschmann",
"eMail": [
"uwe.schwerdtfeger@uni-dortmund.de"
]
}
]

View File

@@ -3,7 +3,7 @@
"id": "1", "id": "1",
"loginName": "marko", "loginName": "marko",
"eMail": [ "eMail": [
"marko.bunzel@arcor.de", "cwsvjudo@arcor.de"
] ]
}, },
{ {
@@ -67,6 +67,7 @@
"id": "94", "id": "94",
"loginName": "elternBritvin", "loginName": "elternBritvin",
"eMail": [ "eMail": [
"britvina.ludmila.76@icloud.com",
"luidmyla60@gmail.com" "luidmyla60@gmail.com"
] ]
}, },
@@ -84,13 +85,6 @@
"jeannette.boehme@mail.de" "jeannette.boehme@mail.de"
] ]
}, },
{
"id": "105",
"loginName": "elternChernov",
"eMail": [
"innaserbina1313@gmail.com"
]
},
{ {
"id": "108", "id": "108",
"loginName": "elternRichter", "loginName": "elternRichter",
@@ -102,7 +96,8 @@
"id": "110", "id": "110",
"loginName": "elternOrtmans", "loginName": "elternOrtmans",
"eMail": [ "eMail": [
"jortmans@gmx.de" "jortmans@gmx.de",
"peter.weissbrod@t-online.de"
] ]
}, },
{ {
@@ -118,5 +113,27 @@
"eMail": [ "eMail": [
"uwe.schwerdtfeger@uni-dortmund.de" "uwe.schwerdtfeger@uni-dortmund.de"
] ]
},
{
"id": "117",
"loginName": "elternLafdhal",
"eMail": [
"BougyuerraKhaoula88@gmail.com"
]
},
{
"id": "119",
"loginName": "elternBondar",
"eMail": [
"bondar.mata@gmail.com"
]
},
{
"id": "121",
"loginName": "elternNodia",
"eMail": [
"tamta.devidze@mail.ru",
"nugzari.nodia@icloud.com"
]
} }
] ]

View File

@@ -0,0 +1,45 @@
[
{
"id": "1",
"loginName": "marko",
"eMail": [
"marko.bunzel@arcor.de"
]
},
{
"id": "96",
"loginName": "elternMaiatska",
"eMail": [
"ice_0605@i.ua"
]
},
{
"id": "103",
"loginName": "elternBoehme",
"eMail": [
"jeannette.boehme@mail.de"
]
},
{
"id": "110",
"loginName": "elternOrtmans",
"eMail": [
"jortmans@gmx.de",
"peter.weissbrod@t-online.de"
]
},
{
"id": "113",
"loginName": "ElternEberlein",
"eMail": [
"jana.eberlein@yahoo.de"
]
},
{
"id": "115",
"loginName": "elternKutschmann",
"eMail": [
"uwe.schwerdtfeger@uni-dortmund.de"
]
}
]

View File

@@ -0,0 +1,12 @@
---
title: Herbstkrümelrandori 2023 - Mediasharing
---
Hier der Link zu den Videos und Bildern des Herbstkrümelrandoris:
- Link: https://magentacloud.de/s/9c5sY4fLcP4NZ38
- Passwort: nnRSoPkT
Wie immer würde ich mich freuen, wenn auch alle anderen ihre gemachten Bilder und Videos mit hochladen.
MsG marko

View File

@@ -0,0 +1,48 @@
---
title: Herbstkrümelrandori 2023
---
# [Herbstkrümelrandori 2023][wk197]
Bitte gebt mir über den Wettkampfplaner Bescheid, wer mitkommen kann und wer nicht! Einmal [hier klicken][wk197] und "Teilnahme" oder "keine Teilnahme" auswählen.
Auch wäre es gut für mich, zu wissen, wer selber fährt, wer noch Platz im Auto hat oder wer selber eine Mitfahrgelegenheit benötigt.
## Wettkampfdaten
- Altersklassen: Jg. 2013 bis 2017
- Datum: [21.10.2023][wk197]
- Ort: [Dreifelder-TH der Goethe-Oberschule Breitenbrunn, Dorfberg 10, 08359 Breitenbrunn][1]
- Wiegen: 9:00--9:45 Uhr
- Wettkampferöffnung: ca. 10:30 Uhr
- [offizielle Ausschreibung (nur zur Info)][0]
## Treffpunkt
- Ort: [P+R Parkplatz Südring/Stollberger Straße][2]
- Abfahrt: 7:15 Uhr
- Kindersitz (die Mitfahrer im Bus) nicht vergessen!
## Nicht vergessen
- Judopass
- Judogi (d. h. Jacke, Hose und Gürtel)
- *Hallenschuhe* (Auch die Fans!)
- Essen/Trinken
- Warme Socken und Pullover
Das Betreten der Sportstätten in Straßenschuhen ist (auch den Fans)
nicht gestattet. Bitte Ersatzschuhe (Badelatschen/Hallenschuhe)
mitbringen. Sonst muss in Socken gegangen werden!
MsG marko
[0]: http://cwsvjudo.bplaced.net/downloads/Ausschreibungen/Ausschreibungen.2023/2023-10-21_HKR_Ausschreibung.pdf
[1]: https://osm.org/go/0JdSSbdXV
[2]: https://osm.org/go/0MIYgsQn7
[wk197]: http://cwsvjudo.bplaced.net/participo/events#197

View File

@@ -0,0 +1,48 @@
---
title: 22. Internationales Rammenauer Pokalturnier
---
# [22. Internationales Rammenauer Pokalturnier][wk200]
Bitte gebt mir über den Wettkampfplaner Bescheid, wer mitkommen kann und wer nicht! Einmal [hier klicken][wk200] und "Teilnahme" oder "keine Teilnahme" auswählen.
Bitte verlässliche Meldung, da ich das Startgeld im Vorfeld mit der Meldung überweisen muss. Es wäre ärgerlich, wenn ich jemanden umsonst melde.
Auch wäre es gut für mich, zu wissen, wer selber fährt, wer noch Platz im Auto hat oder wer selber eine Mitfahrgelegenheit benötigt.
## Wettkampfdaten
- Altersklassen: U13
- Datum: [28.10.2023][wk200]
- Ort: [Sport- und Freizeitzentrum Demitz-Thumitz, Kiefernbuschweg 4, 01877 Demitz-Thumitz][1]
- Wiegen: 10:00--10:30 Uhr
- [offizielle Ausschreibung (nur zur Info)][0]
## Treffpunkt
- Ort: [Dojo Str. Usti nad Labem 42][2]
- Abfahrt: 8:00 Uhr
## Nicht vergessen
- Judopass
- Judogi (d. h. Jacke, Hose und Gürtel)
- *Hallenschuhe* (Auch die Fans!)
- Essen/Trinken
- Warme Socken und Pullover
Das Betreten der Sportstätten in Straßenschuhen ist (auch den Fans)
nicht gestattet. Bitte Ersatzschuhe (Badelatschen/Hallenschuhe)
mitbringen. Sonst muss in Socken gegangen werden!
MsG marko
[0]: http://cwsvjudo.bplaced.net/downloads/Ausschreibungen/Ausschreibungen.2023/2023_Ausschreibung_Pokal.pdf
[1]: https://osm.org/go/0MJoS4--
[2]: https://osm.org/go/0MIYgsQn7
[wk200]: http://cwsvjudo.bplaced.net/participo/events#200

View File

@@ -0,0 +1,35 @@
---
title: OGL + RKP
---
*Bitte Rückmeldung im Wettkampfplaner bis 10.11.2023*
# The Little-Otto-Goshi-Liga 2023-4
[OGL 2023-4 im Wettkampfplaner][wk186]
## Wettkampfdaten
- Altersklassen: U9 (2015 und jünger), U11 (2014 und 2013)
- Datum: 18.11.2023
- Ort: Sporthalle (hintere) BBS III, 06120 Halle, Grasnelkenweg 16
- Wiegen: 09:30--10:15
- Wettkampfbeginn: 10:30 Uhr (bzw. nach Erstellung der Listen)
# 24. Räucherkerzenpokal
[24. Räucherkerzenpokal im Wettkampfplaner][wk198]
## Wettkampfdaten
- Altersklassen: U7 (2017 und jünger), U9 (2015 und 2016), U11 (2014 und 2013)
- Datum: 25.11.2023
- Ort: Lindenhofturnhalle, Schützenhausstraße, 09487 Schlettau
- Wiegen: 08:30--9:30
- Wettkampfbeginn: 9:45 Uhr (bzw. nach Erstellung der Listen)
MsG marko
[wk186]: http://cwsvjudo.bplaced.net/participo/events#186
[wk198]: http://cwsvjudo.bplaced.net/participo/events#198

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.