diff --git a/homepage/participo/lib/participoLib/user.php b/homepage/participo/lib/participoLib/user.php index 3badb82..a5476f0 100644 --- a/homepage/participo/lib/participoLib/user.php +++ b/homepage/participo/lib/participoLib/user.php @@ -159,13 +159,13 @@ class User /** List of users kids */ private $kids = null; - public function kidIds(bool $forceLoading = false) - { - if (is_null($this->kidIds) || $forceLoading) { - $this->kidIds = self::getKidIds($id); - } - return self::$kidIds; - } + // public function kidIds(bool $forceLoading = false) + // { + // if (is_null($this->kidIds) || $forceLoading) { + // $this->kidIds = self::getKidIds($id); + // } + // return self::$kidIds; + // } public function kids(bool $forceLoading = false) { @@ -175,26 +175,26 @@ class User return $this->kids; } - private static function getKidIds(int $id) - { - $response = dbConnector::query( - 'SELECT * FROM `wkParticipo_Users` WHERE `' . $name . '` = :' . $name, - [$name => ['value' => $value, 'data_type' => self::$dbColumns[$name]]] - ); +// private static function getKidIds(int $id) +// { +// $response = dbConnector::query( +// 'SELECT * FROM `wkParticipo_Users` WHERE `' . $name . '` = :' . $name, +// [$name => ['value' => $value, 'data_type' => self::$dbColumns[$name]]] +// ); - $query = << ['value' => $userId, 'data_type' => PDO::PARAM_INT] - ]; - $response = dbConnector::query($query, $params); - return $response; - } +// $query = << ['value' => $userId, 'data_type' => PDO::PARAM_INT] +// ]; +// $response = dbConnector::query($query, $params); +// return $response; +// } /** Export the User data into an associative array * @@ -248,9 +248,12 @@ SQL; public function getConfig() { - return $this->$config; + return $this->config; } + public function getDateOfBirth(){ + return $this->dateOfBirth; + } public function getStrBirthday(){ return $this->dateOfBirth->format("Y-m-d"); } diff --git a/homepage/participo/pmelo.inc.php b/homepage/participo/pmelo.inc.php index 1eb4ab4..5cfaeb6 100644 --- a/homepage/participo/pmelo.inc.php +++ b/homepage/participo/pmelo.inc.php @@ -2,9 +2,6 @@ setlocale(LC_ALL, "de_DE@euro", "de_DE", "de", "ge"); set_include_path(get_include_path() . PATH_SEPARATOR . "./lib/"); -// start a session -session_start(); - // Configs require_once("config/participo.php"); require_once $config['basePath'] . "/config/cwsvJudo.config.php"; @@ -19,6 +16,7 @@ $pmelo = new PmElo(); class PmElo{ function __construct() { + // $this->var_log($_SESSION, "session"); // starting/continuing a session session_start(); @@ -27,15 +25,16 @@ class PmElo{ $_SESSION['pmelo'] = []; } // - data storage for id-s of chosen fighters - if(!array_key_exists('fighterIds', $_SESSION)){ - $_SESSION['pmelo']['fighterIds'] = null; + if(!array_key_exists('fighterIds', $_SESSION['pmelo'])){ + $_SESSION['pmelo']['fighterIds'] = []; } // check for action in post data if(array_key_exists('pmelo', $_POST)){ if(array_key_exists('fighterIds', $_POST['pmelo'])){ - $this->fighters = array_map('User::loadFromDb', $_POST['pmelo']['fighterIds']); + $_SESSION['pmelo']['fighterIds']=$_POST['pmelo']['fighterIds']; } + // $this->var_log($_SESSION, "session"); } // load/recreate ranking data @@ -47,10 +46,24 @@ class PmElo{ // init members $this->trainees = self::getTrainees(); $this->var_log(array_map(function($user){return $user->getFirstName();},$this->trainees), "trainees from db"); - $this->rankings = self::createRankings(); + $this->rankings = $this->createRankings(); + $this->var_log(array_map(function($id){return $this->trainees[$id]->getFirstName();},$this->rankings), "current ranking"); + $this->fighters = []; + foreach($_SESSION['pmelo']['fighterIds'] as $id){ + $this->fighters[$id] = $this->trainees[$id]; + }; + $this->var_log(array_map(function($user){return $user->getFirstName();},$this->fighters), "fighters"); + + // save the updated ranking + // @todo should be in destructor + self::saveRankings($this->rankings); } + function __destruct(){ + // sad, the destructor is not allowed to use file_put_contents + } + // load all active trainees into a id=>User assoc array public static function getTrainees(){ $traineeList = array_map('User::fromDbArray', User::dbSelectWithAttribute(4)); @@ -71,6 +84,7 @@ class PmElo{ file_put_contents(self::$pmeloJson, json_encode($rankings)); } + // simple logger to a logging buffer function var_log($variable, string $prefix=null, string $logChannel='info'){ if(!in_array($logChannel, ['info', 'warning', 'error'])){ $logChannel='info'; @@ -79,22 +93,27 @@ class PmElo{ $this->log[$logChannel][]=$prefix.var_export($variable, true); } + // create the ranking for the current session (load saved ranking from file, remove old trainees, add new trainees) public function createRankings(){ // load the last state of the ranking $loadedRanking = self::loadRankings(); - $this->var_log($loadedRanking,"ranking"); + $this->var_log(array_map(function($id){$user=$this->trainees[$id]; return $user->getFirstName();}, $loadedRanking), "loaded ranking"); // check if the ranked trainees still are in training + // - the ranking with $cleanRanking = []; + // - trainees that aren't currently in the ranking for later inserting $toBeInsertedTrainees = $this->trainees; - foreach($loadedRanking as $rank=>$id){ + foreach($loadedRanking as $id){ if(array_key_exists($id, $this->trainees)){ + // userId is still in training, so append it to the cleaned up ranking $cleanRanking[] = $id; - // id of the not in the ranking, we have to insert + // trainees already in the ranking we won't have to insert manual unset($toBeInsertedTrainees[$id]); } } + // get the ids of the to be inserted trainees sorted by the birthday $newTraineesIds = array_map(function($u){return $u->getId();},$toBeInsertedTrainees); usort( $newTraineesIds @@ -102,16 +121,52 @@ class PmElo{ return $this->trainees[$lhs]->getStrBirthday() < $this->trainees[$rhs]->getStrBirthday() ? -1 : ($this->trainees[$lhs]->getStrBirthday() > $this->trainees[$rhs]->getStrBirthday() ? 1 : 0); } ); - $this->var_log(array_map(function($id){return $this->trainees[$id]->getStrBirthday();},$newTraineesIds), "newTrainieesIdsByAge"); - $this->var_log($newTraineesIds, "newTrainieesIdsByAge"); - $this->var_log(array_map(function($user){return $user->getFirstName();}, $toBeInsertedTrainees), "newTrainees"); + // $this->var_log( + // array_map( + // function($id){return $this->trainees[$id]->getStrBirthday()." ".$this->trainees[$id]->getFirstName();} + // , $newTraineesIds + // ) + // , "newTraineesBy B-Day" + // ); - // insert new trainees in the ranking - // foreach($this->trainees as $trainee){ - // if(empty($this->rankings)){ - - // } - // } + // now we do a mergesort (step) + $updatedRanking = []; + $idxNewTrainees = count($newTraineesIds)-1; + $idxRanking = count($cleanRanking)-1; + // - while we can merge, we merge + while( ($idxRanking >= 0) && ($idxNewTrainees >= 0) ){ + // $this->var_log( [$idxRanking.", ".$idxNewTrainees=>$updatedRanking] ); + // $this->var_log( + // [$this->trainees[$cleanRanking[$idxRanking]]->getStrBirthday(), $this->trainees[$newTraineesIds[$idxRanking]]->getStrBirthday()] + // ); + if( + $this->trainees[$cleanRanking[$idxRanking]]->getDateOfBirth() + > $this->trainees[$newTraineesIds[$idxNewTrainees]]->getDateOfBirth() + ){ + // $this->var_log( $this->trainees[$cleanRanking[$idxRanking]]->getFirstName(), "merge ranking insert" ); + array_unshift($updatedRanking, $cleanRanking[$idxRanking]); + $idxRanking-=1; + }else{ + // $this->var_log( $this->trainees[$newTraineesIds[$idxNewTrainees]]->getFirstName(), "merge trainees insert" ); + array_unshift($updatedRanking, $newTraineesIds[$idxNewTrainees]); + $idxNewTrainees-=1; + } + } + // $this->var_log( + // ["idxR ".$idxRanking." idxNT ".$idxNewTrainees=>[$cleanRanking, $newTraineesIds]] + // , "after merge" + // ); + while( $idxRanking >= 0 ){ + // $this->var_log( $this->trainees[$cleanRanking[$idxRanking]]->getFirstName(), "rest ranking insert" ); + array_unshift($updatedRanking, $cleanRanking[$idxRanking]); + $idxRanking-=1; + } + while( $idxNewTrainees >= 0 ){ + // $this->var_log( $this->trainees[$newTraineesIds[$idxNewTrainees]]->getFirstName(), "rest newTrainees insert" ); + array_unshift($updatedRanking, $newTraineesIds[$idxNewTrainees]); + $idxNewTrainees-=1; + } + return $updatedRanking; } public $log = ['error'=>[], 'warning'=>[], 'info'=>[]]; @@ -120,5 +175,5 @@ class PmElo{ // list of id-s in the order of the current ranking public $rankings = null; - static $pmeloJson="pmeloRanking.json"; + static $pmeloJson="./pmeloRanking.json"; } \ No newline at end of file diff --git a/homepage/participo/pmelo.php b/homepage/participo/pmelo.php index 253fa36..da60dfb 100644 --- a/homepage/participo/pmelo.php +++ b/homepage/participo/pmelo.php @@ -59,9 +59,16 @@ PlatzNameAufstieg - fighters)) foreach($pmelo->fighters as $fighter){ - echo("#".$fighter->getFirstname()." ".$fighter->getName()."^".PHP_EOL); - } + fighters)){ + foreach($pmelo->rankings as $rank=>$id){ + if(array_key_exists($id, $pmelo->fighters)){ + $fighter = $pmelo->fighters[$id]; + // echo("".$rank."".$fighter->getFirstName()."".PHP_EOL); + echo("".$rank."".$fighter->getFirstName()." ".$fighter->getName()."^".PHP_EOL); + } + } +} ?>