login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Stijn
Moeilijkheidsgraad:
Moeilijk
Hits:
8677
Punten:
Aantal punten:
 (4.88)
Aantal stemmen:
8
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (19)
 

Tutorial:

Websites maken met Zend Framework: deel 5/5

Websites maken met Zend Framework: deel 1
Menu: 1. Inleiding
2. De contactpagina
3. Veiligheid voor alles!
    3.1. Zend Filter gebruiken in /gallery/add
    3.2. Zend Validate gebruiken in /gallery/add
4. Objecten registreren
5. Het einde?

1. Inleiding


Je hebt nu alle kennis om een website te maken volgens het MVC model met behulp van een framework (Zend Framework). Dit laatste deel gaat over het gebruik van andere componenten in je website. Maar eerst gaan we de contact pagina maken.

2. De contactpagina


Hier gaan we al direct een component gebruiken van het framework, namelijk Zend Mail. Je kan componenten op twee manieren inladen:

  1. Inladen in de bootstrap, maar dit wordt op iedere pagina ingeladen en misschien gebruik je het maar 3 keer.
  2. Inladen in de action zelf, maar dan moet je het iedere keer opnieuw typen in andere actions als je het nog eens wilt gebruiken.

Omdat we maar één action hebben die dit component gebruik, kiezen we voor manier 2. Open je IndexController.php en neem volgende code over.

IndexController.php:
public function contactAction()
{
    
    
$this->view->paginaTitel 'Contact';
    
$this->view->titel 'Neem contact met ons op :]';
    
    
//formulier
    
if( $this->_request->isPost() ) {
        
        
//load mail component
        
Zend_Loader::loadClass('Zend_Mail');
        
$mail = new Zend_Mail();
        
        
//mail configureren
        
$bericht nl2br$this->_request->getPost('bericht') );
        
$mail->setBodyHtml$bericht );
        
$mail->setFrom$this->_request->getPost('email') , $this->_request->getPost('naam') );
        
$mail->addTo'emailadres@server.com' 'Jou naam' );
        
$mail->setSubject('Contactpagina portfolio');
        if( 
$mail->send() ) {
            
$this->view->succes true;
        }
        
    }
    
    
//render
    
$this->render();
    
}


code uitleg:
- new Zend_Mail(): we maken een instantie van de mail component.
- setBodyHtml(): omdat we
kunnen hebben in ons bericht versturen we de mail als een HTML mail. Als je een gewone tekst mail wilt versturen vervang je setBodyHtml() in setBodyText();
- setFrom(): de geadresseerde defineren.
- addTo(): de ontvanger van de mail. Je kan zoveel keer addTo() gebruiken om meerdere ontvangers toe te voegen. Je kan ook addCc() en addBcc() gebruiken.
- setSubject(): het onderwerp instellen.
- send(): met deze actie wordt de mail verstuurd.

Ik heb de contact.phtml wat aangepast zodat je een bericht krijgt op je scherm als het bericht verstuurd is. Open contact.phtml en verander de code met die van hieronder.

contact.phtml:
<?php echo $this->render('header.phtml'); ?>
<?php 
echo $this->render('menu.phtml'); ?>


<div id="pageContent">
    <h1><?php echo $this->titel?></h1>
    
    <?php if( isset( $this->succes ) ) : ?>
    <p class="block">
        <?php echo $this->textColor('Je mail werd succesvol verstuurd. 
Een reactie wordt zo snel mogelijk verstuurd.' 
'#FF0000'); ?>
    </p>
    <?php endif; ?>
    
    <form method="post">
        <p class="block">
            Naam: <br> 
            <?php echo $this->formText('naam' '' , array('size' => 30) ); ?> <br><br>
            
            E-mailadres: <br>
            <?php echo $this->formText('email' '' , array('size' => 30) ); ?><br><br>
            
            Bericht: <br>
            <?php echo $this->formTextarea('bericht' '' , array('rows' => 10 'cols' => 40) ); ?><br><br>
            
            <?php echo $this->formSubmit('submit' 'Versturen' ); ?>
        </p>
    </form>
</div>

<?php echo $this->render('footer.phtml'); ?>  


Ziezo je contact pagina is nu ook gemaakt en je hebt kennis gemaakt met een component van het framework. Moeilijk? Nee!

3. Veiligheid voor alles!


Zoals je wel ziet is er nergens veiligheid gebruikt. Iedereen kan HTML tags schrijven en er wordt niet gecontroleert of de velden data heeft. Daarvoor bestaat er Zend Filter en Zend Validate. We gaan maar beginnen met Zend Filter.

