Sähköisten asiointipalveluiden toteuttaminen

Sorakuilu

Demo 13, MVC-malli

Tehtävä: Muunna aikaisemmin tehtyä demoa 12 MVC-mallin mukaiseksi.

Alla oleva kuva esittää lopputulokseksi tulevaa pikkuriikistä järjestelmää, jolla voidaan ylläpitää pelaajien tietoja.

käsitteellinen sivukartta

Kansiot

Tieostot organisoidaan uudestaan, ne sijoitetaan seuraavaan kansiorakennelmaan:

kansiot

Kohta A - index.php - reititys

Tehdään reititys edelleen aikaisempaan tapaan eli $_GET kertoo, mikä sivu sisällytetään - tämä tapahtuu index-sivussa. Index-sivu ei kuitenkaan tulosta mitään, vain require (kontrolleri tai view)on sallittu.

Muu koodi jaetaan kolmeen erilaiseen kategoriaan: mallit (models), kontrollerit ja näkymät (views).

Yhteysfunktiota voit käyttää sellaisenaan.

./index.php

index-sivu ohjaa kaikki pyynnöt eteenpäin.

Lähdekoodi:

<?php
//pyynnöt on muotoa index.php?action=edit&id=5

if(isset($_GET["action"])) $action $_GET["action"];
else 
$action "index"//index on kotisivu
$method strtolower($_SERVER['REQUEST_METHOD']);

switch(
$action) {
    case 
"index":
    require 
"./controllers/indexcontroller.php";
    break;

    case 
"addplayer":
    if(
$method =="get") require "./views/addplayerform.view.php";
    else require 
"./controllers/postaddplayercontroller.php";
    break;

    case 
"delete":
    require 
"./controllers/deletecontroller.php";
    break;

    case 
"edit":
    if(
$method == "get") require "./controllers/geteditplayercontroller.php";
    else require 
"./controllers/posteditplayercontroller.php";
    break;


    default:
    echo 
"404";
 }

./database/connection.php

Lähdekoodi:

<?php
$dsn 
"mysql:host=magnesium;dbname=db13leena";
$user "leena";
$passwd "lmjn";

$pdo = new PDO($dsn$user$passwd);
?>

Kohta B

Laadi etusivu pelaajille (listaa näkyville kaikki pelaajat).

Käytä ratkaisussa MVC-mallia. Siis: index-sivu ohjaa pyynnön oikealle näkymälle tai kontrollerille (controllers), joka keskustelee tietokantafunktioiden kanssa (models).

Tässä

./controllers/indexcontroller.php

<?php
require "./database/models/Player.php";
$players getAllPlayers();
//var_dump($players);
require "./views/index.view.php";
?>

./database/models/Player.php

<?php
require "./database/connection.php";

function 
getAllPlayers()
{
    global 
$pdo;
    
$sql "SELECT id,account_name FROM players";
    
$stm $pdo->query($sql); 
    
    
$players $stm->fetchAll(PDO::FETCH_CLASS);
    return 
$players;
}

function 
addPlayer($data)
{
    global 
$pdo;
    
$sql "INSERT INTO players(account_name,password,email,last_login,online,money,current_character,banned) VALUES (?,?,?,?,?,?,?,?)";

    
$stm $pdo->prepare($sql);
    
$stm->execute($data);

    return 
$pdo->lastInsertId();
}

function 
deletePlayer($id)
{
    global 
$pdo;
    
$sql "DELETE FROM players WHERE id = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1$id);
    
$stm->execute();
}

