347 lines
12 KiB
PHP
347 lines
12 KiB
PHP
<?php
|
|
require_once('./lib/db.php');
|
|
|
|
|
|
class record{
|
|
//< id of the record in the db
|
|
private $id;
|
|
//< goup the record is for
|
|
private $achievementGroupId;
|
|
//< the age class the record is for
|
|
private $ageClass;
|
|
//< id of current holder in the db
|
|
private $userId;
|
|
//< when the record was established
|
|
private $timestap;
|
|
//< the value to beat
|
|
private $value;
|
|
//< what the record is about
|
|
private $description;
|
|
|
|
private static $db;
|
|
/// Names of the columns in the db
|
|
private static $colNames = ['id', 'achievementGroupId', 'ageClass', 'userId', 'timestamp', 'value', 'description'];
|
|
public static function setDbConnection($dbConnection){
|
|
if($dbConnection instanceof PDO)
|
|
self::$db = $dbConnection;
|
|
else
|
|
self::$db = null;
|
|
return;
|
|
}
|
|
public static function getDbConnection(){
|
|
return self::$db;
|
|
}
|
|
|
|
public static function getTopAchievers($options=array()){
|
|
$from = array_key_exists('from',$options)?$options['from']:null;
|
|
$to = array_key_exists('to',$options)?$options['to']:null;
|
|
$query =
|
|
"SELECT `wkParticipo_Users`.`vorname`, `wkParticipo_Users`.`name`, COUNT(*) ".
|
|
"FROM `achievements<=>user` JOIN `wkParticipo_Users` ".
|
|
"ON `wkParticipo_Users`.`id` = `achievements<=>user`.`userId` ".
|
|
(
|
|
($from!=null&&$to!=null)?
|
|
("BETWEEN CONVERT(\"".$from."\", datetime) AND CONVERT(\"".$to."\", datetime) "):
|
|
("")
|
|
).
|
|
"GROUP BY `wkParticipo_Users`.`id` ".
|
|
"ORDER BY `COUNT(*)` DESC;";
|
|
return dbQuery(self::$db, $query);
|
|
}
|
|
|
|
public static function getAllRecords(){
|
|
$query = <<<SQL
|
|
SELECT * FROM `cwsvjudo`.`machs_records`;
|
|
SQL;
|
|
return dbQuery(self::$db, $query);
|
|
}
|
|
public static function getUserData($userId){
|
|
$query = <<<SQL
|
|
SELECT * FROM `cwsvjudo`.`wkParticipo_Users`
|
|
WHERE `cwsvjudo`.`wkParticipo_Users`.`id` = :userId ;
|
|
SQL;
|
|
return dbQuery(self::$db, $query, ['userId'=>['value'=>$userId, 'data_type'=>PDO::PARAM_INT]]);
|
|
}
|
|
|
|
// request the records of a group together with its holder
|
|
// @param $groupId id of the group of achievements where the records are wanted
|
|
// @param $ageClass the age class (as int only) for which the record is holding
|
|
//
|
|
// a record of an achievement group consists of:
|
|
// - a value
|
|
// - an age class
|
|
public static function getGroupsRecords($groupId, $ageClass=null){
|
|
$query = "SELECT *, `cwsvjudo`.`machs_records`.`id` as `recordId`, `cwsvjudo`.`wkParticipo_Users`.`name` as `userName` FROM `cwsvjudo`.`machs_records` ";
|
|
$query.= " JOIN `cwsvjudo`.`wkParticipo_Users` ";
|
|
$query.= " ON `cwsvjudo`.`machs_records`.`userId` = `cwsvjudo`.`wkParticipo_Users`.`id` ";
|
|
$query.= " JOIN `cwsvjudo`.`machs_achievementGroups` ";
|
|
$query.= " ON `cwsvjudo`.`machs_achievementGroups`.`id` = `cwsvjudo`.`machs_records`.`achievementGroupId` ";
|
|
$query.= " WHERE `cwsvjudo`.`machs_records`.`achievementGroupId` = :groupId ";
|
|
$params =[
|
|
'groupId'=>[ 'value'=>$groupId, 'data_type'=>PDO::PARAM_INT ]
|
|
];
|
|
if($ageClass != null){
|
|
$query.= " AND `cwsvjudo`.`machs_records`.`ageClass` <= :ageClass ";
|
|
$params['ageClass'] = [ 'value'=>$ageClass, 'data_type'=>PDO::PARAM_INT ];
|
|
}
|
|
$query.= "ORDER BY `cwsvjudo`.`machs_records`.`value` DESC;";
|
|
return dbQuery(self::$db, $query, $params);
|
|
}
|
|
|
|
/// @param $r record as associative array
|
|
public static function arrayRecord2htmlDl($r){
|
|
$retHtml = "<dl>";
|
|
foreach(self::$colNames as $i)
|
|
$retHtml.= "<dt>".$i."</dt><dd>".$r[$i]."</dd>";
|
|
$retHtml.= "</dl>";
|
|
return $retHtml;
|
|
}
|
|
|
|
public static function arrayRecord2htmlCardAction($r, $u, $gid){
|
|
$retHtml.= "<a style=\"width:100%;\" class=\"waves-effect waves-light btn modal-trigger\" href=\"#reportRecord-user-".$u['id']."-group-".$gid."\">Rekord melden</a>";
|
|
$retHtml.= "<div id=\"reportRecord-user-".$u['id']."-group-".$gid."\" class=\"modal\">";
|
|
$retHtml.= "<div class=\"modal-content\">";
|
|
$retHtml.= "Rekorde stellen in jeder Achievementgruppe und Altersklasse die Bestleistung unter allen Judoka dar. Rekorde können unabhänging vom eigenen, aktuellen Achievementstand aufgestellt werden.";
|
|
$retHtml.= "Die Rekorde der jüngeren gelten auch für die älteren, aber nicht umgekehrt. ";
|
|
$retHtml.= "Damit ein Rekord auch eingetragen wird, muss er mit einem Nachweis in Videoform gemeldet werden.";
|
|
$retHtml.= "<h4>Rekord melden</h4>";
|
|
$retHtml.= "Um einen Rekord zu melden, schickt als Nachweis ein Video des Rekordes hoch an <a href=\"mailto:cwsvJudo@arcor.de\">cwsvJudo@arcor.de</a>.";
|
|
// $retHtml.= "Um einen Rekord zu melden, lade ein Video des Rekordes hoch:";
|
|
// $retHtml.= htmlUsersUploadBox(self::$db, $u['id']);
|
|
$retHtml.= "<strong>Anschließend</strong> kannst Du den Rekord melden:";
|
|
$retHtml.= "<form action=\".\" method=\"POST\">";
|
|
if(isUserAdmin(record::$db, $_SESSION['user']['userId'])){
|
|
$retHtml.= "<input name=\"action\" value=\"setRecord\" type=\"hidden\">";
|
|
}
|
|
else{
|
|
$retHtml.= "<input name=\"action\" value=\"reportRecord\" type=\"hidden\">";
|
|
}
|
|
$retHtml.= "<input name=\"userId\" value=\"".$u['id']."\" type=\"hidden\">";
|
|
$retHtml.= "<input name=\"achievementGroupId\" value=\"".$gid."\" type=\"hidden\">";
|
|
$retHtml.= $u['vorname']." ".$u['name']." hat <input name=\"value\" placeholder=\"Zeit/Anzahl\"> geschafft.";
|
|
|
|
if(isUserAdmin(record::$db, $_SESSION['user']['userId'])){
|
|
$retHtml.= "<input id=\"submit\" style=\"width:100%\" name=\"submit\" type=\"submit\" value=\"Rekord eintragen\">";
|
|
}
|
|
else{
|
|
$retHtml.= "<input id=\"submit\" style=\"width:100%\" name=\"submit\" type=\"submit\" value=\"Rekord melden\">";
|
|
}
|
|
$retHtml.= "</form>";
|
|
$retHtml.= "<p>Sobald das Nachweisvideo gesichtet ist und es eine neue Bestleistung darstellt, wird der Rekord dann eingetragen und damit offiziell.</p>";
|
|
$retHtml.= "</div>";
|
|
$retHtml.= "<div class=\"modal-footer\">";
|
|
$retHtml.= "<a href=\"#!\" class=\"modal-close waves-effect waves-green btn-flat\">Zurück</a>";
|
|
$retHtml.= "</div>";
|
|
$retHtml.= "</div>";
|
|
return $retHtml;
|
|
}
|
|
|
|
/// @param $r record joined with it's holder as associative array
|
|
/// @param $u user for whom the record is shown
|
|
public static function arrayRecord2collapsible($r, $u, $gid, $noForm=true){
|
|
$currentRecord = "";
|
|
if(empty($r)){
|
|
$currentRecord.= "Noch kein Rekord für die Altersklasse U".record::birthday2ageClass($u['gebDatum']);
|
|
}
|
|
else{
|
|
$currentRecord.= $r['vorname']." ".$r['userName']." mit ".$r['value']." in der U".$r['ageClass'];
|
|
}
|
|
|
|
$recordRequest = record::arrayRecord2htmlCardAction($r, $u, $gid, $noForm);
|
|
|
|
return <<<COLLAPSIBLE
|
|
<ul class="collapsible">
|
|
<li>
|
|
<div class="collapsible-header">﹀ $currentRecord</div>
|
|
<div class="collapsible-body"><span>$recordRequest</span></div>
|
|
</li>
|
|
</ul>
|
|
COLLAPSIBLE;
|
|
}
|
|
|
|
/// @param $r record joined with it's holder as associative array
|
|
/// @param $u user for whom the record is shown
|
|
public static function arrayRecord2htmlCard($r, $u, $gid, $noForm=true, $frameTag="div"){
|
|
$group = new achievementGroup;
|
|
$group->loadAchievementGroupFromDb($gid);
|
|
|
|
$retHtml.= "";
|
|
// var_dump($group->canHaveRecords());
|
|
if($group->canHaveRecords()){
|
|
$retHtml = "<".$frameTag." class=\"card\">";
|
|
$retHtml.= "<div class=\"card-content\">";
|
|
$retHtml.= "<span class=\"card-title\">Zu schlagender Rekord</span>";
|
|
|
|
if(empty($r)){
|
|
$retHtml.= "Noch kein Rekord für die Altersklasse U".record::birthday2ageClass($u['gebDatum']);
|
|
}
|
|
else{
|
|
// $retHtml.=record::arrayRecord2collapsible($records[0], $userData[0], $this->getId(), $noForm);
|
|
$retHtml.=record::arrayRecord2collapsible($r, $u, $gid, $noForm);
|
|
//$retHtml.= $r['vorname']." ".$r['name']." mit ".$r['value']." in der U".$r['ageClass'];
|
|
}
|
|
$retHtml.= "</div>";//end card-content
|
|
|
|
// if(!$noForm){
|
|
// $retHtml.= record::arrayRecord2htmlCardAction($r, $u, $gid, $noForm);
|
|
// }
|
|
$retHtml.= "</".$frameTag.">";
|
|
}
|
|
return $retHtml;
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function birthday2ageClass($birthdateString){
|
|
$birthDate = DateTime::createFromFormat("Y-m-d", $birthdateString);
|
|
$birthYear= (int)$birthDate->format("Y");
|
|
$thisYear = (int)date('Y');
|
|
return $thisYear - $birthYear + 1;
|
|
}
|
|
|
|
// get an ageClasses records including its holders
|
|
public static function getRecordsOfAgeClass($ageClass, $achievementGroup, $options=[]){
|
|
$query = <<<SQL
|
|
SELECT * FROM `cwsvjudo`.`machs_records`
|
|
JOIN `cwsvjudo`.`wkParticipo_Users`
|
|
ON `cwsvjudo`.`machs_records`.`userId` = cwsvjudo`.`wkParticipo_Users`.`id`
|
|
WHERE `cwsvjudo`.`machs_records`.`ageClass` = :ageClass ";
|
|
AND `cwsvjudo`.`machs_records`.`achievementGroupId` = :achievementGroupId;
|
|
SQL;
|
|
$params = [
|
|
':ageClass'=>['value'=>$ageClass, 'data_type'=>PDO::PARAM_INT],
|
|
':achievementGroupId'=>['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT],
|
|
];
|
|
$returns = query($this->getDbConnection(), $query, $params);
|
|
return $records;
|
|
}
|
|
|
|
// returns all age classes with records
|
|
public static function getAgeClassesWithRecord($achievementGroupId=null){
|
|
$params = null;
|
|
$query="SELECT DISTINCT `ageClass` FROM `cwsvjudo`.`machs_records` ";
|
|
if($achievementGroupId != null){
|
|
$query.="WHERE `achievementGroupId` = :achievementGroupId ";
|
|
$params=[];
|
|
$params[':achievementGroupId'] = ['value'=>$achievementGroupId, 'data_type'=>PDO::PARAM_INT];
|
|
}
|
|
$query.="ORDER BY `ageClass`";
|
|
$ageClasses = dbQuery(self::$db, $query, $params);
|
|
return $ageClasses;
|
|
}
|
|
|
|
// load the achievement from the DB
|
|
public function loadFromDb($id){
|
|
$query = "SELECT * from `cwsvjudo`.`machs_records` WHERE `id`=:id;";
|
|
$params = [':id'=>['value'=>$id, 'data_type'=>PDO::PARAM_INT]];
|
|
$achievements = query($this->getDbConnection(), $query, $params);
|
|
$this->setFromAssocArray($achievements[0]);
|
|
}
|
|
// set the members of the record via an associative array (like the ones, that are returned by dbquery)
|
|
public function setFromAssocArray($assocArray){
|
|
$this->id = (int)$assocArray['id'];
|
|
$this->achievementGroupId = (int)$assocArray['achievementGroupId'];
|
|
$this->ageClass = (int)$assocArray['ageClass'];
|
|
$this->userId = (int)$assocArray['userId'];
|
|
$this->timestap = $assocArray['userId'];
|
|
$this->value = $assocArray['value'];
|
|
}
|
|
|
|
static public function htmlRanking($recordList){
|
|
if(empty($recordList))
|
|
return "";
|
|
$html = "<table>";
|
|
$html.= "<tr><th>Judoka</th><th>Rekord</th><th>Video</th></tr>";
|
|
foreach($recordList as $record){
|
|
$html.="<tr><td>".$record['vorname']." ".$record['name']."</td><td>".$record['value']."</td><td><a href=\"videos.d/records/".$record['recordId'].".webm\" >Video</a></td></tr>";
|
|
}
|
|
$html.= "</table>";
|
|
return $html;
|
|
}
|
|
}
|
|
|
|
/// Als String gegebene Altersklassen als Jahrgangsintervalle
|
|
/// ausdrücken
|
|
function akListString2jgArray($akListString, $year = NULL ){
|
|
$ret = array();
|
|
if($year==NULL)
|
|
$year=date("Y");
|
|
else{
|
|
if( !((int)$year == $year && (int)$year >= 0) )
|
|
$year=date("Y");
|
|
}
|
|
|
|
$year = (int)$year;
|
|
|
|
foreach(explode(" ", $akListString) as $ak)
|
|
array_push(
|
|
$ret,
|
|
akString2jgIntervall($ak, $year)
|
|
);
|
|
return $ret;
|
|
}
|
|
|
|
/// Aus einer als String gegebenen Altersklasse ein Jahrgangsintervall
|
|
/// machen
|
|
function akString2jgIntervall($akString, $year=null){
|
|
if($year==NULL)
|
|
$year=date("Y");
|
|
else{
|
|
if( !((int)$year == $year && (int)$year >= 0) )
|
|
$year=date("Y");
|
|
}
|
|
|
|
$ret= array(NULL, NULL);
|
|
|
|
// Speziell für die Ux-Altersklassen
|
|
// Es fehlt noch das <=U
|
|
$akUmatchString = "/(.*)U(.*)/";
|
|
$matches = array();
|
|
preg_match($akUmatchString, $akString, $matches);
|
|
// Wenn wir nicht den gesamten akString Matchen ist etwas schief
|
|
// gelaufen
|
|
if($matches[0]==$akString){
|
|
// Das ausgelesene Alter der Ux sollte eine positive Integer sein,
|
|
// sonst ist was schiefgelaufen
|
|
$ageLimit = (int)$matches[2];
|
|
if( ($ageLimit == $matches[2] && $ageLimit > 0) ){
|
|
$ret[0] = $year-$ageLimit+1;
|
|
|
|
if($matches[1] == "")
|
|
$ret[1] = $year-$ageLimit+2;
|
|
else{
|
|
if($matches[1] == "-")
|
|
$ret[1] = $year-$ageLimit+3;
|
|
else{
|
|
if($matches[1] == "--")
|
|
$ret[1] = $year-$ageLimit+4;
|
|
}
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
// Speziell Altersklassen der Form Jg.x-y
|
|
$akUmatchString = "/Jg\.(.*)\-(.*)/";
|
|
$matches = array();
|
|
preg_match($akUmatchString, $akString, $matches);
|
|
// Wenn wir nicht den gesamten akString Matchen ist etwas schief
|
|
// gelaufen
|
|
if($matches[0]==$akString){
|
|
$ret[0]=(int)$matches[1];
|
|
$ret[1]=(int)$matches[2];
|
|
|
|
return $ret;
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
function validateDate($date, $format = 'Y-m-d')
|
|
{
|
|
$d = DateTime::createFromFormat($format, $date);
|
|
// The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
|
|
return $d && $d->format($format) === $date;
|
|
}
|
|
?>
|