Many changes due to the CodeIgniter update, as well as fixes and optimizations.

This commit is contained in:
Alfonso Saavedra "Son Link" 2024-04-07 22:40:57 +02:00
parent 9ce843fc9d
commit 6dfce20d7f
No known key found for this signature in database
GPG Key ID: D3594BCF897F74D8
21 changed files with 1037 additions and 182 deletions

View File

@ -27,6 +27,9 @@ class BaseController extends Controller
* @var CLIRequest|IncomingRequest
*/
protected $request;
protected $db;
protected $session;
/**
* An array of helpers to be loaded automatically upon
@ -50,5 +53,6 @@ class BaseController extends Controller
// E.g.: $this->session = \Config\Services::session();
$this->db = \Config\Database::connect();
$this->request = \Config\Services::request();
$this->session = session();
}
}

View File

@ -5,11 +5,17 @@ use App\Models\CarsModel;
class Cars extends BaseController
{
private object $carsModel;
public function __construct()
{
$this->carsModel = new CarsModel();
}
function index($id)
{
//$this->cachePage(3600);
$car = getCar($id);
$this->cachePage(3600);
$car = $this->carsModel->data($id);
echo get_header('Car: ' . $car->name);
echo view('car', ['car' => $car]);
echo get_footer();

View File

@ -0,0 +1,59 @@
<?php
namespace App\Controllers;
use App\Models\UsersModel;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\HTTP\URI;
class Dashboard extends BaseController
{
protected $usersModel;
use ResponseTrait;
public function __construct()
{
$this->usersModel = new UsersModel();
$uri = new URI();
$session = session();
/*
if ($uri->getSegment(1) != 'login' && !$session->has('logged_in'))
{
header('Location: '.base_url().'/login');
die();
}
*/
}
public function index()
{
//$users = $this->users->getUsers();
$tplData = [];
//$tplData['users'] = $users;
echo get_header('Dashboard', [], true);
echo view('dashboard/main.php', $tplData);
echo get_footer();
}
public function login()
{
$data = $this->request->getVar();
$compUser = $this->usersModel->login($data);
return $this->respond(['ok' => $compUser]);
}
public function user()
{
//$userid = $this->session->userid;
$user = $this->usersModel->find($this->session->userid);
echo get_header("My User", [], true);
echo view('dashboard/user', ['user' => $user]);
echo get_footer();
}
public function users() {
$users = $this->usersModel->findAll();
return $this->respond($users);
}
}

View File