3.1. Zend Filter gebruiken in /gallery/add


Een filter is net zoals je koffiefilter. Je hebt de input (koffie bonen) en de output is dan de koffie. We gaan de Zend Filter inladen volgens manier 1 omdat we filters meerdere malen gebruiken op een website. In /gallery/add kan je een project titel en omschrijving invullen, deze mag geen HTML tags bevatten. Daarbovenop gooien we nog eens htmlentities om mogelijke SQL injections tegen te gaan. Eerst gaan we de Filter component laden in onze bootstrap. Zet volgende code onder de laatste Zend_Loader.

index.php:
Zend_Loader::loadClass('Zend_Filter');
Zend_Loader::loadClass('Zend_Filter_HtmlEntities');
Zend_Loader::loadClass('Zend_Filter_StripTags');


Open nu GalleryController.php en voeg volgende code toe.

GalleryController.php:
public function addAction()
{
    
    if( 
$this->_request->isPost() ) { 
        
        
//call model
        
$projects = new Projects();
        
        
//call filter
        
$filter = new Zend_Filter();
        
$filter->addFilter( new Zend_Filter_StripTags() )
                ->
addFilter( new Zend_Filter_HtmlEntities() );
        
        
$data = array(
                    
'titel' => $filter->filter$this->_request->getPost('titel') ) ,
                    
'omschrijving' => $filter->filter$this->_request->getPost('omschrijving') ) ,
                    
'status' => $this->_request->getPost('status')
                    );
                    
        
//data invoegen en de persoon redirecten
        
$projects->insert$data );
        
$this->_redirect'./gallery/' );
        
    } else {
        
$this->view->paginaTitel 'Project toevoegen';
        
$this->view->titel 'Voeg een project toe :]';
    }
    
    
$this->render();
    
}


code uitleg:
- new Zend_Filter: een instantie maken van de Filter component.
- addFilter( ... ): een filter toevoegen. Als je een filter toevoegt maak je een nieuwe instantie van die filter. Er moet geen ; staan na de eerste addFilter() omdat addFilter $this returnt waardoor we oneindig filters kunnen toevoegen.
- filter(...): de filters worden toegepast op de ingevulde elementen.

Note: gebruik htmlentites als laatste filter omdat htmlentities de andere filters kan storen.

Naast HtmlEntities en StripTags zijn er nog andere standaard filters. Hier een lijstje.
  • Alnum
  • Alpha
  • BaseName
  • Digits
  • Dir
  • HtmlEntities
  • Input
  • Int
  • RealPath
  • StringToLower
  • StringToUpper
  • StringTrim
  • StripTags

De volgende code toont hoe je één filter kan toepassen. Dit is gewoon een voorbeeld.

voorbeeld:
<?php
/**
 * Manier 1
 */

//bootstrap (index.php)
Zend_Loader::loadClass('Zend_Filter');

//in de code zelf
$input Zend_Filter::get$input 'StripTags');
$input Zend_Filter::get$input 'HtmlEntities' );


/**
 * Manier 2
 */

//bootstrap (index.php)
Zend_Loader::loadClass('Zend_Filter_HtmlEntities');
Zend_Loader::loadClass('Zend_Filter_StripTags');

//in de code zelf
$stripTags = new Zend_Filter_StripTags();
$input $stripTags->filter$input );
$htmlEntities = new Zend_Filter_HtmlEntities();
$input $htmlEntities->filter$input ); 

3.2. Zend Validate gebruiken in /gallery/add


Een validator kijkt of de input voldoet aan de voorwaarden van die specifieke validator. Deze returnt altijd een boolean. Wanneer deze false is kan je kijken wat er niet aan de voorwaarden voldoet via een ingebouwde functie. Een voorbeeld met ons contact formulier. Open IndexController.php en voeg volgende code toe.

IndexController.php:
public function contactAction()
{
    
    
$this->view->paginaTitel 'Contact';
    
$this->view->titel 'Neem contact met ons op :]';
    
    
//formulier
    
if( $this->_request->isPost() ) {
        
        
//load mail component
        
Zend_Loader::loadClass('Zend_Mail');
        
$mail = new Zend_Mail();
        
        
//load email validator
        
Zend_Loader::loadClass('Zend_Validate_EmailAddress');
        
$validEmail = new Zend_Validate_EmailAddress();
        
        
//mail configureren
        
$bericht nl2br$this->_request->getPost('bericht') );
        
$mail->setBodyHtml$bericht );
        
        
//setFrom only when email is valid!
        
