MVC w praktyce tworzymy system artykułów. cz. 2 W drugiej części artykułu o wzorcu MVC stworzymy część skryptu, odpowiedzialną za obsługę kategorii. Tworzymy kontroler kategorii Na początek stwórzmy plik index.php w głównym katalogu: include 'controller/categories.php'; if($_get['task']=='categories') { $ob = new CategoriesController(); $ob->$_get['action'](); Na podstawie zmiennej $_GET['task'] tworzony jest odpowiedni obiekt kontrolera (w tym wypadku CategoriesController). Zmienna $_GET['action'] określa z kolei akcję kontrolera. Co robi kontroler? Na podstawie przekazanych wartości zmiennych (z adresu lub pól formularza) wybiera odpowiednią akcję skryptu oraz inicjuje odpowiednie modele i widoki. Kontroler nie powinien obrabiać danych. Ma on za zadanie tylko wywoływać odpowiednie reakcje logiki aplikacji oraz widoku odpowiedzialnego za wyświetlanie informacji. Przyjrzyjmy się plikowi controller/categories.php: * @author Łukasz Socha <> include 'controller/controller.php'; class CategoriesController extends Controller{ public function index() { $view=$this->loadview('categories'); $view->index(); public function add() { $view=$this->loadview('categories'); $view->add(); public function insert() { $model=$this->loadmodel('categories'); $model->insert($_post); $this->redirect('?task=categories&action=index'); 1/5
public function delete() { $model=$this->loadmodel('categories'); $model->delete($_get['id']);; $this->redirect('?task=categories&action=index'); Przeanalizujmy reakcje dla następujących adresów URL:?task=categories&action=index zostanie wywołana metoda index(), która inicjuje obiekt widoku categories, następnie zostaje wywołana metoda index()?task=categories&action=add zostanie wywołana metoda add(), która inicjuje obiekt widoku categories, następnie zostaje wywołana metoda add()?task=categories&action=insert zostanie wywołana metoda insert(), która inicjuje obiekt modelu categories, następnie zostaje wywołana metoda insert()?task=categories&action=delete zostanie wywołana metoda delete(), która inicjuje obiekt modelu categories, następnie zostaje wywołana metoda delete() Mamy już utworzony kontroler. Przejdźmy teraz do modelu. Tworzymy model kategorii Model jest najbardziej istotnym elementem we wzorcu MVC to on jest odpowiedzialny za logikę aplikacji. Ma za zadanie pobieranie/edycję danych z bazy danych (lub innych źródeł) oraz przetworzenie ich według wymagań skryptu, np: poddać filtracji, wykonać obliczenia itp. Przeanalizujmy plik model/categories.php: * @author Łukasz Socha <> include 'model/model.php'; class CategoriesModel extends Model{ public function insert(&$data) { $ins=$this->pdo->prepare('insert INTO categories (name) VALUES (:name)'); $ins->bindvalue(':name', $data['name'], PDO::PARAM_STR); $ins->execute(); public function getall() { return $this->select('categories'); 2/5
public function delete(&$id) { $del=$this->pdo->prepare('delete FROM categories where id=:id'); $del->bindvalue(':id', $id, PDO::PARAM_INT); $del->execute(); Wszystkie 3 metody mają za zadanie dodanie, usunięcie oraz pobranie danych z tabeli categories. Pozostaje nam jeszcze widok. Tworzymy widok kategorii Głównym zadaniem widoku jest odebranie przetworzonych danych od modelu i wyświetlenie ich w odpowiedni sposób. Wiele osób uważa widok za szablon HTML, ale nie jest to do końca prawdą. Równie dobrze widok może generować np. dokumenty PDF. Tak będzie wyglądać plik view/categories.php: * @author Łukasz Socha <> include 'view/view.php'; class CategoriesView extends View{ public function index() { $cat=$this->loadmodel('categories'); $this->set('catsdata', $cat->getall()); $this->render('indexcategory'); public function add() { $this->render('addcategory'); Metoda index() pobiera dane wszystkich kategorii z modelu za pomocą getall() i renderuje odpowiedni plik z szablonem HTML. Z kolei add() renderuje plik HTML z formularzem dodawania kategorii. Na koniec tej części stwórzmy jeszcze pliki szablonów. templates/header.html.php: <html> <head> 3/5
<title>system newsów</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <link href="css/style.css" rel="stylesheet" type="text/css" /> </head> <body> <ul> <li><a href="?task=categories&action=add">dodaj kategorię</a></li> <li><a href="?task=categories&action=index">lista kategorii</a></li> </ul> templates/footer.html.php: </body> </html> templates/indexcategory.html.php: <? include 'templates/header.html.php';?> <h1>lista kategorii</h1> <table> <tr> <td>nazwa</td> <td> </td> </tr> <? foreach($this->get('catsdata') as $cats) {?> <tr> <td><?= $cats['name'];?></td> <td><a href="?task=categories&action=delete&id=<?= $cats['id'];?>">usuń</a></td> </tr> <??> </table> <? include 'templates/footer.html.php';?> addcategory.index.php: <? include 'templates/header.html.php';?> <h1>dodaj kategorię</h1> <form action="?task=categories&action=insert" method="post"> Nazwa kategorii: <input type="text" name="name" /><br /> <input type="submit" value="dodaj" /> </form> 4/5
<? include 'templates/footer.html.php';?> Tak stworzyliśmy część kodu odpowiedzialną za kategorie artykułów. W trzeciej, ostatniej części zajmiemy się samymi artykułami. 5/5