login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Bart
Moeilijkheidsgraad:
Normaal
Hits:
11581
Punten:
Aantal punten:
 (5)
Aantal stemmen:
5
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (5)
 



Tutorial:

Websites maken met CakePHP: deel 2

  1. Voorwoord
  2. Layout maken
  3. Database tabel en model aanmaken
  4. Controllers configureren
  5. Foutmeldingen van CakePHP aanpassen
  6. Einde
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:

/nieuwssysteem/app/views/layouts/default.thtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Nieuwssysteem</title>
</head>
<body>

<table class="tableMain">
<tr>
     <td colspan="2" class="header">
     <br>Nieuwssysteem<br>&nbsp;
     </td>
</tr>
<tr>
     <td class="tableMenu">
      <b>Index</b><br />
      <?php echo $html->link('Beginpagina''/'); ?><br />
      <?php echo $html->link('Contact''/index/contact'); ?><br /><br />
      
      <b>Nieuws</b><br />
      <?php echo $html->link('Posten''/news/add'); ?><br />
      <p>
          <a href="http://validator.w3.org/check?uri=referer">
          <img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" 
          height="31" width="88" border="0" />
          </a>
      </p>
     </td>
                     
     <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.

/nieuwssysteem/app/webroot/css/style.css
.body     {
font-family: Verdana;
font-size: 10pt;
            }

td   {
vertical-align: top;
      }
          
a    {
color:#003d4c;
text-decoration:underline;
font-family: Verdana;
font-size: 10pt;
     }
     
a:hover   {
color:#003d4c;
text-decoration:none;
font-family: Verdana;
font-size: 10pt;
          }
.tableMain     {
border: 1px solid #c0c0c0; 
padding: 3 px; 
border-spacing: 0px; 
width: 90%;
               }
               
.header   {
border-bottom: 1px solid #cccccc; 
background-color: #cccccc; 
text-align: center;
font-family: Tahoma;
font-size: 18pt;
          }
          
.tableMenu     {
border-right: 1px solid #c0c0c0; 
vertical-align: top; 
width: 20%;
padding: 3px;
               }
               
.tableContent  {
width: 80%; 
vertical-align: top;
padding: 3px;
font-family: Verdana;
font-size: 9pt;
               }
               
.footer   {
border-top: 1px solid #c0c0c0; 
background-color: #cccccc; 
text-align: center;
font-family: Verdana;
font-size: 7pt;
          } 


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:

- IndexController
- - contact
- NewsController
- - add (toevoegen)
- - edit (wijzigen)
- - view (enkel bericht zien)
- - delete (verwijderen)

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.

LET OP: Hieronder staat de code van de opdracht!!


/nieuwssysteem/app/controllers/index_controller.php
<?php

class IndexController extends AppController // AppController uitbreiden
{

     var  
$name     =    'nnew'// model laden
     
     
function contact() // actie contact toevoegen
     
{
     
          
$this->pageTitle    =    'Contact'// $title_for_layout definieëren
               
     
}
     
}
?>


/nieuwssysteem/app/controllers/news_controller.php
<?php

class NewsController extends AppController // AppController uitbreiden
{

     var  
$name     =    'nnew'// model laden
     
     
function index()
     {
     
          
$this->pageTitle    =    'Nieuwsberichten bekijken'// $title_for_layout definieëren
          
     
}
     
     function 
add() // actie add toevoegen
     
{
     
          
$this->pageTitle    =    'Nieuwsbericht toevoegen'// $title_for_layout definieëren
     
     
}
     
     function 
edit($id// actie edit toevoegen
     
{
     
          
$this->pageTitle    =    'Nieuwsbericht wijzigen'// $title_for_layout definieëren
          
$this->set('id' $id);
     
     }
     
     function 
delete() // actie delete toevoegen
     
{
     
          
$this->pageTitle    =    'Nieuwsbericht verwijderen'// $title_for_layout definieëren
     
     
}
     
     function 
view() // actie view toevoegen
     
{
     
          
$this->pageTitle    =    'Nieuwsbericht bekijken'// $title_for_layout definieëren
     
     
}
     
}

?>     


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:

- /nieuwssysteem/app/views/errors/missing_model.thtml
- /nieuwssysteem/app/views/errors/missing_database.thtml
- /nieuwssysteem/app/views/errors/missing_view.thtml
- /nieuwssysteem/app/views/errors/missing_table.thtml
- /nieuwssysteem/app/views/errors/missing_connection.thtml

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.

 top


« Vorige tutorial : Websites maken met CakePHP: deel 1 Volgende tutorial : Gegevensvalidatie »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.013s