$email $this->_request->getPost('email');
        if( 
$validEmail->isValid$email ) ) {
            
$mail->setFrom$email $this->_request->getPost('naam') );
        } else {
            
$this->view->validError $validEmail->getMessages();
        }
        
        
//mail conifgureren
        
$mail->addTo'stijnleenknegt@gmail.com' 'Stijn Leenknegt' );
        
$mail->setSubject('Contactpagina portfolio');
        if( 
$mail->send() ) {
            
$this->view->succes true;
        }
        
    }
    
    
//render
    
$this->render();
    
}


code uitleg:
- new Zend_Validate_EmailAddress: hiermee wordt de validator aangeroepen. Er zijn meerdere validators (zie lijst verder).
- isValid(...): met deze functie controleer je of de input een emailadres is en voldoet aan de eisen van de validator.
- getMessages(): wanneer deze niet voldoet komen de fouten op het scherm. (aangezien de from header niet echt nodig is om een mail te sturen moeten we de mail actie niet stopzetten).

Er is een view stukje bijgekomen, dus open contact.phtml en voeg volgende code toe.

contact.phtml:
<?php echo $this->render('header.phtml'); ?>
<?php 
echo $this->render('menu.phtml'); ?>


<div id="pageContent">
    <h1><?php echo $this->titel?></h1>
    
    <?php if( isset( $this->succes ) ) : ?>
    <p class="block">
        <?php echo $this->textColor('Je mail werd succesvol verstuurd.  
Een reactie wordt zo snel mogelijk verstuurd.' 
'#FF0000'); ?>
    </p>
    <?php endif; ?>
    
    <?php if( isset( $this->validError ) ) : ?>
    <p class="block">
        <?php foreach( $this->validError as $error ) {
            echo 
$this->textColor$error '<br />' '#FF0000');
        } 
?>
    </p>
    <?php endif; ?>
    
    <form method="post">
        <p class="block">
            Naam: <br> 
            <?php echo $this->formText('naam' '' , array('size' => 30) ); ?> <br><br>
            
            E-mailadres: <br>
            <?php echo $this->formText('email' '' , array('size' => 30) ); ?><br><br>
            
            Bericht: <br>
            <?php echo $this->formTextarea('bericht' '' 
            array(
'rows' => 10 'cols' => 40) ); ?><br><br>
            
            <?php echo $this->formSubmit('submit' 'Versturen' ); ?>
        </p>
    </form>
</div>

<?php echo $this->render('footer.phtml'); ?>  


Naast de lijst met beschikbare Zend Filters is er ook een lijst met standaard Zend Validators.
  • Alnum
  • Alpha
  • Between
  • Ccnum
  • Date
  • Digits
  • EmailAddress
  • Float
  • GreaterThan
  • Hex
  • Hostname
  • InArray
  • Int
  • Ip
  • LessThan
  • NotEmpty
  • Regex
  • StringLength

Ook zijn er weer verschillende manieren om een validator te gebruiken. Een voorbeeld.

voorbeeld:
<?php
/**
 * Manier 1
 */

//bootstrap (index.php)
Zend_Loader::loadClass('Zend_Validate');

//in de code zelf
if( ! Zend_Validate::is$input 'EmailAddress' ) ) {
    
var_dumpZend_Validate::getMessages() );
}


/**
 * Manier 2
 */

//bootstrap (index.php)
Zend_Loader::loadClass('Zend_Validate');

//in de code zelf
$validator = new Zend_Validate();
$validator->addValidator('Email_Address')
            ->
addValidator('NotEmpty');
$validator->isValid$input ); 

4. Objecten registreren


Dit is het laatste puntje die ik graag had uitgelegt aan jullie. Zend Framework heeft een component genaamd Zend Registry. Hierin kan je variablen opslaan met verschillende inhoud (array, strings, integers, objecten, ...). Dit is handig als je objecten aanmaakt in de bootstrap en verder wilt gebruiken in een ander bestand (bijvoorbeeld in een action). Een voorbeeld: in onze bootstrap hebben we Zend Filter ingeladen. Omdat we niet telkens een nieuwe instantie van Zend_Filter willen maken gaan we onze instantie registeren zodat we diezelfde instantie ook nog ergens anders kunnen gebruiken. Dit zou dan de index.php worden.

index.php:
<?php
// full error reporting
error_reporting(E_ALL);

set_include_path'.' PATH_SEPARATOR './library/' PATH_SEPARATOR get_include_path() );

