De groepen staan in de groups tabel. Er is een 1:n relatie met de users tabel of, in CakePHP termen:
een group belongs-to een user
Dit is gemodelleerd in een FK relatie van group naar user. In het model wordt dit direct aangegeven, wat als voordeel heeft dat bij een query naar de groupen ook de users gegevens worden opgehaald. Nadeel s de overhead.
Open een dos-box en cd naar je scolafavs dir. Type
cake bakeen kies het maken van een model.
Kies ervoor een model association aan te geven. Cake ziet dat het waarschijnlijk om de users tabel gaat.
---------------------------------------------------------------
Possible Models based on your current database:
1. Group
2. Link
3. User
Enter a number from the list above, type in the name of another model, or 'q' to exit
[q] > 1
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] > n
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] > y
One moment while the associations are detected.
---------------------------------------------------------------
Please confirm the following associations:
---------------------------------------------------------------
Group belongsTo Users? (y/n)
[y] > y
Would you like to define some additional model associations? (y/n)
[n] > n
Open het gegenereerde bestand en voeg de volgende method toe:
/**
* Haal de groepen van een user op
* @return
* @param $data Object
*/
function getMyGroups($data){
$groups = $this->findAllByUsersId($data['user_id']);
if(!empty($groups)) {
return $groups;
}
return false;
}
Heel eenvoudig en portable. 1 method om de linkgroepen van een user op te halen. De findAllBy... method wordt door het CakePHP model verzorgd.
Nu de controller. Maak een bestand groups_controller.php in /controllers en neem de volgende index() method op:
/**
* Haal standaard de link groepen van een user op
* @return
*/
function index(){
$this->layout = "loggedin";
$data["user_id"] = $this->Session->read('User');
// haal de groepen van deze user op
$this->set("groups", $this->Group->getMyGroups($data));
}
De gebruiker moet ook nog naar de pagina kunnen navigeren. Daarom hebben we een aantal links nodig, die pas na inloggen getoond moeten worden. Daarvoor is de regel
$this->layout = "loggedin";Deze regel zorgt ervoor dat we in plaats van de layout "default" nu de layout "loggedin" gaan tonen. Die moeten we dan wel hebben. Creëer het bestand loggedin.ctp onder /views/layouts. Ik heb er de volgende code in staan:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<?php echo $html->charset(); ?>
<title>ScolaFavs</title>
<?php
echo $html->css('stijlen');
echo $scripts_for_layout;
?>
</head>
<body>
<div id="container">
<div id='menu'>
<?php echo $html->link("Home", array('controller' => 'Users', 'index' => 'logout')); ?>
<?php echo $html->link("Mijn Groepen", array('controller' => 'Groups', 'action' => 'index')); ?>
<?php echo $html->link('Logout', array('controller' => 'Users', 'action' => 'logout')); ?>
</div>
<div id="content">
<?php
if ($session->check('Message.flash')):
$session->flash();
endif;
echo $content_for_layout;
?>
</div>
</div>
<?php echo $cakeDebug?>
</body>
</html>
Nu nog de view voor de linkgroepen. Maak een bestand index.ctp aan onder /views/groups en vul 'm bijvoorbeeld zo:
<h3>Mijn Groepen!</h3>
<?php
foreach($groups as $groupSet){
foreach($groupSet as $k => $group){
if($k == "Group"){
echo $html->link(">> " . $group["naam"],"/groups/getLinks/".$group["id"]) . "<br/>";
}
}
}
?>
En tenslotte breiden we de onbeveiligde homepage uit met een link naar de inlogpagina:
views/pages/home.ctp
<h3>Welkom bij ScolaFavs!</h3>
<br/>
klik hier om in te loggen
<br/>
<?php
echo $html->link("Inloggen", array("controller"=>"Users", "action"=>"login"));
?>
<br/>
Meer informatie over deze applicatie kun je hier lezen...
Als alles goed is gegaan kun je nu via de bekende URL de applicatie starten en, na inloggen, je groepen opvragen.
Een ding hebben we overgeslagen: de groups_controller is niet beveiligd. Beveiligen is echter een kwestie van vooraf bekijken of de sessie een user bevat. hoewel dit wel een beetje inbraakgevoelig is, houden we het hier even op.
Neem deze twee functies op in de groups_controller om de controller te beveiligen:
function beforeFilter() {
$this->__validateLoginStatus();
}
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('/users/login');
}
}
}
We gebruiken dus de code in de users_controller als nog niet is ingelogd door een forward naar de users controller en daarvan de login actie. Als er wel is ingelogd doet de validatie-method verder niets.
Geen opmerkingen:
Een reactie posten