MVC - korzystamy z modelu
Data: 2017-08-20, autor: Michał MisztalOstatnio 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.

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.