Commit
This commit is contained in:
		
							parent
							
								
									5d46a8b24d
								
							
						
					
					
						commit
						6d4f387941
					
				@ -1,16 +1,16 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
// Encapsulates a single connection to a database
 | 
			
		||||
class Database 
 | 
			
		||||
class DBHandle 
 | 
			
		||||
{
 | 
			
		||||
    public object $dbh;
 | 
			
		||||
 | 
			
		||||
    private string $host = '127.0.0.1';
 | 
			
		||||
    private string $db   = 'test';
 | 
			
		||||
    private string $user = 'root';
 | 
			
		||||
    private string $pass = '';
 | 
			
		||||
    private string $charset = 'utf8mb4';
 | 
			
		||||
 | 
			
		||||
    public object $dbh;
 | 
			
		||||
 | 
			
		||||
    public function __construct()
 | 
			
		||||
    {
 | 
			
		||||
        try {
 | 
			
		||||
							
								
								
									
										9
									
								
								app/core/Flash.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								app/core/Flash.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
// Provide user feedback by flashing a message on the next request. This is usually combined with a layout template that does this. 
 | 
			
		||||
class Flash extends Session {
 | 
			
		||||
    public function add(): void
 | 
			
		||||
    {
 | 
			
		||||
        // TODO: ...
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -2,6 +2,14 @@
 | 
			
		||||
/*
 | 
			
		||||
    This is the main file to be included on every page.
 | 
			
		||||
    It will act as a front controller of our application.
 | 
			
		||||
      _____
 | 
			
		||||
     /     \
 | 
			
		||||
    | () () |
 | 
			
		||||
     \  ^  /
 | 
			
		||||
      |||||
 | 
			
		||||
      |||||
 | 
			
		||||
 | 
			
		||||
    Tread carefully
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
spl_autoload_register(function ($class_name) {
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,7 @@
 | 
			
		||||
<?php $this->view('template/header', ['title' => $title]); ?>
 | 
			
		||||
 | 
			
		||||
<h1>Hello world</h1>
 | 
			
		||||
<p>This is a message from the view</p>
 | 
			
		||||
<p><?=$data?></p>
 | 
			
		||||
 | 
			
		||||
<?php $this->view('template/footer'); ?>
 | 
			
		||||
@ -1,14 +1,11 @@
 | 
			
		||||
            </main>
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <footer>
 | 
			
		||||
        <div class="footer">
 | 
			
		||||
            <div class="inner">
 | 
			
		||||
                <small>Kopieringsrettigheter © 2021-2022 <a target="_blank" href="http://willy.club">WillySoft Solutions</a></small>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </footer>
 | 
			
		||||
    <hr class="hidden">
 | 
			
		||||
 | 
			
		||||
    <div id="footer">
 | 
			
		||||
        <small>Kopieringsrettigheter © 2021-2022 <a target="_blank" href="http://willy.club">WillySoft Solutions</a></small>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@ -6,75 +6,34 @@
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title><?=htmlspecialchars($title);?> – Stafett for livet</title>
 | 
			
		||||
 | 
			
		||||
    <link rel="stylesheet" href="<?=$this->urlFor('static/style/main.css');?>">
 | 
			
		||||
    <link rel="icon" href="<?=$this->urlFor('static/img/cropped-kf-propell-ikon-32x32.png');?>" sizes="32x32">
 | 
			
		||||
    <link rel="stylesheet" href="static/style/main.css">
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
    <header>
 | 
			
		||||
        <div class="navbar-top">
 | 
			
		||||
            <div class="inner">
 | 
			
		||||
                <a href="<?=$this->urlFor('/');?>" style="display: block; max-width: max-content;">
 | 
			
		||||
                    <img style="display: block; height: 32px;" src="<?=$this->urlFor('static/img/cropped-kf-propell-ikon-32x32.png');?>" alt="">
 | 
			
		||||
                    <div style="margin-left: 44px;">
 | 
			
		||||
                        <div style="font-size: 24px; margin-top: -38px;">Stafett for livet</div>
 | 
			
		||||
                        <div style="font-size: 10px; margin-top: -6px;"><b>KREFT</b>FORENINGEN</div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </a>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    </header>
 | 
			
		||||
 | 
			
		||||
    <?php if ((isset($_SESSION['logged_in'])) && ($_SESSION['logged_in'] === TRUE)) : ?>
 | 
			
		||||
    <div class="login-statusbar">
 | 
			
		||||
        <div class="inner">
 | 
			
		||||
            <a href="<?=$this->urlFor('logout.php');?>" style="float: right;">Logg ut</a>
 | 
			
		||||
            <div>Inlogget som: <?=htmlspecialchars($_SESSION['username'])?></div>
 | 
			
		||||
        </div>
 | 
			
		||||
    <div id="header">
 | 
			
		||||
        <a>Stafett for livet tellesystem</a>
 | 
			
		||||
    </div>
 | 
			
		||||
    <?php endif; ?>
 | 
			
		||||
 | 
			
		||||
    <div class="grid-container">
 | 
			
		||||
    <hr class="hidden">
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
            <nav class="nav-links">
 | 
			
		||||
                <ul>
 | 
			
		||||
                    <li><a href="<?=$this->urlFor('/');?>">Forside</a></li>
 | 
			
		||||
                    <li><a href="<?=$this->urlFor('login.php');?>">Logg inn</a></li>
 | 
			
		||||
                    <li><a href="<?=$this->urlFor('example.php');?>">Eksempel</a></li>
 | 
			
		||||
                </ul>
 | 
			
		||||
            </nav>
 | 
			
		||||
    <div id="menu">
 | 
			
		||||
        <small>
 | 
			
		||||
            <span>Ikke pålogget</span>
 | 
			
		||||
            <a href="">Logg inn</a>
 | 
			
		||||
        </small>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <hr class="hidden">
 | 
			
		||||
 | 
			
		||||
    <div id="container"> 
 | 
			
		||||
 | 
			
		||||
        <div id="nav">
 | 
			
		||||
            <ul>
 | 
			
		||||
                <li><a href="">Forside</a></li>
 | 
			
		||||
                <li><a href="">Logg inn</a></li>
 | 
			
		||||
                <li><a href="">Eksempel</a></li>
 | 
			
		||||
            </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
            <?php
 | 
			
		||||
            // is my implementation of alerts janky? maybe...
 | 
			
		||||
            if ((isset($_SESSION['alert'])) && (count($_SESSION['alert']) > 0)) {
 | 
			
		||||
                foreach ($_SESSION['alert'] as $alert) {
 | 
			
		||||
                    switch ($alert[0]) {
 | 
			
		||||
                        case 'success':
 | 
			
		||||
                            $prefix = 'Suksess –';
 | 
			
		||||
                            break;
 | 
			
		||||
        <hr class="hidden">
 | 
			
		||||
 | 
			
		||||
                        case 'info':
 | 
			
		||||
                            $prefix = 'Info –';
 | 
			
		||||
                            break;
 | 
			
		||||
    
 | 
			
		||||
                        case 'warning':
 | 
			
		||||
                            $prefix = 'Varsel –';
 | 
			
		||||
                            break;
 | 
			
		||||
    
 | 
			
		||||
                        case 'danger':
 | 
			
		||||
                            $prefix = 'Error –';
 | 
			
		||||
                            break;
 | 
			
		||||
                        
 | 
			
		||||
                        default:
 | 
			
		||||
                            $alert[0] = 'danger';
 | 
			
		||||
                            $prefix = 'Ukjent –';
 | 
			
		||||
                            break;
 | 
			
		||||
                    }
 | 
			
		||||
                    echo('<div class="alert alert-'.$alert[0].'"><b>'.$prefix.'</b> '.$alert[1].'</div>');
 | 
			
		||||
                }
 | 
			
		||||
                $_SESSION['alert'] = [];
 | 
			
		||||
            }
 | 
			
		||||
            ?>
 | 
			
		||||
            <main>
 | 
			
		||||
        <div id="main">
 | 
			
		||||
 | 
			
		||||
@ -12,5 +12,6 @@ $username = $model->getUsername();
 | 
			
		||||
 | 
			
		||||
// Display view with retrieved data 
 | 
			
		||||
$contr->view('index', [
 | 
			
		||||
    "title" => "Forside",
 | 
			
		||||
    "data" => $username
 | 
			
		||||
]);
 | 
			
		||||
@ -1,124 +1,114 @@
 | 
			
		||||
html, body {
 | 
			
		||||
    height: 100%;
 | 
			
		||||
}
 | 
			
		||||
body {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-flow: column;
 | 
			
		||||
 | 
			
		||||
    background: #eee;
 | 
			
		||||
    color: #222;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    font-size: 1rem;
 | 
			
		||||
    font-family: "Liberation Sans", Arial, sans-serif;
 | 
			
		||||
    line-height: 1.5;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, h2, h3, h4 {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
.hidden { display: none; }
 | 
			
		||||
 | 
			
		||||
h1 {
 | 
			
		||||
    border-bottom: 1px solid #aaa;
 | 
			
		||||
    margin-bottom: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-top {
 | 
			
		||||
    padding: 12px;
 | 
			
		||||
    background: #472987;
 | 
			
		||||
    /*background: linear-gradient(0deg, rgba(71,40,134,1) 0%, rgba(81,24,195,1) 100%);*/
 | 
			
		||||
}
 | 
			
		||||
.navbar-top .inner {
 | 
			
		||||
    max-width: 900px;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
}
 | 
			
		||||
.navbar-top .inner a {
 | 
			
		||||
    color: #f8f8f8;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-statusbar {
 | 
			
		||||
    border-top: 2px solid #f8f8f8;
 | 
			
		||||
    background: rgb(54,148,37);
 | 
			
		||||
    background: linear-gradient(0deg, rgba(54,148,37,1) 0%, rgba(62,162,34,1) 50%, rgba(63,177,43,1) 100%);
 | 
			
		||||
}
 | 
			
		||||
.login-statusbar .inner {
 | 
			
		||||
    max-width: 900px;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
    color: #f8f8f8;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    padding-left: 12px;
 | 
			
		||||
    padding-right: 12px;
 | 
			
		||||
    padding-top: 4px;
 | 
			
		||||
    padding-bottom: 4px;
 | 
			
		||||
    text-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
 | 
			
		||||
}
 | 
			
		||||
.login-statusbar .inner > a {
 | 
			
		||||
    color: #f8f8f8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.footer {
 | 
			
		||||
    background: #d8d8d8;
 | 
			
		||||
    border-top: 1px solid #aaa;
 | 
			
		||||
    padding: 12px;
 | 
			
		||||
    max-width: 888px;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
}
 | 
			
		||||
.grid-container {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
 | 
			
		||||
    display: grid;
 | 
			
		||||
    grid-template-columns: max-content auto;
 | 
			
		||||
    grid-gap: 12px;
 | 
			
		||||
 | 
			
		||||
    max-width: 888px;
 | 
			
		||||
    margin: 0 auto;
 | 
			
		||||
    padding: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.grid-container main img {
 | 
			
		||||
    display: block;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    height: auto;
 | 
			
		||||
    border: 1px solid #aaa;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.grid-container .nav-links {
 | 
			
		||||
    background: #eee;
 | 
			
		||||
    border: 1px solid #aaa;
 | 
			
		||||
    padding: 12px;
 | 
			
		||||
}
 | 
			
		||||
.grid-container .nav-links ul {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding-left: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
    color: rgb(0, 0, 255);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media only screen and (max-width: 600px) {
 | 
			
		||||
    .grid-container {
 | 
			
		||||
        grid-template-columns: auto;
 | 
			
		||||
#header {
 | 
			
		||||
    padding: 1rem;
 | 
			
		||||
    padding-left: .75rem;
 | 
			
		||||
    padding-right: .75rem;
 | 
			
		||||
    background: #472987;
 | 
			
		||||
}
 | 
			
		||||
#header a {
 | 
			
		||||
    color: #eee;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#menu {
 | 
			
		||||
    background: #222;
 | 
			
		||||
    color: #eee;
 | 
			
		||||
    padding: .25rem;
 | 
			
		||||
    padding-left: .75rem;
 | 
			
		||||
    padding-right: .75rem;
 | 
			
		||||
}
 | 
			
		||||
#menu a { color: #eee; float: right; }
 | 
			
		||||
#menu span { float: left; }
 | 
			
		||||
 | 
			
		||||
#container {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-grow: 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#main {
 | 
			
		||||
    padding: .75rem;
 | 
			
		||||
    flex-grow: 1;
 | 
			
		||||
}
 | 
			
		||||
#main img {
 | 
			
		||||
    display: block;
 | 
			
		||||
    height: auto;
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#nav {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    padding: .75rem;
 | 
			
		||||
    line-height: 1.6;
 | 
			
		||||
}
 | 
			
		||||
#nav ul {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding-left: .75rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media only screen and (max-width: 40rem) {
 | 
			
		||||
    #container {
 | 
			
		||||
        flex-flow: column;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.alert {
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    margin-bottom: 8px;
 | 
			
		||||
    border: 1px solid transparent;
 | 
			
		||||
    border-radius: 2px;
 | 
			
		||||
#footer {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    padding: .75rem;
 | 
			
		||||
}
 | 
			
		||||
.alert-info {
 | 
			
		||||
#footer small {
 | 
			
		||||
    float: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.alert {
 | 
			
		||||
    padding: .5rem;
 | 
			
		||||
    margin-bottom: .5rem;
 | 
			
		||||
    border: 1px solid transparent;
 | 
			
		||||
    border-radius: .15rem;
 | 
			
		||||
}
 | 
			
		||||
.alert.info {
 | 
			
		||||
    color: #0c5460;
 | 
			
		||||
    background-color: #d1ecf1;
 | 
			
		||||
    border-color: #62b1bd;
 | 
			
		||||
    background: linear-gradient(0deg, rgba(167,223,232,1) 0%, rgba(209,236,241,1) 100%);
 | 
			
		||||
}
 | 
			
		||||
.alert-success {
 | 
			
		||||
.alert.success {
 | 
			
		||||
    color: #155724;
 | 
			
		||||
    background-color: #d4edda;
 | 
			
		||||
    border-color: #56bf6e;
 | 
			
		||||
    background: linear-gradient(0deg, rgba(165,227,180,1) 0%, rgba(212,237,218,1) 100%);
 | 
			
		||||
}
 | 
			
		||||
.alert-danger {
 | 
			
		||||
.alert.danger {
 | 
			
		||||
    color: #721c24;
 | 
			
		||||
    background-color: #f8d7da;
 | 
			
		||||
    border-color: #c8848c;
 | 
			
		||||
    background: linear-gradient(0deg, rgb(249, 180, 186) 0%, rgb(248, 215, 218) 100%);
 | 
			
		||||
}
 | 
			
		||||
.alert-warning {
 | 
			
		||||
.alert.warning {
 | 
			
		||||
    color: #856404;
 | 
			
		||||
    background: #fff3cd;
 | 
			
		||||
    border-color: #dfc678;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user