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 11. Toteuta jutun muokkaus 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.

Kun auntetikoitunut käyttäjä klikkaa linkkiä, storyControllerin getEditStory-metodi hakee tietokannasta jutun tiedot ja käyttäjälle avautuu tiedot sisältävä lomake (editstoryform.view), johon voi tehdä muutoksia.

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

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

Kun juttua on muokattu, 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 editStory($data)

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

<?php
    
public static function edit_story($data)
    {
        global 
$db;
        
        
//Array of values for the PDO statement 
        
$sql_vars = array();
        
        
// Edit query 
        
$sql 'UPDATE stories SET ';

        if (!
is_null($data["headline"]))
        {
          
$sql .= 'headline = ?, ';
          
$sql_vars[] = $data["headline"];
        }
        
        if (!
is_null($data["article"]))
        {
          
$sql .= 'article = ?, ';
          
$sql_vars[] = $data["article"];
        }
        
        if (!
is_null($data["hidedate"]))
        {
          
$sql .= 'hidedate = ?, ';
          
$sql_vars[] = $data["hidedate"];
        }
        
        
$published date('Y-m-j');
        
$sql.= 'published = ?, ';
        
$sql_vars[] = $published;
        
        
$sql mb_substr($sql0, -2) . ' WHERE (story_id = ?)';
        
$sql_vars[] = $data["story_id"];
        
        if (
count($sql_vars) == 0)
        {
          
/* Nothing to change */
          
return TRUE;
        }

        
        try
        {
          
/* Execute query */
          
$st $db->prepare($sql);
          
$st->execute($sql_vars);
        }
        catch (
PDOException $e)
        {
          
/* Exception (SQL error) */
          
echo $e->getMessage();
          return 
FALSE;
        }
        
        
/* If no exception occurs, return true */
        
return TRUE;        
    }
?>

Reititys

Reitit annetaan sekä get-, että post-määreisinä, ne kutsuvat StoryController-luokan metodeja getEditStory(), joka hakee lomakkeen tietoineen ruudulle ja postEditStory($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('/editstory/(.*)', function($id) use ($userController,$storyController) {
    if(
$userController->getUser()->sessionLogin())  $storyController->getEditStory($id,$userController->getUser());
    else require 
'./views/loginform.view.php';
},
'get');

Route::add('/editstory/(.*)', function($id) use ($userController,$storyController) {
    if(
$userController->getUser()->sessionLogin()) $storyController->postEditStory($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 getEditStory($id,$user)
    {
        
$story Story::getStoryById($id);
        require 
'./views/editstoryform.view.php';
    }
    
    public function 
postEditStory($user)
    {
        
$account_id $user->getId();
        require 
'./helpers/helper.php';
        
        if(isset(
$_POST['id'])) {
            
            
//Checking input
            
$story_id=$_POST["id"];
            
            if(isset(
$_POST["headline"])) $headline=sanitize($_POST['headline']);
            else 
$headline=NULL;
            
            if(isset(
$_POST["article"]))$article sanitize($_POST['article']);
            else 
$article =NULL;
            
            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('story_id'=>$story_id'headline'=>$headline,'article'=>$article,'hidedate'=>$hidedate,'account_id'=>$account_id);
            if(
Story::edit_story($data)) $message="Juttuasi on muutettu";
            
            
// preparing the view
            
$stories Story::get_stories_by_id($account_id);
            require 
'./views/admin.view.php';    
        }
            
        else { 
            
$message "Tarkista pakolliset kentät";
            require 
'./views/addstoryform.view.php';
        }
                
    }
?>

./views/editstoryform.view.php -näkymä

Lisätään lomakenäkymä jutun muokkamiseen.

<?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($story[0])) echo $story[0]->headline;?>">
    </p>

    <p>
    <label for="article">* Teksti</label><br>
    <textarea name="article" cols="45" rows="5"><?php if(isset($story[0])) echo $story[0]->article;?>
    </textarea>
    </p>

    <p>
    <label for="hidedate">Poistamispvm (jos et aseta päiväystä, poistuu kahden viikon kuluttua)</label><br>
    <input type="date" name="hidedate" 
    value="<?php if(isset($story)) echo $story[0]->hidedate;?>"><br>

    <input type="hidden" name="id"
    value="<?php if(isset($story[0])) echo $story[0]->story_id;?>">
    
    <p>
    <input class="button" type="submit" value="Muokkaa juttua" name="submitbutton">
    </p>
        
</form>


>> Tunti 12.Toteuta jutun poistaminen ylläpitonäkymässä >>