//includes
include_once('Zend/Loader.php');

//load the classes
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
Zend_Loader::loadClass('Zend_Filter');
Zend_Loader::loadClass('Zend_Filter_HtmlEntities');
Zend_Loader::loadClass('Zend_Filter_StripTags');
Zend_Loader::loadClass('Zend_Registry');

//configure the registry
$registry = new Zend_Registry();
Zend_Registry::setInstance$registry );

//configure the filter
$filter = new Zend_Filter();
$filter -> addFilter( new Zend_Filter_StripTags() ) -> addFilter( new Zend_Filter_HtmlEntities() );
$registry->set'filter' $filter );

//configure the database
$options = array(
                
'host' => 'localhost' ,
                
'username' => 'root' 
                
'password' => '*******' ,
                
'dbname' => 'database'
                
);
$db Zend_Db::factory'PDO_MYSQL' $options );
Zend_Db_Table::setDefaultAdapter$db );

//configure the front controller
$controller Zend_Controller_Front::getInstance();
$controller->setParam('noViewRenderer' true);
$controller->setControllerDirectory'./application/controllers');

//run the conroller
$controller->dispatch();


code uitleg:
- setInstance(): we registreren $registry zodat we die later overal kunnen oproepen.
- set(...): de set functie heeft twee parameters. De eerste is de label van de variable en de tweede de inhoud. Hier is dat dus een object.

Ons filter object is nu geregistreerd en nu kunnen we die makkelijk toepassen in onze addAction().

GalleryController.php:
public function addAction()
{
    
    if( 
$this->_request->isPost() ) { 
        
        
//call model
        
$projects = new Projects();
        
        
//call filter
        
$filter Zend_Registry::get('filter');
        
        
$data = array(
                    
'titel' => $filter->filter$this->_request->getPost('titel') ) ,
                    
'omschrijving' => $filter->filter$this->_request->getPost('omschrijving') ) ,
                    
'status' => $this->_request->getPost('status')
                    );
                    
        
//data invoegen en de persoon redirecten
        
$projects->insert$data );
        
$this->_redirect'./gallery/' );
        
    } else {
        
$this->view->paginaTitel 'Project toevoegen';
        
$this->view->titel 'Voeg een project toe :]';
    }
    
    
$this->render();
    
}


Met de static functie get(...) kunnen we een variable ophalen uit het register. Je kan ook het volgende doen ipv de static functie get().

//call filter
$registry Zend_Registry::getInstance();
$filter $registry->get('filter');


Met getInstance() haal je dus het register object op die we in onze boostrap hebben geregistreerd. Het register kan heel handig zijn voor objecten te gebruiken die niet op één plaats worden gebruikt.

5. Het einde?


Dit is niet het einde van tutorials over Zend Framework maar wel voor deze reeks. Je hebt in deze laatste tutorial kennis gemaakt met andere componenten van het framework. Ik kan blijven voorbeelden geven maar ergens stopt het (auw zegt mijn hand van te copy/pasten). Er zijn nog een paar handige dingen die ik zekers met jullie deel.

Het voorbeeld blijft staan op http://www.mindios.com/portfolio/

Een wereld zonder documentatie is een naieve wereld. Net zoals de manual van php.net bestaat er een manual van Zend Framework. Die manual werd veel geraadpleegt tijdens het schrijven van deze tutorials en zal nog steeds geraadpleegt worden en dat moeten jullie ook doen als je meer wilt weten over Zend Framework. Deze kan je vinden op volgende link.

http://framework.zend.com/wiki/display/DOCDEVNL/Home

Naast de manual is er ook nog veel support beschikbaar. Er zijn de ZF forums en #zftalk (FreeNode) waar je altijd terecht kan met je vragen over ZF.

http://www.sitemasters.be/?pagina=tutorials/tutorials&cat=4&id=455 , deze tutorial is geschreven door de persoon die mij in contact heeft gebracht met ZF en ook met OOP. Hierin legt hij het gebruik uit twee belangrijke Zend Framework componenten, namelijk Zend Cache en Zend Config. Twee belangrijke componenten.

http://zendext.maaksite.nl/Main_Page , is een site die meehelpt om het framework te verbeteren en uit te breiden.

Klik hier voor de volledige versie van dit tutorial pakket!

Vragen of opmerkingen -> stuur mij een PM of plaats een reactie.

Stijn Leenknegt

« Vorige tutorial : Websites maken met Zend Framework: deel 4/5 Volgende tutorial : Zend Session (Zend Framework) »

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