@ -1,15 +1,18 @@
<?php
namespace App\Controllers;
use App\Models\UsersModel;
use App\Models\CarCatsModel;
use App\Models\TracksModel;
use CodeIgniter\API\ResponseTrait;
class Home extends BaseController
{
protected $users;
use ResponseTrait;
public function index()
{
$tplData = [];
$carCatModel = new CarCatsModel();
// select interested period
if(array_key_exists('period', $_COOKIE))
@ -17,15 +20,12 @@ class Home extends BaseController
$period = $_COOKIE['period'];
}
if(array_key_exists('period', $_GET))
if($this->request->getGet('period'))
{
setcookie( "period", $_GET['period'], time()+(60*60*24*30) );
$period = $_GET['period'];
}
else
{
$period = 'year';
$period = $this->request->getGet('period');
setcookie( "period", $period, time()+(60*60*24*30) );
}
else $period = 'today';
$tplData['period'] = $period;
@ -51,49 +51,53 @@ class Home extends BaseController
$backto = time()-$datediff;
$tplData['periodString'] = 'In the last year';
break;
/*
case 'date'://from this date
$datediff=(7*24*60*60);
$backto=time()-$datediff;
$periodString ='From '.date('d-m-Y', $backto);
break;
*/
case 'allTime'://always
$datediff = (50000*24*60*60);
$backto = time() - $datediff;
$tplData['periodString'] = 'all time';
break;
case 'allTime'://always
$datediff = (50000*24*60*60);
$backto = time() - $datediff;
$tplData['periodString'] = 'all time';
break;
default:
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
}
//select the category to display
if (array_key_exists('cat', $_GET))
$catId = $this->request->getGet('cat');
if ($catId)
{
$carCatId = $_GET['cat'];
$tplData['carCatId'] = $carCatId;
// Check if the cat exists
$exists = $carCatModel->find($catId);
if (!$exists) throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
$carCatId = $catId;
}
else
{
$first = $carCatModel->select('id')->findAll(1);
$carCatId = $first[0]->id;
}
//reorder the cetegories by name
$carCategories = getCarCats();
$carCategoriesList = get_object_vars($carCategories);
ksort($carCategoriesList);
$tplData['carCatId'] = $carCatId;
$tplData['carCategories'] = $carCategories;
$tplData['carCategoriesList'] = $carCategoriesList;
// Get cars categories
$categoriesList = $carCatModel->select('id, name, count(carId) as totalCars')->groupBy('id')->findAll();
$currCat = $carCatModel->find($carCatId);
if (!isset($carCatId)) $carCatId = array_key_first($carCategoriesList);
$carsCatList = $carCatModel->select('carId')->where('id', $carCatId)->findAll();
$carsql = '';
foreach ($carCategories->$carCatId->cars as $car){
$carsql.=" OR B.car_id='$car'";
}
$tplData['currCat'] = $currCat;
$tplData['carCategoriesList'] = $categoriesList;
$carsql = substr($carsql, 4); //remove the first " OR "
$carsCatIds = [];
foreach ($carsCatList as $car) $carsCatIds[] = $car->carId;
//UGLY: there is some category that have no car assigned so create a fake $carsql for them
//to prevent errors in the generated queries
/*
$carsql = '0';
if($carsql == ''){
$carsql = " B.car_id='NonExistentCarIdFindThisIfYouCan'";
}
*/
/*
################################
@ -102,16 +106,17 @@ class Home extends BaseController
################################
*/
$builder = $this->db->table('races B');
$builder->select('B.user_id, COUNT(*) as count');
$builder->where('UNIX_TIMESTAMP(B.timestamp) >', $backto);
$builder->where("($carsql)");
$builder->groupBy('B.user_id');
$builder = $this->db->table('races r');
$builder->select('r.user_id, COUNT(*) AS count, u.username');
$builder->join('users u', 'u.id = r.user_id');
$builder->where('UNIX_TIMESTAMP(r.timestamp) >', $backto);
$builder->whereIn('r.car_id', $carsCatIds);
$builder->groupBy('r.user_id');
$builder->orderBy('count DESC');
$tplData['users'] = [];
$query = $builder->get();
if ($query || $query->getNumRows() > 0) $tplData['users'] = $query->getResult();
if ($query && $query->getNumRows() > 0) $tplData['users'] = $query->getResult();
/*
################################
@ -120,59 +125,72 @@ class Home extends BaseController
################################
*/
$builder = $this->db->table('laps A');
$builder->select('A.race_id, B.track_id, B.car_id, B.user_id, B.timestamp, A.wettness, min(A.laptime) as bestlap');
$builder->join('races B', 'A.race_id = B.id');
$builder->where('UNIX_TIMESTAMP(B.timestamp) >', $backto);
$builder->where("($carsql)");
$builder->groupBy(['B.track_id', 'A.wettness']);
$builder = $this->db->table('laps l');
$builder->select('l.race_id, r.track_id, r.car_id, r.user_id, r.timestamp, l.wettness, min(l.laptime) as bestlap, c.name AS car_name, t.name AS track_name, u.username');
$builder->join('races r', 'l.race_id = r.id');
$builder->join('cars c', 'c.id = r.car_id');
$builder->join('tracks t', 't.id = r.track_id');
$builder->join('users u', 'u.id = r.user_id');
$builder->where('UNIX_TIMESTAMP(r.timestamp) >', $backto);
$builder->whereIn('r.car_id', $carsCatIds);
$builder->groupBy(['r.track_id', 'l.wettness']);
$tplData['mylaps'] = [];
$query = $builder->get();
if ($query || $query->getNumRows() > 0) $tplData['mylaps'] = $query->getResult();
$query = "
SELECT track_id, COUNT(*) as count
FROM races B
WHERE UNIX_TIMESTAMP(timestamp) > $backto
AND ($carsql)
GROUP BY B.track_id
ORDER BY COUNT(*) DESC";
if ($query && $query->getNumRows() > 0) $tplData['mylaps'] = $query->getResult();
$tplData['tracks'] = [];
$builder = $this->db->table('races B');
$builder->select('B.track_id, COUNT(*) as count');
$builder->where('UNIX_TIMESTAMP(B.timestamp) >', $backto);
$builder->where("($carsql)");
$builder->groupBy('B.track_id');
$builder = $this->db->table('races');
$builder->select('track_id, COUNT(*) AS count');
$builder->where('UNIX_TIMESTAMP(timestamp) >', $backto);
$builder->whereIn('car_id', $carsCatIds);
$builder->groupBy('track_id');
$builder->orderBy('count DESC');
$query = $builder->get();
if ($query || $query->getNumRows() > 0) $tplData['tracks'] = $query->getResult();
$query="
SELECT car_id, COUNT(*) as count
FROM races B
WHERE UNIX_TIMESTAMP(timestamp) > $backto
AND ($carsql)
GROUP BY B.car_id
ORDER BY COUNT(*) DESC";
if ($query && $query->getNumRows() > 0)
{
$tracks = $query->getResult();
$tracksIds = [];
foreach($tracks as $track) $tracksIds[] = $track->track_id;
$tracksModel = new TracksModel();
$tracksNames = [];
$tracksNamesList = $tracksModel->select('id, name')->whereIn('id', $tracksIds)->findAll();
foreach($tracksNamesList as $name) $tracksNames[$name->id] = $name->name;
foreach($tracksIds as $id)
{
if (!key_exists($id, $tracksNames)) $tracksNames[$id] = "$id (Modded)";
}
$tplData['tracks'] = $tracks;
$tplData['tracksNames'] = $tracksNames;
}
$tplData['cars'] = [];
$builder = $this->db->table('races B');
$builder->select('car_id, COUNT(*) as count');
$builder->where('UNIX_TIMESTAMP(B.timestamp) >', $backto);
$builder->where("($carsql)");
$builder->groupBy('B.car_id');
$builder = $this->db->table('races r');
$builder->join('cars c', 'c.id = r.car_id');
$builder->select('r.car_id, COUNT(r.car_id) as count, c.name');
$builder->where('UNIX_TIMESTAMP(r.timestamp) >', $backto);
$builder->whereIn('r.car_id', $carsCatIds);
$builder->groupBy('r.car_id');
$builder->orderBy('count DESC');
$query = $builder->get();
if ($query || $query->getNumRows() > 0) $tplData['cars'] = $query->getResult();
if ($query && $query->getNumRows() > 0) $tplData['cars'] = $query->getResult();
echo get_header('Home');
echo view('main', $tplData);
echo get_footer();
}
public function error404()
{
return view('404');
}
}

