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 5. Järjestelmän rakenne ja reititys

Tähän saakka olemme tehneet ohjanneet kaikki muut sivut avautumaan index-sivun sisällä lähettämällä pyynnön mukana parametrejä (index.php?sivu=harj1...), jotka kertovat, mikä sivu sisällytetään.

Tässä ohjaamme edelleen kaikki pyynnöt index-sivulle, tällä kertaa käytämme hyväksi .htaccess-tiedostoa.

.htaccess on piilotiedosto, joka tavallisesti sijoitetaan samaan kansioon kuin itse sovellus. .htaccess on Apacheen liittyvä tiedosto, ja on mahdollista, että emme pääsen konfiguroimaan magnesiumia sitä varten. Sen sijaan Xamppia käytettäessä se on toimiva, käytämme sitä Xamppin htdocs-kansiossa osoittamaan sovelluksen alikansiota.

Jos haluat käyttää Windows -palvelinta (IIS)Tutustu aiheeseen web.config.

Yleisohjeistusta .htaccessin käyttöön.

mvc-mallina

Kuvassa näkyy sovelluksen perusidea.
Kun johonkin sovelluksen osaan tulee hhtp-pyyntö, .htaccess ohjaa sen index.php -sivulle.
index.php -sivu reitittää pyynnön. Reitityksessä se lukee pyynnön ja pyydetyn metodin (get vai post) ja sen mukaan sisällyttää tarvittavan kontrollerin tai näkymän (view).

Kaikki tietokantaa käsittelevä koodi on tietokantaluokissa eli malleissa (models).

Kontrolleri keskustelee mallin kanssa: jos sinne ollaan syöttämässä syöttämässä tietoja, se tarkistaa syötteeet ja kutsuu sen jälkeen tietokantaluokan tarkoitukseen sopivaa metodia.

Jos taas halutaan hakea tietoja, se kutsuu metodia, joka palauttaa tarvittavat tiedot.

Sen jälkeen kontrolleri sisällyttää näkymän.

Pyynnön ohjaaminen index.php:lle .htaccessin avulla.

Kun http-pyyntö osoitetaan jollekin osoitteelle kansiossa, .htaccess ohjaa sen index.php:lle.

yksinkertainen .htaccess-tiedosto

Tässä muodossa se sijoitetaan sovelluksen kansioon, joka on ympäristönsä www-juuressa. Paikan ja polkujen vaihtaminen muuttaa kohtaa Rewrite base.

Options -Indexes -MultiViews +FollowSymLinks
RewriteEngine On

RewriteBase /

#ohjaa kaikki sivut index.php-sivulle
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA]

Koko järjestelmän luokkakaavio ja polut

Luokkakaavio:

luokat ja polut

Luokka reititystä varten

Pyörää ei kannata keksiä uudelleen, ja siksi käytämme tässä valmista luokkaa reititystä varten. Käyttämämme luokan on laatinut Christoph Stitz ja se löytyy kokonaisuudessaan hänen sivustoltaan steampixel.de.

Sivusto muuttuu koko ajan: jos haet sivulta osia, päivitä kaikki muutkin siihen liittyvät osat ja muista lukea koko dokumentaatio, sillä luokan metodien muutos näkyy myös index.php:ssa.

Ohjeistus eri kansiorakenteissa reittien käyttöön

Erilainen ympäristö vaikuttaa siihen, kuinka viittaukset kansioihin ja .htaccess kannattaa tehdä eri osassa sovellusta. Tämän esimerkin tiedostojärjestelmä on sijoitettu alidomainin juureen ja polut ovat erilaiset kuin sijoitettaessa Xamppin htdocs-kansion alikansioon. Reittiohje antaa hiukan apua reiteistä eri tiedostoissa.

./Route.php

Lisätään reittiluokka (juurikansioon):

<?php
class Route{

  private static 
$routes = Array(); //pysyvät reitit, eivät sidottu olioon
  
private static $pathNotFound null//polkuvirhe, ei sidottu olioon, oletusarvo : ei ole
  
private static $methodNotAllowed null;//metodivirhe oletusarvo : ei ole

  //metodilla lisätään reitti reittitaulukkoon, expression on polun se osa, joka näkyy, function on se, mitä tehdään ja method on pyynnön method (post tai get) - taulukon kuva??
  
  
public static function add($expression$function$method 'get'){
    
array_push(self::$routes,Array(
      
'expression' => $expression,
      
'function' => $function,
      
'method' => $method
    
));
  }

  
//virhemetodi (polkua ei löydy)
  
public static function pathNotFound($function){
    
self::$pathNotFound $function;
  }

  
//virhemetodi
  
public static function methodNotAllowed($function){
    
self::$methodNotAllowed $function;
  }

  
//korjaa pyynnön URL:n sopivaan muotoon - poistaa kenot ja poimii pyynnöstä URL:n
  // jos muunnettu polku on olemassa, polku on se
  // tekee saman pyynnön method-osalle
  // muuten polku on '/'
  // suorittaa annetun polun
  
  
  
public static function run($basepath '/'){

    
// Parse current url
    
$parsed_url parse_url($_SERVER['REQUEST_URI']);//Parse Uri

    
if(isset($parsed_url['path'])){
      
$path $parsed_url['path'];
    }else{
      
$path '/';
    }

    
// Get current request method
    
$method $_SERVER['REQUEST_METHOD'];
    
$path_match_found false
    
$route_match_found false

    
//käy läpi reittitaulukon
    
foreach(self::$routes as $route){

      
//jos metodi on ok (eikä esim. tyhjä tai keno eli juuri)
      // Add basepath to matching string
      // annetaan taulukon pyynnön osalle nimi - tämän lähetetään 

      
if($basepath!=''&&$basepath!='/'){
        
$route['expression'] = '('.$basepath.')'.$route['expression'];
      }

      
// Add 'find string start' automatically - lisää haun, jolla määritetään merkkijonon alkukohta ^eli hattu toimii ns.wildcardina
      
$route['expression'] = '^'.$route['expression'];

      
// Add 'find string end' automatically määrittää merkkijonon loppukohdan
      
$route['expression'] = $route['expression'].'$';

      
// echo $route['expression'].'<br/>';

      // Check path match    - löytyykö samaa polkua
      
if(preg_match('#'.$route['expression'].'#',$path,$matches)){

        
$path_match_found true;

        
// Check method match
        
if(strtolower($method) == strtolower($route['method'])){

          
array_shift($matches);// Always remove first element. This contains the whole string

          
if($basepath!=''&&$basepath!='/'){
            
array_shift($matches);// Remove basepath
          
}

          
call_user_func_array($route['function'], $matches);

          
$route_match_found true;

          
// Do not check other routes
          
break;
        }
      }
    }

    
// No matching route was found
    
if(!$route_match_found){

      
// But a matching path exists
      
if($path_match_found){
        
header("HTTP/1.0 405 Method Not Allowed");
        if(
self::$methodNotAllowed){
          
call_user_func_array(self::$methodNotAllowed, Array($path,$method));
        }
      }else{
        
header("HTTP/1.0 404 Not Found");
        if(
self::$pathNotFound){
          
call_user_func_array(self::$pathNotFound, Array($path));
        }
      }

    }

  }

}
?>

Reittiesimerkkejä

Ylläolevaan versioon liittyviä reittiesimerkkejä...

./index.php

Lisätään reittiluokka index.php-tiedostoon (juurikansioon):

<?php
require './Route.php'// routing class
?>


>> Tunti 6. Toteuta lukijan pääsivu (./) >>