Differences

This shows you the differences between two versions of the page.

Link to this comparison view

mvc [2017-09-01 14:54]
mvc [2022-07-18 13:20] (current)
Line 1: Line 1:
 +====== Model-View-Controller ======
 +{{:350px-modelviewcontrollerdiagram2.svg.png?320|}} {{:mvc.png?320|}}
  
 +Dags att börja diskutera hur man skulle kunna strukturera ett större projekt.
 +  * [[http://en.wikipedia.org/wiki/Model–View–Controller|MVC wikipedia (en)]]
 +  * [[http://sv.wikipedia.org/wiki/Model-View-Controller|MVC wikipedia (sv)]]
 +==== Syfte med uppgiften ====
 +  * Att lära sig använda någon annans kod
 +  * Att lära sig hur man anpassar sig till en modell för att koda och följa den modellen.
 +  * Att få bättre förståelse för Abstrakt basklass, Arv, Singleton klass och Överlagring av metoder
 +  * Förstå hur en webbaserad MVC applikation skulle kunna fungera.
 +  * Bli bättre på att jobba med HTLM5, CSS, databaser och objektorienterad PHP
 +==== Ett mindre ex på MVC ====
 +Här kommer ett enkelt ex på hur man skulle kunna jobba med MVC. \\
 +Controllers och Models är i princip fria från HTML, i views har man endast enkel PHP och HTML.
 +Controllers skall sköta logik (lite kod) medan models skall lösa specifika uppgifter.
 +
 +Det är viktigt att ha en tydlig struktur på hur man kodar!!
 +
 +=== index.php ===
 +index.php - Denna fil har som enda uppgift att alltid läsa in rätt filer...
 +
 +  - Hämtar först diverse inställningar, sätter variabler och skapar tex ett databas och session objekt
 +  - Kollar över vad som har kommit i $_GET['c'] c=controller och i $_GET['a'] a=action
 +  - Läser in rätt controller - en controller sköter logiken, skriver aldrig ut något och kommunicerar med olika modeller
 +  - Läser in rätt view, en view är till för att visa sidor - har bara enkel PHP och HTML
 + 
 +<code php>
 +<?php
 +define('PATH','../'); // Sökvägen till själva applikationen
 +// alla inställnignar och några funktioner
 +include(PATH.'include/setup.php');
 +
 +// Säkrar upp vad som kommer i $_GET['c'] c=controller och i $_GET['a'] a=action, kommer inget blir det index
 +(isset($_GET['c'])?str_replace('.','',$_GET['c']):$_GET['c'] = 'index');
 +(isset($_GET['a'])?str_replace('.','',$_GET['a']):$_GET['a'] = 'index');
 +
 +// läser in rätt controller
 +$controller = PATH . 'controllers/' . $_GET['c'] . 'Controller.php';
 +if (file_exists($controller)) {
 +  include($controller);
 +} else {
 +  $session->AddError('No controller named:' . $_GET['c'] . 'Controller');
 +}
 +
 +// visar HTML med rätt view
 +include(PATH.'views/head.php');
 +$session->PrintInfo();; // skriver ut fel och annan info
 +$view = PATH . 'views/' . $_GET['c'] . '/' . $_GET['a'] . '.php';
 +if (file_exists($view)) {
 +  include($view);
 +} else {
 +  $session->AddError('No view in ' . $_GET['c']. ' named:' . $_GET['a']);
 +  $session->PrintInfo(); // Man vill ju se detta fel också...
 +}
 +include(PATH.'views/foot.php');
 +</code>
 +
 +Detta är min struktur av filer. Det enda som är gjort är en fungerade inloggning och möjlighet att hantera användare på ett primitivt sätt (om man är admin). När det gäller layout, HTML, placering av meny mm så är inget gjort.
 +<code>
 +mvc
 +├── classes
 +│   ├── model
 +│   │   ├── table.php
 +│   │   └── user.php
 +│   └── service
 +│       ├── db.php
 +│       └── session.php
 +├── controllers
 +│   ├── indexController.php
 +│   ├── loginController.php
 +│   └── userController.php
 +├── htdocs
 +│   ├── images
 +│   ├── index.php
 +│   └── style.css
 +├── include
 +│   └── setup.php
 +└── views
 +    ├── foot.php
 +    ├── head.php
 +    ├── index
 +    │   └── index.php
 +    ├── login
 +    │   ├── login.php
 +    │   ├── logout.php
 +    │   ├── register.php
 +    │   ├── sendpassword.php
 +    │   └── setpassword.php
 +    └── user
 +        └── index.php
 +</code>
 +====== Lite mer om klasser ======
 +Jag kommer att ha genomgång av mina klasser och då kommer jag att förklara följande:
 +  * Abstrakt basklass
 +  * Arv
 +  * Singleton klass
 +  * Överlagring av metoder
 +
 +När ni har fått kläm på hur detta fungerar så kommer ni förhoppningsvis se vissa fördelar med att använda er av denna kunskap.
 +
 +====== Lab - med klasser ======
 +==== Krav ====
 +
 +Inloggning (redan klart...)
 +  * Ni skall gör en inloggning där ni skall verifiera er mot databasen.
 +  * Ni skall kolla om man är inloggad via en klass som hanterar SESSION variabeler.
 +  * Lösenord skall sparas krypterat.
 +  * Om man inte är inloggad skall en login form visas där man erbjuds att logga in.
 +  * Om man är inloggad ska man ha möjlighet att logga ut.
 +  * Om man inte finns som användare skall man kunna lägga till sig själv via ett formulär.
 +  * Sätt att hantera användare som har glömt sitt lösen, tänk på att man inte skall kunna ändra någon annans lösenord…!!
 +  * Sätt för att kunna stänga av användare som man inte vill skall kunna logga in mer.
 +
 +
 +Forum (vill ni göra något annat säg till så ska det nog gå att lösa)
 +  * Man skall kunna skapa ämnen. 
 +  * Till varje ämne skall man kunna skriva inlägg.
 +  * Man skall kunna ändra och tabort sina inlägg 
 +  * För att få skapa ämnen och skriva inlägg måste man vara inloggad. Man skall endast kunna ändra och ta bort sina egna inlägg. Man skall kunna ta bort sina egna ämnen. Tar man bort ett ämne skall ju självklar alla inlägg tas bort som hör till det ämnet.
 +  * Systemet skall hålla ordning på vem som har skrivit inläggen, när de skapades och när de senast ändrades.
 +  * Man skall kunna navigera på sidan och kunna se alla ämnen och inlägg. 
 +  * Du skall muntligt kunna redovisa för mig hur din kod funkar. 
 +  * I listan för trådar skall det framgå hur många inlägg det finns i varje tråd 
 +  * Att navigera på sidan skall vara naturligt... 
 +  * Din kod skall vara väl genomtänkt och strukturerad 
 +  * Det finnas en Admin rättighet. Om man är admin skall man kunna “ta bort” användare. Obs! När man tar bort en användare är det viktigt att fundera igenom hur det skall fungera!!Jag vill att ni tänker igenom hur ni ska göra och tydligt dokumenterar hur ni har valt att göra. Ni skall också kunna motivera varför ni har gjort som ni har gjort. Om man är admin skall man kunna ta bort inlägg och trådar. Tar man bort en tråd skall ju självklart alla inlägg försvinna som hör till tråden.
 +
 +
 +  * Ni skall göra ett forum med hjälp av klasser, ni skall utgå ifrån min kod och lägga till det som saknas.
 +  * Ni skall använda er av klasserna service_db, model_table och service_session
 +  * Ni skall jobba med controller, model och views enligt den metod jag har visat er och som finns i min exempel kod nedan.
 +  * Ni skall göra minst en controller (forumController)
 +  * Alla dina model klasser ska ärvas från model_table nedan.
 +  * Ni skall göra minst en model (model_forum), alternativt är det en bättre lösning att göra 3 st modeller. model_thread, model_Item och model_forum som bör använda sig av någon av mina klasser.
 +  * Ni ska göra ett antal views
 +  * När man har loggat in skall man kunna ändra sina egna uppgifter och kunna ladda upp en profilbild som skall synas på lämpliga ställen i forumet. (userController + övrigt som man behöver göra)
 +  * Man skall kunna se lite mer information om en användare, när den gick med, hur många och vilka trådar den har skapat, hur många inlägg den har skrivit mm.
 +  * HTML skall vara validerad som HTML5 och CSS:n skall vara validerad fri från error.
 +
 +När ni jobbar och upptäcker att något saknas i mina klasser så ska in gärna bygga ut mina klass exempel.
 +
 +Ni ska hämta min {{:mvc.tgz|kod}} här. Skulle det finnas några fel i den får ni fixa det själv :-)
 +
 +==== Extrakrav ====
 +
 +  * Kommer kanske senare...
 +  
 +
 +Min tabell Users
 +<code>
 +CREATE TABLE IF NOT EXISTS `Users` (
 +  `UserID` int(11) NOT NULL AUTO_INCREMENT,
 +  `FirstName` varchar(50) NOT NULL DEFAULT '',
 +  `LastName` varchar(50) NOT NULL DEFAULT '',
 +  `EMail` varchar(50) NOT NULL DEFAULT '',
 +  `Password` varchar(50) NOT NULL DEFAULT '',
 +  `Deleted` tinyint(1) NOT NULL DEFAULT '0',
 +  `Admin` tinyint(1) NOT NULL DEFAULT '0',
 +  PRIMARY KEY (`UserID`),
 +  UNIQUE KEY `EMail` (`EMail`)
 +) ;
 +</code>