155
app/Controllers/Install.php Normal file
View File

@ -0,0 +1,155 @@
<?php
namespace App\Controllers;
use App\Models\UsersModel;
use CodeIgniter\API\ResponseTrait;
class Install extends BaseController
{
use ResponseTrait;
public function install()
{
helper('filesystem');
$filename = ROOTPATH . '/sdwebserver.sql';
$handle = fopen($filename, "r");
$content = fread($handle, filesize($filename));
fclose($handle);
$file_array = explode(';', $content);
foreach ($file_array as $query)
{
if ($query)
{
$this->db->query("SET FOREIGN_KEY_CHECKS = 0");
$this->db->query($query);
$this->db->query("SET FOREIGN_KEY_CHECKS = 1");
}
}
}
public function update()
{
//$sql = "ALTER TABLE `users` ADD `level` TINYINT(1) NOT NULL DEFAULT '3' AFTER `id`;";
$this->db->query("
CREATE TABLE IF NOT EXISTS `cars` (
`id` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`img` varchar(100) DEFAULT NULL,
`category` varchar(50) DEFAULT NULL,
`width` varchar(10) DEFAULT NULL,
`length` varchar(10) DEFAULT NULL,
`mass` varchar(12) DEFAULT NULL,
`fueltank` varchar(10) DEFAULT NULL,
`engine` varchar(30) DEFAULT NULL,
`drivetrain` varchar(5) DEFAULT NULL
) ENGINE=InnoDB;
");
$this->db->query("CREATE TABLE IF NOT EXISTS `cars_cats` (
`id` varchar(20) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`carID` varchar(50) DEFAULT NULL
) ENGINE=InnoDB;
");
$this->db->query("CREATE TABLE IF NOT EXISTS `tracks` (
`id` varchar(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`img` varchar(100) DEFAULT NULL,
`category` varchar(30) DEFAULT NULL,
`author` varchar(50) DEFAULT NULL,
`description` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
");
$this->db->query("CREATE TABLE IF NOT EXISTS `tracks_cats` (
`id` varchar(20) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`trackID` varchar(50) DEFAULT NULL
) ENGINE=InnoDB;
");
$this->respond(true);
}
/**
* Update cars, tracks, etc, data from the files
*/
public function updateData()
{
$carsFile = file_get_contents(WRITEPATH . '/data/cars.json');
$cars = json_decode($carsFile, true);
$add = [];
foreach($cars as $id => $car) $add[] = $car;
if (count($add) > 0)
{
$this->db->query('TRUNCATE cars');
$builder = $this->db->table('cars');
$insert = $builder->insertBatch($add);
}
// Now the tracks
$tracksFile = file_get_contents(WRITEPATH . '/data/tracks.json');
$tracks = json_decode($tracksFile, true);
$add = [];
foreach($tracks as $id => $track)
{
$track['description'] = $track['description']['val'];
$add[] = $track;
}
if (count($add) > 0)
{
$this->db->query('TRUNCATE tracks');
$builder = $this->db->table('tracks');
$insert = $builder->insertBatch($add);
}
$carsCatsFile = file_get_contents(WRITEPATH . '/data/carCategories.json');
$carCats = json_decode($carsCatsFile, true);
$add = [];
foreach($carCats as $id => $cat)
{
foreach($cat['cars'] as $car)
$add[] = [
'id' => $id,
'name' => $cat['name'],
'carId' => $car
];
}
if (count($add) > 0)
{
$this->db->query('TRUNCATE cars_cats');
$builder = $this->db->table('cars_cats');
$insert = $builder->insertBatch($add);
}
$trackCatsFile = file_get_contents(WRITEPATH . '/data/trackCategories.json');
$trackCats = json_decode($trackCatsFile, true);
$add = [];
foreach($trackCats as $id => $cat)
{
foreach($cat['tracks'] as $track)
$add[] = [
'id' => $id,
'name' => $cat['name'],
'trackId' => $track
];
}
if (count($add) > 0)
{
$this->db->query('TRUNCATE tracks_cats');
$builder = $this->db->table('tracks_cats');
$insert = $builder->insertBatch($add);
}
}
}

View File

@ -7,18 +7,26 @@ use App\Models\TracksModel;
class Races extends BaseController
{
protected $users;
protected object $users;
protected object $carsModel;
protected object $tracksModel;
public function __construct()
{
$this->users = new UsersModel();
$this->carsModel = new CarsModel();
$this->tracksModel = new TracksModel();
}
public function index($race)
{
//$this->cachePage(360);
$builder = $this->db->table('races');
$builder->where('id', $race);
$builder = $this->db->table('races r');
$builder->join('cars c', 'c.id = r.car_id');
$builder->join('tracks t', 't.id = r.track_id');
$builder->join('users u', 'u.id = r.user_id');
$builder->select('r.id, r.type, r.timestamp, r.car_id, c.name AS car_name, c.img as car_img, r.track_id, t.name AS track_name, t.img AS track_img, u.username');
$builder->where('r.id', $race);
$query = $builder->get(1);
$tplData = [];
@ -36,10 +44,6 @@ class Races extends BaseController
$tplData['laps'] = json_encode($query->getResult());
$tplData['race']->n_laps = $query->getNumRows();
}
$tplData['user'] = new UsersModel($tplData['race']->user_id);
$tplData['car'] = new CarsModel(getCar($tplData['race']->car_id));
$tplData['track'] = new TracksModel(getTrack($tplData['race']->track_id));
}
echo get_header('Races');

View File

@ -8,26 +8,27 @@ use CodeIgniter\API\ResponseTrait;
class Register extends BaseController
{
protected $users;
protected $captcha;
protected object $users;
protected object $captcha;
use ResponseTrait;
public function __construct()
{
$this->captcha = new CaptchaBuilder;
session_start();
$this->users = new UsersModel;
}
public function index()
{
$this->captcha->build();
$_SESSION['phrase'] = $this->captcha->getPhrase();
$this->session->set('phrase', $this->captcha->getPhrase());
echo get_header('Register');
echo view('register', ['captcha' => $this->captcha->inline()]);
echo get_footer(['register.js']);
}
public function newuser()
public function newUser()
{
$data = $this->request->getVar();
$response = [
@ -36,21 +37,24 @@ class Register extends BaseController
];
// First verify the captcha
if (isset($_SESSION['phrase']) && PhraseBuilder::comparePhrases($_SESSION['phrase'], $data['phrase'])) {
if (
$this->session->has('phrase') &&
PhraseBuilder::comparePhrases($this->session->phrase, $data['phrase'])
) {
// Move the image
$file = $this->request->getFile('imginput');
if ($file) {
if ($file)
{
// Verify is the file is correct and not, for example, a .exe renamed to .jpg
$ext = $file->guessExtension();
if ($ext != $file->getExtension()) $response['msg'] = 'The image is not valid';
else
{
$users = new UsersModel();
// Now we check if the user and/or email is already in use.
if ($users->compUser($data['username'], $data['email']))
if ($this->users->compUser($data['username'], $data['email']))
$response['msg'] = 'Username and/or email is already in use';
else $response = $users->addUser($data, $file);
else $response = $this->users->addUser($data, $file);
}
}
}
@ -61,10 +65,10 @@ class Register extends BaseController
return $this->respond($response);
}
public function new_captcha()
public function newCaptcha()
{
$this->captcha->build();
$_SESSION['phrase'] = $this->captcha->getPhrase();
$this->session->phrase = $this->captcha->getPhrase();
return $this->captcha->inline();
}

View File

@ -2,15 +2,20 @@
namespace App\Controllers;
use App\Models\TracksModel;
use App\Models\CarsModel;
class Tracks extends BaseController
{
private object $tracksModel;
public function __construct()
{
$this->tracksModel = new TracksModel();
}
function index($id)
{
$this->cachePage(3600);
$track = getTrack($id);
$track = $this->tracksModel->data($id);
$bestLaps = getBestTimesTrack($id);
echo get_header('Track: ' . $track->name);
echo view('track', ['track' => $track, 'bestLaps' => $bestLaps]);

View File

@ -5,16 +5,16 @@ use App\Models\UsersModel;
class Users extends BaseController
{
protected $users;
protected object $usersModel;
public function __construct()
{
$this->users = new UsersModel();
$this->usersModel = new UsersModel();
}
public function index()
{
$users = $this->users->getUsers();
$users = $this->usersModel->findAll();
$tplData = [];
$tplData['users'] = $users;
echo get_header('Users');
@ -25,17 +25,15 @@ class Users extends BaseController
public function user($username)
{
//$this->cachePage(3600);
$userid = $this->users->getUser($username);
$user = new UsersModel($userid);
unset($user->addUser);
$userraces = $user->getRaces();
$raceswon = $user->getWon();
$racespodiums = $user->getPodiums();
$racesretired = $user->getUnfinisced();
$practices = $user->getPractices();
$qualifies = $user->getQualifies();
$user = $this->usersModel->getUser($username);
$userraces = $this->usersModel->getRaces();
$raceswon = $this->usersModel->getWon();
$racespodiums = $this->usersModel->getPodiums();
$racesretired = $this->usersModel->getUnfinisced();
$practices = $this->usersModel->getPractices();
$qualifies = $this->usersModel->getQualifies();
$tplData = [
'raceSessions' => $user->getRaceSessions(),
'raceSessions' => $this->usersModel->getRaceSessions(),
'userRaces' => $userraces,
'racesWon' => $raceswon,
'raceswonpercent' => percentStr($raceswon, count($userraces)),
@ -45,16 +43,24 @@ class Users extends BaseController
'qualifiescount' => $qualifies,
'racesretired' => $racesretired,
'racesretiredpercent' => percentStr($racesretired, count($userraces)),
'mostusedcar' => $user->getMostUsedCar(),
'mostusedtrack' => $user->getMostUsedTrack(),
'timeontrackPractice' => $user->getTimePractice(),
'timeontrackQualify' => $user->getTimeQualify(),
'timeontrackRace' => $user->getTimeOnRace(),
'timeontrack' => $user->getTimeOnTracks(),
'mostusedcar' => $this->usersModel->getMostUsedCar(),
'mostusedtrack' => $this->usersModel->getMostUsedTrack(),
'timeontrackPractice' => $this->usersModel->getTimePractice(),
'timeontrackQualify' => $this->usersModel->getTimeQualify(),
'timeontrackRace' => $this->usersModel->getTimeOnRace(),
'timeontrack' => $this->usersModel->getTimeOnTracks(),
'user' => $user
];
log_message('debug', json_encode($tplData['raceSessions']));
echo get_header("User: $username");
echo view('user', $tplData);
echo get_footer();
}
public function login()
{
echo get_header("Log In");
echo view('login');
echo get_footer(['dashboard.js']);
}
}

View File

@ -14,9 +14,12 @@ class Webserver extends BaseController
public function index()
{
// Log connection
log_message('debug', 'New connection');
$so = getOS();
$data = $this->request->getPost('data');
if (!$data) return $this->failValidationError('No data received');
if (!$data) return $this->failValidationErrors('No data received');
$xml = xmlObj($data);

View File

@ -12,11 +12,6 @@ class Users
const HASH = PASSWORD_DEFAULT;
const COST = 16;
public function __construct()
{
$this->db = \Config\Database::connect();
}
/**
* Add new to the database
*/
@ -29,6 +24,7 @@ class Users
unset($data['passwordcheck']);
unset($data['phrase']);
unset($data['PHPSESSID']);
// First verify if the user or email
$sql = $this->db->table('users');

View File

@ -4,7 +4,7 @@
</h1>
<div class="ct-info">
<div class="ct-img">
<?= $car->imgTagFull() ?>
<?= imgTagFull($car->img, 'car', $car->name) ?>
</div>
<div class="ct-info-body">
<div class="ct-info-row">

13
app/Views/login.php Normal file
View File

@ -0,0 +1,13 @@
<div class="container">
<h1>Log In</h1>
<form id="login-form">
<label>Username</label>
<input type="text" name="username" />
<label>Password</label>
<input type="password" name="passwd" />
<button type="submit">Login</button>
</form>
<div id="login-error" class="error">
Usuario y/o contraseña incorrecto.
</div>
</div>

View File

@ -1,30 +1,32 @@
<?php
use App\Models\UsersModel;
$menu = '<nav>';
$menuSelect = '<select id="menu-select">';
/*################################
## generate the car category selection menu
################################
*/
foreach ($carCategoriesList as $id => $category) {
foreach ($carCategoriesList as $cat)
{
$class = '';
$selected = '';
//if the category contain no cars we do no consider it
//todo: should we display only officially released ones?
if (count($category->cars) > 0) {
if ($cat->totalCars > 0)
{
//if no category has been chosen by the user, used the first valid (non empty) one
if ($carCatId=='') {
$carCatId= $id;
}
if ($carCatId == '') $carCatId = $cat->id;
//set a splecial class for the menu item that represent the currently selected class
if ($carCatId == $id ){
if ($carCatId == $cat->id )
{
$class = 'class="selected"';
$selected = 'selected';
}
//echo "\n<a href='?cat=".$id."' $class>".$category->name."</a>";
$menu .= '<a href="'.rewriteUrl('cat',$id).'"'."$class>".$category->name."</a>";
$menuSelect .= '<option value="'.rewriteUrl('cat',$id).'"'."$selected>".$category->name."</option>";
$url = rewriteUrl('cat', $cat->id);
$menu .= "<a href=\"$url\" $class>{$cat->name}</a>";
$menuSelect .= "<option value=\"$url\" $selected>{$cat->name}</option>";
}
}
$menu .= '</nav>';
@ -44,10 +46,13 @@
<a id="year" href="<?= rewriteUrl('period','year'); ?>">Year</a>
<a id="allTime" href="<?= rewriteUrl('period','allTime'); ?>">All Time</a>
</nav>
<?php if (!empty($currCat)): ?>
<h1 id="cat-title">
<?= $carCategories->$carCatId->name; ?>
<?= $currCat->name ?>
</h1>
<?php endif ?>
<h3>
Most active users<br />
<small><?= $periodString; ?></small>
@ -61,15 +66,14 @@
</thead>
<tbody>
<?php
foreach ($users as $race):
$user = new UsersModel($race->user_id);
foreach ($users as $user):
?>
<tr>
<td data-title="Pilot">
<?= $user->getLink() ?>
<?= clickableName($user->username, 'user', $user->username) ?>
</td>
<td data-title="Races">
<?= $race->count ?>
<?= $user->count ?>
</td>
</tr>
<?php endforeach; ?>
@ -95,19 +99,18 @@
<tbody>
<?php
foreach ($mylaps as $mylap):
$user=new UsersModel($mylap->user_id);
$track = $mylap->track_id;
$car = $mylap->car_id;
?>
<tr>
<td data-title="Track">
<?= getTrack($track)->clickableName(); ?>
<?= clickableName($mylap->track_id, 'track', $mylap->track_name) ?>
</td>
<td data-title="Pilot">
<?= $user->getLink(); ?>
<?= clickableName($mylap->username, 'user', $mylap->username) ?>
</td>
<td data-title="Car">
<?= getCar($car)->clickableName(); ?>
<?= clickableName($mylap->car_id, 'car', $mylap->car_name) ?>
</td>
<td data-title="Laptime">
<?= formatLaptime($mylap->bestlap); ?>
@ -119,7 +122,7 @@
<?= $mylap->timestamp; ?>
</td>
<td data-title="Session">
<a href="<?= base_url() ?>/race/<?= $mylap->race_id ?>">#<?=$mylap->race_id?></a>
<a href="<?= base_url() ?>race/<?= $mylap->race_id ?>">#<?=$mylap->race_id?></a>
</td>
</tr>
<?php endforeach ?>
@ -139,10 +142,9 @@
</thead>
<tbody>
<?php foreach ($tracks as $race): ?>
<?php $track = $race->track_id ?>
<tr>
<td data-title="Track">
<?= getTrack($track)->clickableName() ?>
<?= clickableName($race->track_id, 'track', $tracksNames[$race->track_id]) ?>
</td>
<td data-title="Races">
<?= $race->count ?>
@ -151,7 +153,6 @@
<?php endforeach ?>
</tbody>
</table>
<h3>
Top cars<br />
<small><?php echo $periodString; ?></small>
@ -164,14 +165,13 @@
</tr>
</thead>
<tbody>
<?php foreach ($cars as $race): ?>
<?php $car = $race->car_id ?>
<?php foreach ($cars as $car): ?>
<tr>
<td data-title="Car">
<?= getCar($car)->clickableName() ?>
<?= clickableName($car->car_id, 'car', $car->name) ?>
</td>
<td data-title="Races">
<?= $race->count ?>
<?= $car->count ?>
</td>
</tr>
<?php endforeach ?>

View File

@ -15,19 +15,19 @@
<tr>
<th>Track:</th>
<td id="race-track-img">
<?= $track->linkTitleImgTag() ?>
<?= linkTitleImgTag($race->track_id, 'track', $race->track_name, $race->track_img) ?>
</td>
</tr>
<tr>
<th>Car:</th>
<td>
<?= $car->linkTitleImgTag() ?>
<?= linkTitleImgTag($race->car_id, 'car', $race->car_name, $race->car_img) ?>
</td>
</tr>
<tr>
<th>User:</th>
<td>
<?= $user->getLink() ?>
<?= clickableName($race->username, 'user', $race->username) ?>
</td>
</tr>
<tr>

View File

@ -1,9 +1,12 @@
<?php use App\Models\CarsModel; ?>
<?php
use App\Models\CarsModel;
$carsModel = new CarsModel();
?>
<div class="container">
<h1><?= $track->name; ?></h1>
<div class="ct-info">
<div class="ct-img">
<?= $track->imgTagFull() ?>
<?= imgTagFull($track->img, 'track-img', $track->name) ?>
</div>
<div class="ct-info-body">
<div class="ct-info-row">
@ -35,7 +38,7 @@
</thead>
<tbody>
<?php foreach($bestLaps as $bl): ?>
<?php $car = new CarsModel(getCar($bl->car_id)) ?>
<?php $car = $carsModel->data($bl->car_id) ?>
<tr>
<td data-title="Racer">
<?= $bl->username ?>
@ -44,7 +47,7 @@
<?= formatLaptime($bl->laptime) ?>
</td>
<td data-title="Car">
<?= $car->clickableName() ?>
<?= clickableName($car->id, 'car', $car->name) ?>
</td>
</tr>
<?php endforeach ?>

View File

@ -6,14 +6,15 @@
<div class="container">
<div id="user-header">
<div id="user-img">
<?= $user->getImgFile() ?>
<img class="avatar" src="<?= base_url("img/users/{$user->img}") ?>" alt="<?= $user->username ?>">
</div>
<div id="user-info">
<div>
<span class="user-info-title">Name:</span> <?= $user->username ?>
</div>
<div>
<span class="user-info-title">Country:</span> <img src="<?=base_url()?>/img/flags/flags_small/<?=$user->flag ?>" alt="<?=$user->nation?>" > <?=$user->nation ?>
<span class="user-info-title">Country:</span>
<img src="<?=base_url("img/flags/flags_small/<?=$user->flag")?>" alt="<?=$user->nation?>" > <?=$user->nation ?>
</div>
<div>
<span class="user-info-title">Total time:</span><?= secondsToTime(round($timeontrack, 0)) ?>
@ -32,11 +33,11 @@
</div>
<div>
<span class="user-info-title">Favorite car:</span>
<?php if ($mostusedcar->car) echo $mostusedcar->car->clickableName(); ?>
<?php if ($mostusedcar->car) echo clickableName($mostusedcar->car->id, 'car', $mostusedcar->car->name); ?>
</div>
<div>
<span class="user-info-title">Favorite track:</span>
<?php if ($mostusedtrack->track) echo $mostusedtrack->track->clickableName(); ?>
<?php if ($mostusedtrack->track) echo clickableName($mostusedtrack->track->id, 'track', $mostusedtrack->track->name); ?>
</div>
</div>
</div>
@ -107,7 +108,7 @@
?>
<tr>
<td data-title="Session ID">
<a href="<?=base_url()?>/race/<?=$race->id?>"><?=$race->id?></a>
<a href="<?=base_url("race/{$race->id}")?>"><?=$race->id?></a>
</td>
<td data-title="Type">
<?= racetype($race->type) ?>
@ -116,10 +117,10 @@
<?= date_format(new DateTime($race->timestamp), 'd M Y @ H:i') ?>
</td>
<td data-title="Track">
<?= getTrack($race->track_id)->name ?>
<?= $race->track_name ?>
</td>
<td data-title="Car">
<?= getCar($race->car_id)->name ?>
<?= $race->car_name ?>
</td>
<td data-title="Finish Position">
<?php
@ -127,19 +128,11 @@
{
echo $race->endposition;
$gain = $race->startposition - $race->endposition;
if ($gain >= 0)
{
echo " <sup style='color:green;'>(+$gain)</sup>";
}
else
{
echo "<sup style='color:red;'>($gain)</sup>";
}
}
else
{
echo 'Retired/Not finished';
if ($gain >= 0) echo " <sup style='color:green;'>(+$gain)</sup>";
else echo "<sup style='color:red;'>($gain)</sup>";
}
else echo 'Retired/Not finished';
?>
</td>
</tr>

View File

@ -1,13 +1,13 @@
<div class="container">
<div class="cards">
<?php foreach ($users as $user): ?>
<a href="<?= base_url() ?>/user/<?= $user->username ?>" class="user-card">
<a href="<?= base_url() ?>user/<?= $user->username ?>" class="user-card">
<div class="card-head">
<div class="card-title">
<?= $user->username ?>
</div>
<div class="card-img">
<img src="<?=base_url()?>/img/users/<?=$user->img?>">
<img src="<?=base_url()?>img/users/<?=$user->img?>">
</div>
</div>
<div class="card-body">

View File

@ -560,11 +560,53 @@ sd-carcategoryselection {
margin: 1rem auto;
}
#race-info #race-track-img img {
#race-info #race-track-img img,
.ct-img {
background: #bdbdbd;
padding: .3rem
}
/* Login */
#login-form {
width: 240px;
margin: auto;
display: block;
}
#login-form button {
display: block;
background-color: #13aff0;
border: 0;
font-size: 1.2rem;
padding: .5rem 1rem;
border-radius: 3px;
color: #fff;
margin: .5rem auto;
}
#login-error {
width: auto;
max-width: 380px;
margin: auto;
text-align: center;
}
#login-error::before {
content: '';
}
#img_404 {
display: block;
margin: auto;
max-width: 192px;
}
#text_404 {
font-size: 1.2rem;
font-weight: 600;
text-align: center
}
@media (min-width: 640px) and (max-width: 1023px) {
.cards > .user-card {
width: 45%;

BIN
public/img/404.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

544
public/img/404.svg Normal file
View File

@ -0,0 +1,544 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="512"
height="512"
viewBox="0 0 135.46666 135.46667"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="404.svg"
inkscape:export-filename="404.png"
inkscape:export-xdpi="98.304085"
inkscape:export-ydpi="98.304085"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1"
inkscape:cx="366.5"
inkscape:cy="158.5"
inkscape:window-width="1334"
inkscape:window-height="712"
inkscape:window-x="32"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" /><defs
id="defs2" /><g
inkscape:label="Capa 1"
inkscape:groupmode="layer"
id="layer1"
sodipodi:insensitive="true"
style="display:none"><image
width="135.46666"
height="135.46666"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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
"
id="image190"
x="37.26667"
y="80.76667" /></g><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="dibujo"
style="opacity:1"><g
id="g2622"
transform="matrix(0.96711724,0,0,0.9671188,-33.813977,-75.883808)"><rect
style="color:#000000;overflow:visible;fill:#ffffff;stroke:#000000;stroke-width:1.32292;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="rect909"
width="135.46666"
height="135.46666"
x="37.26667"
y="80.76667"
ry="4.77422" /><path
id="rect963"
style="color:#000000;overflow:visible;fill:#003399;fill-opacity:1;stroke:none;stroke-width:1.32292;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
sodipodi:type="inkscape:offset"
inkscape:radius="-2.7511361"
inkscape:original="M 42.041016 80.767578 C 39.396098 80.767578 37.267578 82.896098 37.267578 85.541016 L 37.267578 211.45898 C 37.267578 214.1039 39.396098 216.23242 42.041016 216.23242 L 167.95898 216.23242 C 170.6039 216.23242 172.73242 214.1039 172.73242 211.45898 L 172.73242 85.541016 C 172.73242 82.896098 170.6039 80.767578 167.95898 80.767578 L 42.041016 80.767578 z "
d="m 42.041016,83.519531 c -1.168918,0 -2.021485,0.852567 -2.021485,2.021485 V 211.45898 c 0,1.16893 0.852567,2.02149 2.021485,2.02149 H 167.95898 c 1.16893,0 2.02149,-0.85256 2.02149,-2.02149 V 85.541016 c 0,-1.168918 -0.85256,-2.021485 -2.02149,-2.021485 z" /><rect
style="color:#000000;overflow:visible;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.3037;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="rect1831"
width="62.196301"
height="22.508797"
x="73.682076"
y="116.36103"
rx="0"
ry="0" /><rect
style="color:#000000;overflow:visible;opacity:1;fill:#d50000;fill-opacity:1;stroke:none;stroke-width:1.09906;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="rect2613"
width="57.10928"
height="17.421778"
x="76.225586"
y="118.90454"
rx="0"
ry="0" /><rect
style="color:#000000;overflow:visible;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.28259;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="rect2615"
width="17.238243"
height="78.397858"
x="96.380875"
y="137.72058" /></g></g></svg>

After

Width:  |  Height:  |  Size: 38 KiB