MVC - korzystamy z modelu

Data: 2017-08-20, autor: Michał Misztal

Ostatnio bąknąłem, że napisze co nieco o modelach w MVC. Zrobię to więc dzisiaj. Za oknem leje, Godsmack leci z głośników więc do dzieła.

Będzie to kontynuacje tego projektu co to go wcześniej zacząłem i zamieściłem źródła. Jest to strona firmy a dzisiaj opiszę jak to stronę z promocjami stworzyć - wsio będzie pobierane z bazy danych. Zanim zaczniemy musiałem wprowadzić drobne poprawki do głównej aplikacji.

Ryc. 1. Takie coś tworzymy

Jako, że "eksplodujemy" url do postaci tablicy to musimy to uwzględnić w głównej aplikacji i kontrolerze. Nasz link z promocjami będzie wyglądał tak /produkty/promocje co się przekłada na taki kod



$url={
	"produkty",
	"promocje"
}

Główny if w aplikacji wygląda teraz tak



if(file_exists($file)){
            require $file;
            $controller=new $url[0];
            $controller->loadModel($url[0]);
            $controller->index($url[1]);
        }else{
            require 'controllers/error_404.php';
            new Error_404();
        }

Musiałem dodać metodę index do każdego kontrolera, bo inaczej widok ładował się przed modelem przez co dostawałem figę. Metoda index odpowiada za podstrony. Index więc przyjmuje parametr nr 2 ($url[1]) z linka czyli "promocje". I to na razie tyle jeśli chodzi o główną aplikację. Pora jeszcze utworzyć folder na zdjęcia (u mnie to "/public/img/promocje") i tabelę w bazie danych (tego nie będę opisywał bo całość się i tak wyjaśni w trakcie).

Ok, w lokalizacji "libs/Database.php" utwórzmy sobie klasę Database dziedziczącą po PDO. W konstruktorze wrzućmy nasze dane do podłączenia czyli



class Database extends PDO {

    function __construct() {
        parent::__construct("mysql:host=".DBHOST.";dbname=".DBNAME,DBUSER,DBPASS);
    }

}

Ja dane do podłączenia trzymam w jednym pliku po to by w razie aktualizacji frameworka go nie kopiować = bestresowe testowanie aplikacji na localhost. W klasie Model inicjalizujemy naszą bazę



class Model {

    function __construct() {
        $this->db=new Database();
    }
  
}

Teraz utworzymy klasę Produkty_Model w pliku "/models/produkty_model.php" z zawartością



class Produkty_Model extends Model{
    
    function __construct() {
        parent::__construct();
        
    }
    
    public function pokaz($ile){
        $stmt=$this->db->prepare("select * from promocje where 1 limit $ile;");

        $stmt->execute();
        $this->data=$stmt->fetchAll();

        return $this->data;
    }

}

Przechodzimy teraz do kontrolera Produkty i pierwsze co robimy to uzupełnimy metodę index by wczytane zostało to co chcemy



function index($url){
        switch($url){
            case "promocje":
                $this->pokazPromocje();
                break;
            default :
                $this->view->render("produkty/index");
                break;
        }
    }

Teraz dodamy metodę pokazPromocje, która uruchomi model i pobierze dane, następnie te dane będą widoczne dla widoku.



function pokazPromocje(){
        $data=$this->model->pokaz(4);
        $this->view->pobierzDane($data);
        $this->view->render("produkty/promocje");
    }

W folerze widoku produktów tworzymy plik "promocje.php" a w nim już bawimy się danymi które otrzymaliśmy. Czyli np coś takiego



<h1>Zestawy w promocji</h1>

<table>
    <thead><th>Model</th><th colspan="2">Opis</th></thead>
    <tbody>
    
<?php

for($i=0;$i<count($this->data);$i++){
    
    echo "<tr>";

    echo "<td>";

    echo "Producent: ".$this->data[$i]["producent"]."<br>";
    echo "Model: ".$this->data[$i]["model"]."<br>";
    echo "</td>";
    
    echo "<td>";
    if(!empty($this->data[$i]["procesor"])) echo "Procesor: ".$this->data[$i]["procesor"]."<br>";
    if(!empty($this->data[$i]["pamiec"])) echo "Pamięć: ".$this->data[$i]["pamiec"]."<br>";
    if(!empty($this->data[$i]["vga"])) echo "Karta graficzna: ".$this->data[$i]["vga"]."<br>";
    if(!empty($this->data[$i]["hdd"])) echo "Dysk twardy: ".$this->data[$i]["hdd"]."<br>";
    if(!empty($this->data[$i]["matryca"])) echo "Matryca: ".$this->data[$i]["matryca"]."<br>";
    if(!empty($this->data[$i]["os"])) echo "System operacyjny: ".$this->data[$i]["os"]."<br>";
    if(!empty($this->data[$i]["zlacza"])) echo "Złącza: ".$this->data[$i]["zlacza"]."<br>";
    if(!empty($this->data[$i]["opis"])) echo "Opis: ".$this->data[$i]["opis"]."<br>";
    echo "</td>";
    
    echo "<td>";
    echo "<div><img src=\"".ROOT."public/img/promocje/".$this->data[$i]["zdjecie"]."\" alt=\"\"></div>";
    echo "</td>";
    
    echo "</tr>";
}
?>

    </tbody>
</table>

Ok, tak to się prezentuje u mnie. Całość jest jeszcze do wykończenia i do ostylowania.

Skomentuj lub zgłoś błąd

© Michał Misztal 2023