Storybook

Sorakuilu

Harjoituksen osat

Tunti 1. Toimeksianto ja storybook-sovelluksen esitutkimus
Tunti 2. Suunnittele storybook
Tunti 3. Toteuta tietokanta
Tunti 4. Toteuta käyttöliittymä
Tunti 5. Laadi runko ja reititys järjestelmään
Tunti 6. Toteuta lukijan etusivu (tietojen haku lukijan näkymässä)
Tunti 7. Toteuta rekisteröityminen(tietojen lisäys lukijan näkymässä)
Tunti 8. Toteuta autentikointi (kirjaudu ja kirjaudu ulos)
Tunti 9. Toteuta ylläpidon etusivu (tietojen haku)
Tunti 10.Toteuta jutun lisäys ylläpitonäkymässä, tietojen tarkistus mukaan
Tunti 11.Toteuta jutun muokkaus ylläpitonäkymässä, tietojen tarkistus mukaan
Tunti 12.Toteuta jutun poistaminen ylläpitonäkymässä
Omat tehtävät: suunnittele ja toteuta admin-näkymän yhden jutun näyttäminen (linkki on jo olemassa), omien tietojen muokkaaminen sekä salasanan vaihtaminen (piirrä lisäksi kaaviot)


Tunti 10.Toteuta jutun lisäys ylläpitonäkymässä, tietojen tarkistus mukaan

Kirjautuneelle käyttäjälle avautuu admin-sivu, jossa näkyvät hänen itsensä kirjoittamat jutut,linkit muokkaukseen ja poistamiseen. Näkymässä on myös linkki jutun lisäämiseen

Kun auntetikoitunut käyttäjä klikkaa linkkiä, hänelle avautuu lomake (addstoryform.view), johon voi täyttää tiedot. StoryControllerin getAddStory-,etodi lisää tietoihin mukaan käyttäjän id:n.

Autentikoinnin varmistamiseksi reitityksessä tarkistetaan, onko käyttäjä kirjautunut.

Ja kun lomake lähetetään, reititys kutsuu StoryControllerin postAddStory-metodia. Metodi tarkistaa tiedot ja jos ne ovat kunnossa kutsuu Story-luokan metodia addStory($data) tallentamaan jutun tietokantaan, muuten se kutsuu uudestaan lomaketta.

Kun juttu on lisätty, palataan uudestaa admin.view-näkymään (käyttäjän omat jutut).

Tämän tunnin tehtävät

toteutettavat osat

Kuvassa näkyvät tässä vaiheessa tarvittavat osat, jo toteutetut ovat harmaalla pohjalla.

Alla olevat sekvenssikaaviot kuvaavat periaatetta - tarkemmin kuvattaessa kannattaa käyttää metodien ja muuttujien nimiä:

sekvenssikaavio

Ja kun autentikointi on varmistettu:

sekvenssikaavio

./database/models/Story.php, lisää metodi addStory($data)

Metodi lisää lähetetyn tiedon stories-tauluun.

<?php
//$data = array($headline,$article, $published,$hidedate)
    //tarkista ja anna kontrollerissa arvot
    
public static function add_story($data)
    {
        global 
$db;
        
        try {
            
$sql ="INSERT INTO stories(headline,article,hidedate,published,account_id) VALUES (?,?,?,?,?)";
            
$statement=$db->prepare($sql);
            
$statement->execute($data);
        }
        catch (
PDOException $e)
        {
          echo 
$e->getMessage();
          return 
FALSE;
        }
        return 
TRUE;
    }
?>

Reititys

Reitit annetaan sekä get-, että post-määreisinä, ne kutsuvat StoryController-luokan metodeja getAddStory(), joka hakee tyhjän lomakkeen ruudulle ja postAddStory($user), joka nimensä mukaisesti käsittelee täytettyä lomaketta.

Reittiin lisätään myös tarkistus kirjautumisesta: siinä käytetään User-luokan metodia session_login(), joka palauttaa true, mikäli käyttäjä on kirjautunut, muuten sisällytetään kirjautumislomake.

.

<?php
Route
::add('/addstory/', function() use ($userController,$storyController) {
    if(
$userController->getUser()->sessionLogin()) { 
        
$storyController->getAddStory($userController->getUser());
    }
    else require 
'./views/loginform.view.php';
},
'get');


Route::add('/addstory/', function() use ($userController,$storyController) {
    if(
$userController->getUser()->sessionLogin()) $storyController->postAddStory($userController->getUser());
    else require 
'./views/loginform.view.php';    
},
'post');

?>

./controllers/storyController.php - lisää metodit getAddStory($user) ja postAddStory($user)

getAddStory hakee vain kirjoittajan id:n ja sisällyttää lomakkeen.

postAddStory($user) tarkistaa lomakkeella syötetyt tiedot ja jos ne ovat kunnossa kutsuu Story-luokan metodia addStory($data) tallentamaan jutun tietokantaan, muuten se kutsuu uudestaan lomaketta. Sen jälkeen se hakee kirjoittajan jutut ja sisällyttää admin.view-näkymän.

<?php
    
public function getAddStory($user)
    {
        
$id $user->getId();
        require 
'./views/addstoryform.view.php';
    }
    
    public function 
postAddStory($user)
    {
        require 
'./helpers/helper.php';
        
$id $user->getId();
        echo 
$id;

        if(isset(
$_POST['headline'],$_POST['article'])) {
            
            
//Checking input
            
$headline=sanitize($_POST['headline']);
            
$article sanitize($_POST['article']);
            if(isset(
$_POST['hidedate']) && isValidDate($_POST['hidedate'])) $hidedate=$_POST['hidedate'];
            else {
                
$hidedate strtotime(date('Y-m-j')) + 1209600;
                
$hidedate date('Y-m-j',$hidedate);
            }
            
$published=date('Y-m-j');
            
            
// and adding to database
            
$data = array($headline,$article,$hidedate,$published,$id);
            if(
Story::add_Story($data)) $message="Uusi juttusi on lisätty";
            
            
// preparing the view
            
$stories Story::get_stories_by_id($id);
            require 
'./views/admin.view.php';    
            }
            
        else { 
            
$message "Tarkista pakolliset kentät";
            require 
'./views/addstoryform.view.php';
        }
    }
?>
    

./views/addstoryform.view.php - korjaa näkymää

Lisätään lomakenäkymä jutun lisäämiseen.

<?php
require './views/partials/admin_head.php';
if(isset(
$message)) echo $message;
?>

<form method="post">
    
    <p>
    <label for="headline">Otsikko </label><br>
    <input type="text" name="headline" 
    value="<?php if(isset($_POST["headline"])) echo $_POST["headline"];?>"
    required>
    </p>

    <p>
    <label for="hidedate">Poistuu näkyvistä </label><br>
    <input type="date" name="hidedate" 
    value="<?php if(isset($_POST["hidedate"])) echo $_POST["hidedate"];?>">
    </p>

    <p>
    <label for="article">Sisältö </label><br>
    <textarea rows="12" cols="50" name="article" 
    value="<?php if(isset($_POST["article"])) echo $_POST["article"];?>"
    required></textarea>
    </p>

    <p><input type="hidden" value="<?= $id?>" name="account_id">

    <p>
    <input class="button" type="submit" value="Lisää juttu">
    </p>
    
    </form> 



<?php    
require './views/partials/admin_end.php';
?>


>> Tunti 11.Toteuta jutun muokkaus ylläpitonäkymässä, tietojen tarkistus mukaan >>