- Maak een werkdirectory onder je devel directory, genaamd scolafavs
- Maak een virtual host aan in C:\devel\EasyPHP\apache\conf\extra\httpd-vhosts.conf en in c:\windows\system32\drivers\etc\hosts
- herstart apache
- ga in devel\scolafavs staan en type
cake bakecreëer hiermee je applicatie skeleton en database connectie script. Hierna moet je via http://scolafavs/ de maagdelijke applicatie op kunnen vragen, en wel met allemaal groene balken (geen foutmeldingen).
Erg mooi vind ik die pagina niet, maar wel heel functioneel. Laten we eens naar de opmaak kijken. In de directory views/layouts staat het bestand default.ctp. Een ctp bestand in een cake template, hier wordt bepaald hoe de pagina's (die van deze layout gebruik maken) eruit komen te zien. Je kunt de pagina openen in een wysiwyg editor zoals macromedia, sorry adobe dreamweaver, of gratis: microsoft visual webdeveloper express ed en zo zijn er nog wel een paar. Maak er een leuke layout van. Bij mij zien head en body er even zo uit:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<?php echo $html->charset(); ?>
<title>
ScolaFavs
</title>
<?php
echo $html->css('stijlen');
echo $scripts_for_layout;
?>
</head>
<body>
<div id="container">
<div id="content">
<?php
if ($session->check('Message.flash')):
$session->flash();
endif;
echo $content_for_layout;
?>
</div>
</div>
<?php echo $cakeDebug?>
</body>
</html>
Ik heb er een externe css voor gemaakt die geplaatst is in webroot\css. Laat de variabele $cakeDebug en Message.flash vooral staan, ze kunnen je helpen. In productie verhoog je het debuglevel, zodat foutmeldingen niet doorkomen naar de eindgebruiker. In $content_for_layout komt de content te staan die een view produceert.
De applicatie moet gebruikers herkennen, daarom hebben we een inlogsysteem nodig.
Als basis gebruik ik dit artikel uit de bakery, de CakePHP documentatie.
De users tabel gaat de users van de applicatie herbergen (duhhh). Ik moet nog steeds wennen aan wat nu precies in enkelvoud en wat in meervoud moet (en dat is wel zo handig om ook zo te doen!), daarom heb ik er een klein schemaatje van gemaakt:

Wat hebben we concreet nodig: er is een users tabel (meervoud) die wordt benaderd via een user model (enkelvoud) die wordt aangestuurd door een users_controller die weer naar de bezoeker gaat via views/users/index.ctp of login.ctp als nog niet is ingelogd (de dirname is meervoud). confused? Toch is het prettig als je dit gewoon zo doet dat cake zonder meer weet waar alles staat en hoe alles heet zodra je de users controller benadert.
Een users tabel hebben we al, daar moet dus een model omheen geplaatst worden om de toegang naar de database te regelen. We laten Cake zelf het model bakken.

Open nu het bestand models/user.php en pas het als volgt aan:
<?php
class User extends AppModel {
var $name = 'User';
function validateLogin($data) {
$user = $this->find(array('un' => $data['username'],
'pw' => md5($data['password'])),
array('id', 'un'));
if(!empty($user)) {
return $user['User'];
}
return false;
}
}
?>
Een opmerking hierbij: Het is niet altijd duidelijk of een dergelijke functionaliteit nu in de controller of in het model moet worden geregeld. Ik voel wel voor deze oplossing omdat er alleen een databasequery plaatsvindt. De $data wordt doorgegeven door de controller die als enige iets met POST en GET requests te maken heeft. Het valideren van een login is volgens een andere leerschool echter iets voor in de controller.
Nu volgt dan de controller:
Dit keer zullen we hem zelf maken. Creëer een nieuw bestand in de controllers directory dat je users_controller.php noemt. Het bestand krijgt de volgende inhoud:
<?php
class UsersController extends AppController {
var $name = "Users";
var $helpers = array('Html', 'Form');
function index() {}
function beforeFilter() {
$this->__validateLoginStatus();
}
function login() {
if(!empty($this->data)) {
if(($user = $this->User->validateLogin($this->data['User'])) == true) {
$this->Session->write('User', $user);
$this->Session->setFlash('Je bent ingelogd.');
$this->redirect('index');
exit();
} else {
$this->Session->setFlash('De inloginformatie is niet correct.');
$this->redirect('login');
exit();
}
}
}
function logout(){
$this->Session->destroy('user');
$this->Session->setFlash('Je bent uitgelogd.');
$this->redirect('login');
}
function __validateLoginStatus(){
if($this->action != 'login' && $this->action != 'logout'){
if(!$this->Session->check('User')){
$this->Session->setFlash('Om deze pagina te bekijken moet je eerst inloggen');
$this->redirect('login');
}
}
}
}
?>
Een paar opmerkingen hierbij.
De method beforeFilter() wordt automatisch uitgevoerd als je een controllermethod aanroept, welke dan ook. Dit is dus een goede plaats om te zorgen dat de autorisatie plaatsvindt. De autorisatie zelf komt in een functie __validateLoginStatus die begint met __ om 'm 'private' te maken. Het valideren van de inloggegevens gebeurt door de zojuist gemaakte functie in het model aan te roepen. Uitloggen is een kwestie van de sessie opruimen. Andere pagina's die beveiligd zijn kunnen gebruikmaken van dezelfde check. Over het algemeen zullen alle controlleractions of beveiligd, of niet beveiligd zijn.
Rest nog de views, 1 voor het inlogscherm en 1 voor als het inloggen gelukt is:
Maak twee bestanden in views\users: index.ctp en login.ctp
Hierin staan dus geen <html> enzo, dat staat in layouts/default.ctp. Het volgende staat er wel in:
views\users\login.ctp<div class="login">
<h2>Login</h2>
<?php echo $form->create('User', array('action' => 'login'));?>
<table>
<tr>
<td>
<?php
echo $form->input('username', array(
'label'=>'username:</td><td>'
));
?>
</td>
</tr>
<tr>
<td>
<?php
echo $form->input('password', array(
'label'=>'password:</td><td>'
));
?>
</td>
</tr>
<tr>
<td colspan='2' align='right'>
<?php echo $form->submit('-login-');?>
</td>
</tr>
</table>
<?php echo $form->end(); ?>
</div>
views\users\index.ctp
<?php echo $html->link('Logout', array('controller' => 'Users', 'action' => 'logout')); ?>
<br/><br/>
You've accessed the secret secure location!
Het loginschermpje wilde ik netjes opmaken, waardoor een beetje extra code nodig was tov het eerder genoemde artikel.
Tenslotte is natuurlijk ook wat databasevulling nodig (initiele gebruikersaccounts, een paar links en een paar groepen) die je hier kunt downloaden. Om de controller starten: http://scolafavs/users/
De controller zal de index starten, maar daarvoor de validatie uitvoeren. Omdat er nog niet is ingelogd wordt geforward naar de loginpagina. Nu kun je inloggen en de index wordt getoond.
De volledige code staat hier
Geen opmerkingen:
Een reactie posten