function 
getPlayerById($id//hakee yhden pelaajan tiedot
{
    global 
$pdo;
    
$sql "SELECT * FROM players WHERE id = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1$id);
    
$stm->execute();

    
$player $stm->fetchAll(PDO::FETCH_CLASS);
    return 
$player;
}

function 
editPlayer($data)
{
    global 
$pdo;
    
$sql "UPDATE players SET account_name = ?, email = ?, money = ?,current_character = ?,banned = ? WHERE id = ?";

    
$stm $pdo->prepare($sql);
    return 
$stm->execute($data);    
}

./views/index.view.php

<?php
include "/partials/head.php";
?>

<h1>Kaikki pelaajat</h1>
<p>
<?php foreach($players as $player) {
    
?>
    <h3><?= $player->account_name;?></h3>
    <a href="./index.php?action=edit&id=<?=$player->id;?>">Muokkaa</a><br>
    <a href="./index.php?action=delete&id=<?=$player->id;?>">Poista</a><br>
<?php
}

if(isset(
$message)) echo $message;

include 
"/partials/end.php";
?>


Kohta C

Toteuta pelaajan lisääminen MVC-mallilla

Tässä

./controllers/postaddplayercontroller.php

<?php
require "./helpers/helper.php";
require 
"./database/models/Player.php";

if(isset(
$_POST["aname"],$_POST["passwd"],$_POST["passwd2"],$_POST["email"],$_POST["character"]) && $_POST["passwd"] == $_POST["passwd2"]) {
    
$name sanit($_POST["aname"]);
    
$passu sanit($_POST["passwd"]);
    
$email sanit($_POST["email"]);
    
$character sanit($_POST["character"]);
    
$last_login date('Y-m-d');


    
//(account_name,password,email,last_login,online,money,current_character,banned)

    
$data = array($name,$passu,$email,$last_login,1,500,$character,0);
    
//var_dump($data);
    
$id addPlayer($data);
    
$message "Lisätty uusi pelaaja, id on $id";
    
//echo $id;
    
$players getAllPlayers();
    require 
"./views/index.view.php";
}
else {
    
$message "Tietoja puuttuu";
    require 
"./views/addplayerform.view.php";
}

./views/addplayerform.view.php

<?php
include "/partials/head.php";

if(isset(
$message)) echo $message;?>

<form method="post">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" required><br>

<label for="passwd">Salasana</label><br>
<input type="password" name="passwd" required><br>

<label for="passwd2">Salasana uudestaan</label><br>
<input type="password" name="passwd2" required><br>

<label for="email">Sähköposti</label><br>
<input type="email" name="email" required><br>

<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö">hirviö</option>
    <option value="olio">olio</option>
    <option value="keiju">keiju</option>
</select>
<br>
<input type="submit" value="Lisää pelaaja">
</form>

<?php
include "/partials/end.php";
?>

Kohta D

Toteuta pelaajan poistaminen MVC-mallilla

Tässä

./controllers/deletecontroller.php

<?php
require "./database/models/Player.php";
$players getAllPlayers();
  
if(isset(
$_GET["id"])) {
    
$id$_GET["id"];
    
deletePlayer($id);
    require 
"./views/index.view.php";
}
else {
    
$message ="Poistaminen ei onnistu";
    require 
"./views/index.view.php";   
}

Kohta E

Toteuta pelaajan muokkaaminen MVC-mallilla.

Tässä

./controllers/geteditplayercontroller.php

<?php
require "./database/models/Player.php";

if(isset(
$_GET["id"])) {
    
$id $_GET["id"];
    
$player getPlayerById($id);
    require 
"./views/editplayerform.view.php";
}

./controllers/posteditplayercontroller.php

<?php
require "./database/models/Player.php";
require 
"./helpers/helper.php";


if(isset(
$_POST["id"],$_POST["aname"],$_POST["email"],$_POST["character"],$_POST["money"])) {
    
$id $_POST["id"];
    
$account_name sanit($_POST["aname"]);
    
$email sanit($_POST["email"]);
    
$current_character sanit($_POST["character"]);
    
$money $_POST["money"];
        
    if(isset(
$_POST["banned"])) $banned 1;
    else 
$banned 0;

    
$data = array($account_name,$email,$money,$current_character,$banned,$id);

    if(
editPlayer($data)) {
        
$players getAllPlayers();
        
$message "Tiedot muutettu";
        require 
"./views/index.view.php";
    }
    else {
        
$players getAllPlayers();
        
$message ="Muutos ei onnistunut";
        require 
"./views/index.view.php";
    }

}
else {
    
$players getAllPlayers();
    echo 
"Tietoja puuttuu";
    require 
"./views/index.view.php";
}

./views/editplayerform.view.php

<?php
include "/partials/head.php";
//var_dump($player);

if(isset($message)) echo $message;?>

<form method="post">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" value= "<?= $player[0]->account_name;?>" required><br>

<input type="hidden" name="id" value="<?= $player[0]->id;?>">

<!--
<label for="passwd">Salasana</label><br>
<input type="password" name="passwd" required><br>

<label for="passwd2">Salasana uudestaan</label><br>
<input type="password" name="passwd2" required><br>-->

<label for="email">Sähköposti</label><br>
<input type="email" name="email" value ="<?= $player[0]->email;?>" required><br>

<label for="money">Rahaa</label><br>
<input type="number" name="money" value ="<?= $player[0]->money;?>" required><br>

<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö" <?php if($player[0]->current_character == "hirviö") echo "selected";?>>hirviö</option>
    <option value="olio" <?php if($player[0]->current_character == "olio") echo "selected";?>>olio</option>
    <option value="keiju" <?php if($player[0]->current_character == "keiju") echo "selected";?>>keiju</option>
</select>
<br>
<label for="banned">Bannattu</label>
<input type ="checkbox" <?php if($player[0]->banned == 0) echo "value=\"0\"";
else echo 
"value=\"1\" checked";?>><br>

<input type="submit" value="Muuta pelaajaa">
</form>

<?php
include "/partials/end.php";
?>