1. Voorwoord
In deel 1 hebben ik uitgelegd wat CakePHP inhield en ik heb een paar pluspunten genoemd van CakePHP.
Daarnaast hebben we de webserver klaar gemaakt voor de mod_rewrite engine en hebben we de database configuratie ingesteld.
In dit deel gaan we het volgende doen:
Een layout maken.
Een layout is natuurlijk altijd van belang en handig om te navigeren op de website.
De database tabellen maken.
We gaan database tabellen aanmaken om ons nieuws in op te slaan.
De controllers instellen.
De controllers instellen is noodzakelijk om te URL goed uit te lezen en om de juist pagina's weer tegeven.
Een foutmelding van CakePHP aanpassen.
CakePHP heeft standaard foutmeldingen die we niet in onze layout willen.
De stijl van deze foutmelding gaan we veranderen.
top
2. Layout maken
Nu gaan we een layout maken voor ons nieuwssysteem.
Open je editor weer en neem de volgende code over:
<td class="tableContent">
Hier content content content content content
</td>
</tr>
<tr>
<td colspan="2" class="footer">
Layout gemaakt door Bart Dongelmans
</td>
</tr>
</table>
</body>
</html>
Het valt op dat dit bestand de extensie .THTML heeft. Dit is géén typefout, dit is juist. In plaats van .HTML bestanden
maak CakePHP gebruik van .THTML bestanden (template HTML). Als je nu naar http://www.mijnsite.com/nieuwssysteem gaat zul je de layout zien.
Het eerste dat nu opvalt is dat het een pagina is zonder enkele stijl. Het linken naar een stylesheet in CakePHP is vrij makkelijk.
Maak het bestand "style.css" aan in de map webroot/css.
Oke, nu we de stijl hebben aangemaakt moeten we hem nog includen.
Dat gebeurt op de volgende manier, open default.thtml weer en voeg de volgende regel toe in de head-tags:
<?php echo $html->css('style'); ?>
Uitleg: $html->css: Dit is een instantie van de HtmlHelper class.
(Als je de tutorials van stijn (Zend FrameWork) hebt gevolgd komt dit je bekend voor)
Je ziet dat we hier css() aanroepen, deze bouwt automatisch de regel om een style te includen.
<link rel="stylesheet" type="text/css" href="style.css">
Maar waarom hoeven we dan alleen maar 'style' aan te roepen? Dit is vrij eenvoudig, dit komt omdat css() begint in
de map /css, en daar stond onze style.css.
$html->link: Waarschijnlijk zegt dit je al iets, dit is nou een van de voorbeelden die het makkelijk
maakt om HTML te schrijven. link() gebruikt hier 2 parameters, de eerste parameter geeft aan wat de titel van de link is,
dus
<a href="www.mijnsite.com/nieuwssysteem">Blaat</a> hier is Blaat de titel van de link. De tweede parameter is de URL waar naar verwezen wordt, dus in dit geval "www.mijnsite.com/nieuwssysteem".
link() heeft ook nog een derde parameter, deze is optioneel. Namelijk $htmlAttributes, dit is een array met de attributes van de link.
We hebben nu bijna een compleet werkende layout, er rest ons nog een ding.
Juist, er moet een plaats gedefinieërd worden waar de inhoud van de pagina's komt te staan.
Ook dit is weer een piece of 'cake'.
Open default.thtml weer en vervang "Hier content content content..." door:
<?php echo $content_for_layout; ?>
Uitleg: $content_for_layout: Dit is een variabele die de URL leest en de juiste controller toepast.
top
3. Database tabel en model aanmaken
Maak een nieuwe tabel aan in de database:
CREATE TABLE `nnews` (
`id` int(4) auto_increment NOT NULL,
`by` varchar(100) NOT NULL,
`message` TEXT NOT NULL,
`title` varchar(100) NOT NULL,
`date` DATETIME NOT NULL,
`modified` DATETIME NOT NULL,
PRIMARY KEY ( `id` )
) Type=MyISAM;
Dit heeft hopelijk geen uitleg nodig, als je wel uitleg wilt wil ik je graag refereren naar MySQL: Create Table (door FangorN).
Om gebruik te kunnen maken van de database, moeten we nog even een ding doen. Namelijk een model maken.
De model classes komen in de map /app/models. Nu gaan we nnew.php aanmaken, ons model.
/nieuwssysteem/app/models/nnew.php <?php
class nnew extends AppModel
{
var $name = 'nnew';
}
?>
Uitleg: class nnew extends AppModel: Hier breiden we het AppModel uit. nnew is dan de naam van de tabel in de database. var $name = 'nnew';: Een variabele aanmaken. Spreekt voor zich.
Let op: als je model eindigt op een "s" leest CakePHP dit fout, omdat CakePHP in meervoud leest en er automatisch een "s" achteplakt.
top
4. Controllers configureren
Als je nu op een van de links zou klikken, krijg je de foutmelding "missing controller". Daarom gaan we nieuwe controllers configureren.
Het woord controllers zal je wel bekend voorkomen als je de tutorials van Stijn hebt gevolgd. Controllers regelen
je pagina-navigatiesysteem. Onze URL's komen er zo uit te zien: /controller/actie/id. Bij het maken van controllers kan je
het beste nadenken over wat je precies wilt. Vandaar ook "Object Orient Programming", je weet wat je wil van te voren.
Nu gaan wij dit ook doen:
Nu kan ik wel gelijk de complete code geven van deze controllers, maar daar leer je natuurlijk niets van. Daarom ga ik eerst uitleggen
hoe je een controller aanmaken en waar je rekening mee moet houden.
Zoals eerder gezegd zet je controllers in de map /nieuwssysteem/app/controllers.
<?php
class ControllerNaam extends AppController
{
function ActieNaam()
{
// hier zet je de inhoud van een action neer.
}
}
?>
Uitleg:
Op de eerste regel zie je dat we AppController uitbreiden met onze eigen controller.
Op de derde regel maken we een functie aan die de action uitvoert. Als je URL is: http://www.mijnsite.com/nieuwssysteem/index/contact,
dan zou de ControllerNaam IndexController zijn, en de function moet dan contact() zijn, let wel, dit is hoofdlettergevoelig. Wat niet in de code hierboven staat
is dat je boven de functies ook nog iets kan toevoegen, namelijk je model. Als je gebruik maakt van een database en gegevens wilt veranderen/ophalen/toevoegen
moet je eerst je model laden. Dat doe je als volgt:
<?php
var $name = 'nnew';
?>
Uitleg:
'var' is niets nieuws. Daarna gebruiken we dezelfde variabele naam als in ons model. Met daarachter dezelfde waarde als in ons model.
Opdrachten:
- Maak een IndexController met de actie contact
- Maak een NewsController en laadt ons model
- Voeg de acties add, view, edit en delete toe
- In de acties zet je een variabele paginaTitel en geef deze een waarde
Probeer dit eens zonder naar het voorbeeld hieronder te kijken.
Uitleg: $title_for_layout: Dit is een variabele die automatisch een inhoud krijgt als je $this->pageTitle() definieërd.
Als je nu op een van de links klikt, zul je "missing view" te zien krijgen, en géén pagina titel. Dit klopt, je moet eerst
een view maken voordat de titel gerendered (van "render") wordt. In deel 3 gaan we de views maken die bij de controllers horen.
top
5. Foutmeldingen van CakePHP aanpassen
In de vorige paragraaf hebben we de controllers aangemaakt en de titel voor elke pagina gedefinieërd.
Je hebt al aardig wat foutmeldingen gehad, zoals; Missing Controller en Missing View. Hieronder zie je een paar van de meest voorkomende foutmeldingen:
- missingModel
- missingDatabase
- missingView
- missingTable
- missingConnection
Deze foutmeldingen kun je echter makkelijk aanpassen zodat de gebruiker een nette foutmelding krijgt.
Elke "custom"-error kun je aanmaken in /nieuwssysteem/app/views/errors
Voor elk van deze foutmeldingen kun je een .THTML bestand aanmaken met daarin een foutmelding die de bezoeker te zien krijgt. Als je voor elk van bovenstaande foutmeldingen
een 'custom'-error wilt maken maak dan de volgende bestanden aan:
Wij gaan echter geen gebruik maken van "custom"-errors.
top
6. Einde
Dit is het einde van deel 2. Ik hoop dat je het tot nu toe nog allemaal begrepen hebt, want het volgende deel wordt moeilijker.
Ik zal alvast een beetje vrijgeven wat we hier gaan doen; namelijk de views aanmaken en database bewerkingen. Er is natuurlijk ook
een live voorbeeld waar je alles ziet werken zoals het hoort. http://quicky.netfeed.nl/nieuwssysteem/
Als je nog vragen hebt over deze tutorial of opmerkingen hebt kun je me natuurlijk altijd mailen via mijn profiel, of gewoon een PM sturen.
Graag wil ik Ontani wederom bedanken net als in mijn eerste tutorial voor zijn hulp.