login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Stijn
Moeilijkheidsgraad:
Moeilijk
Hits:
11334
Punten:
Aantal punten:
 (4.89)
Aantal stemmen:
9
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (11)
 

Tutorial:

Websites maken met Zend Framework: deel 4/5

Websites maken met Zend Framework: deel 1
Menu: 1. Inleiding
2. Tabellen maken
3. Verbinding maken met de database
4. Model schrijven en resultaten ophalen
    4.1. Gegevens ophalen (meerdere rijen en één rij)
5. Gegevens toevoegen
6. Gegevens bewerken
7. Gegevens wissen
8. Einde deel 4

1. Inleiding


In de gallery kunnen we projecten toevoegen, bewerken en verwijderen. We hebben al de formulieren gemaakt (zie deel 3). We moeten nu nog de data hebben. Deze data moet ergens opgeslagen worden. Dit kan via een file of een database gebeuren. Omdat het model (de M van MVC) meer database gericht is gaan we ook via deze manier gebruik maken. In deze vierde tutorial gaan we onze tabellen opzetten, templates wat aanpassen en de model schrijven.

Note: kennis van PDO is niet vereist, je moet gewoon weten dat Zend Db de PDO technologie gebruikt.
Note 2: als je server geen PDO ondersteund zal je helaas een andere opslag type moeten zoeken zoals XML of andere file type.

2. Tabellen maken


MySQL is het meest gebruikte databasemodel in de php wereld en dus klinkt het niet abnormaal dat we hier voor mysql kiezen als databasemodel. De tabellen maken is simpel. Neem volgende query over en voer deze uit in je phpmyadmin.

CREATE TABLE `portfolio_projects` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titel` VARCHAR( 255 ) NOT NULL ,
`omschrijving` TEXT NOT NULL ,
`status` VARBINARY( 50 ) NOT NULL
) ENGINE = MYISAM ;

3. Verbinding maken met de database


We gaan verbinding maken met de database in onze bootstrap (index.php). Open deze en voeg volgende code toe onder lijn 11 (Zend_Loader::loadClass....):

index.php:
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');

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


code uitleg:
- Eerst laden we de twee classes die we gebruiken. Zend_Db_Table moeten we niet gebruiken maar gebruiken we toch om models te schrijven en omdat je veel sneller queries kan schrijven. Als je enkel Zend_Db gebruikt moet je dan het PDO model gebruiken. Zend_Db_Table gebruikt het PDO model ook maar indirect. Je zal wel zien hoe en waarom.
- $options: om wat overzicht te houden zettten we alle login gegevens in een array. De keys van de array moeten host, username, password en dbname zijn (anders krijg je error).
- $db = Zend_Db...: met Zend_Db maken we verbinding met onze database. Zend_Db_Table kan dit niet omdat Zend_Db de hoofdclass is en die alle queries direct met de database uitvoert. Zend_Db_Table gebruikt Zend_Db in zijn functies. We hebben dus 2 parameters. De eerste is het type van database. We gebruiken mysql dus typen we PDO_MYSQL. Als je Sqlite zou gebruiken type je PDO_SQLITE. De tweede parameter is de login gegevens die in de array $options staan.
- Zend_Db_Table...: zoals gezegt gebruikt Zend_Db_Table de Zend_Db class in zijn functies om queries uit te voeren. Als we geen adapter zetten kan Zend_Db_Table geen queries uitvoeren.

Je index.php zou er nu ongeveer zo moeten uitzien: http://www.plaatscode.be/6226/

4. Model schrijven en resultaten ophalen


Een model schrijven is het simpelste wat je maar kan doen. Voor iedere tabel moet je een model schrijven. Wij hebben één tabel (portfolio_projects) en dus hebben we ook één model voor onze site. Stel dat je 10 tabellen hebt dan zal je 10 modellen moeten schrijven. Neem volgende code over in een nieuwe php bestand:

projects.php:
<?php
class Projects extends Zend_Db_Table 
{
    
    protected 
$_name 'portfolio_projects';
    
}


Sla deze code op als projects.php in de map ./application/models/. De naam van de php doet er niet echt aan toe en die van de class ook niet. Geef ze een duidelijke naam zodat iedere ontwikkelaar weet waarover dit model gaat.

code uitleg:
- extends Zend_Db_Table: iedere model maakt gebruik van de class Zend_Db_Table zodat we de query functies kunnen gebruiken en onze data kunnen ophalen/bewerken/verwijderen.
- protected $_name...: deze variable moet je in iedere model defineren zodat Zend_Db_Table weet over welke tabel het hier gaat.

4.1. Gegevens ophalen (meerdere rijen en één rij)


Onze model is geschreven en nu gaan we beginnen met de functies van Zend_Db_Table te gebruiken om gegevens op te halen. Open de GalleryController.php want net zoals in de View wordt de communicatie tussen de user (input) en de database (model) in de controllers geschreven. Aangezien iedere actie in de class GalleryController dezelfde tabel gebruiken moeten we de include van ons model maar op één plaats schrijven, nl onze init() functie. Voeg volgende code toe aan de init functie en plaats die onder de initView();

GalleryController.php:
//load the model
include './application/models/projects.php';


In de indexAction() worden alle projects opgehaalt en weergegeven. Zend_Db_Table heeft hier een functie voor genaamd fetchAll(). Onze indexAction() zal er zo uit gaan zien:

GalleryController.php:
public function indexAction()
{
    
    
$projects = new Projects();
    
    
//get the results and show them on the screen
    
$this->view->projects $projects->fetchAll();
    
    
$this->view->paginaTitel 'Gallery';
    
$this->view->titel 'Overzicht van alle projecten :]';
    
$this->render();
    
}


code uitleg:
We maken dus een instance van ons model. De functie fetchAll(); hebben we niet gemaakt in onze model maar deze staat al geschreven in de class Zend_Db_Table (als je verder kijkt zoals ik deed dan weet je dat het Zend_Db_Table_Abstract is want Zend_Db_Table is maar een extend ervan).

We moeten de resultaten op ons scherm hebben en dus gaan we de resultaten ( fetchAll() returnt een array) in onze index template moeten schrijven. Open dus index.phtml van de map ./views/gallery/ en neem volgende code over (alleen het toegevoegde deel moet je overnemen, 3/4 van de code staat al in de index.phtml).

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


<div id="pageContent">
    <h1><?php echo $this->titel?></h1>
    <p class="block">
        <?php foreach( $this->projects as $row ) : ?>
            <a href="<?php echo $this->url?>/gallery/view/id/<?php echo $row->id?>">
            <?php echo $row->titel?>
            </a> <br />
        <?php endforeach; ?>
    </p>
    
</div>

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


code uitleg:
Deze manier van foreach schrijven is wat onbekend maar deze bestaat in php. Zo is het overzichtelijker om php in html te schrijven. Zoals al gezegt bevat $this->projects de array met resultaten. $row is niet zomaar een waarde van die array maar is een instantie van een object, namelijk een instantie van Zend_Db_Table_Rowset. Rowset wordt ingeschakeld als het gaat om meerdere rijen (dit kan ook 1 zijn maar het kunnen er altijd meer zijn). Je kan nu de waarden weergeven op het scherm door $row->{kolom} te echoën in je template.

We hebben nu alle projecten op ons scherm staan met een mooi linkje errond. Nu gaan we in plaats van meerdere rijen, één rij ophalen. Namelijk de rij van het geselecteerde project. Volgende code voegen we toe aan onze viewAction().

GalleryController.php:
public function viewAction()
{
    
    
$projects = new Projects();
    
    
//get id and fetch the record of the database
    
$id = (int) $this->_request->getParam('id');
    
$row $projects->fetchRow('id = ' $id);
    
    
$this->view->paginaTitel $row->titel;
    
$this->view->id $row->id;
    
$this->view->titel $row->titel;
    
$this->view->omschrijving $row->omschrijving;
    
$this->view->status $row->status;
    
$this->render();
    


code uitleg:
- $id = (int)...: in onze template index.phtml hebben we /id/{record id} toegevoegd aan onze link. Dit is nu een parameter. Je haalt deze parameter op met $this->_request->getParam(...) en tussen haakjes schrijf je de naam van de parameter, hier is dat dus id.
- fetchRow(): we moeten maar één rij ophalen en dus gebruiken we de functie fetchRow() maar nu moeten we een WHERE opdracht meegeven. Normaal is dit WHERE id = $id in een gewone query en dus vullen we tussen haakjes id = $id in. fetchRow() is ook weer een functie van de Zend_Db_Table class.

Ook hier moet het resultaat op het scherm komen. Dus open view.phtml en neem volgende code over:

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


<div id="pageContent">
    <h1><?php echo $this->titel '(' $this->status ')'?></h1>
    <p class="block">
        <i><h5>
        
        (<a href="<?php echo $this->url?>/gallery/edit/id/<?php echo $this->id?>">Bewerken</a>  -  <a href="<?php echo $this->url?>/gallery/delete/id/<?php echo $this->id?>">Verwijderen</a>)
        
        </h5></i>
        
        <br>
        
        <?php echo $this->omschrijving?>
    </p>
</div>

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


Deze vereist geen verdere uitleg. Je zou deze code al zelf kunnen geschreven hebben en zekers al moeten begrijpen. We kunnen nu al onze database uitlezen. Nu nog updaten, inserten en deleten.

5. Gegevens toevoegen


We hebben al een formulier gemaakt (zie deel 3) om projecten toe te voegen. We gaan nu de code schrijven om het formulier te verwerken en om de data in de database te stoppen. De action addAction() krijgt nu volgende code.

GalleryController.php:
<?
public function addAction()
{
    
    if( 
$this->_request->isPost() ) { 
        
        
//call model
        
$projects = new Projects();
        
        
$data = array(
                    
'titel' => $this->_request->getPost('titel') ,
                    
'omschrijving' => $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:
- $this->_request->isPost(): hiermee controleer je of het formulier verstuurd is of niet. Deze functie returnt een boolean met true als het formuulier gepost is.
- $data = ...: we maken nu een array met de data. De keys van de array zijn de kolomnamen van de mysql tabel en de values zijn de gegevens die ingevuld zijn in het formulier.
- $this->_request->getPost(...): met deze functie kan je de waarde ophalen van een formulier element. Hetgeen tussen de haakjes is de name van het formulier element.
- $projects->insert( $data ): met de insert functie kan je dus records toevoegen aan je tabel. $data is de array die je zonet hebt gemaakt. Meer is er niet aan. Zie je wel dat Zend_Db_Table het scripten makkelijk/sneller maakt.
- $this->_redirect(...): je kan een tekst op het scherm zetten maar je kan ook de gebruiker direct zijn resultaat laten zien door hem terug te sturen naar alle projecten.

Belangrijk! Er is een schoonheidsfoutje gebeurt in de template add.phtml. Gelieve de code van de volgende link over te nemen in add.phtml. Niet alles kan perfect zijn.
http://www.plaatscode.be/6236/

6. Gegevens bewerken


Gegevens bewerken is bijna hetzelfde als gegevens toevoegen. Het enige verschil is dat je data uit de tabel moet halen en het verwerken van het formulier is net hetzelfde als gegevens toevoegen. Het verschil zit hem in de functie. Maar laten we eerst onze template edit.tpl veranderen. Schrijf volgende code over in edit.tpl.

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


<div id="pageContent">
    <h1><?php echo $this->titel?></h1>
    <form method="post" action="<?php echo $this->url?>/gallery/edit/id/<?php echo $this->id?>">
        <p class="block">
            Project titel: <br>
            <?php echo $this->formText('titel' $this->ptitel , array('size' => 30) ); ?> <br><br>
                    
            Project omschrijving: <br>
            <?php echo $this->formTextarea('omschrijving' $this->omschrijving 
            array(
'rows' => 10 'cols' => 40) ); ?> <br><br>    
            
            Project status: <br>
            <?php echo $this->formSelect('status' '' , array() ,  
            array( 
'Afgewerkt' => 'Afgewerkt' 'In ontwikkeling' => 'In ontwikkeling') ); ?> <br><br>
            
            <?php echo $this->formSubmit('submit' 'Versturen' ); ?>
        </p>
    </form>
</div>

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


Zoals je ziet hebben we nu waarden toegevoegd aan de Helpers en is er een action bijgekomen bij ons formulier. Nu gaan we over naar het schrijven van de editAction. Neem volgende code over, de uitleg staat zoals gewoonlijk eronder.

GalleryController.php:
public function editAction()
{

    
//call model
    
$projects = new Projects();
    
    
//formulier
    
if( $this->_request->isPost() ) { 
        
        
$data = array(
                    
'titel' => $this->_request->getPost('titel') ,
                    
'omschrijving' => $this->_request->getPost('omschrijving') ,
                    
'status' => $this->_request->getPost('status')
                    );
                    
        
//data updaten en de persoon redirecten
        
$projects->update$data 'id = ' . (int) $this->_request->getParam('id') );
        
$this->_redirect'./gallery/' );
        
    } else {
        
//data ophalen
        
$row $projects->fetchRow('id = ' . (int) $this->_request->getParam('id') );
        
$this->view->paginaTitel 'Project ' $row->titel ' bewerken';
        
$this->view->titel 'Bewerk ' $row->titel;
        
$this->view->id $row->id;
        
$this->view->ptitel $row->titel;
        
$this->view->omschrijving $row->omschrijving;
    }
    
    
$this->render();
    
}


code uitleg:
- $projects->update( ... ): als je records wilt wijzigen moet je de update functie gebruiken. Deze heeft 2 parameters. De eerste ken je, deze is hetzelfde als voor de functie insert(). De tweede is WHERE parameter. Hij moet weten welk record er moet verandert worden. Deze ken je ook van punt 4.1.

De rest van de code ken je ook al of zou je toch al moeten begrijpen. Het enige wat ons nog rest is de deleteAction.

7. Gegevens wissen


We gaan eerst onze template wat veranderen omdat we een confirmatie willen. Open delete.phtml en zet volgende code erin:

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


<div id="pageContent">
    <h1><?php echo $this->titel?></h1>
    <p class="block">
        Verwijder project <?php echo $this->ptitel;?> ? <br><br>
        <?php echo $this->formButton('yes' 'Verwijder project' 
        array(
'onClick' => "location.href='".$this->url."/gallery/delete/id/" $this->id "/confirm/1';") ); ?>
        <?php echo $this->formButton('no' 'Annuleren' 
        array(
'onClick' => "location.href='".$this->url."/gallery/index';") ); ?>
    </p>
</div>

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


De template is gewijzigd en nu gaan we de code schrijven voor deleteAction().

GalleryController.php:
public function deleteAction()
{
    
//call model
    
$project = new Projects();
    
    
//delete
    
if( $this->_request->getParam('confirm') == ) {
        
$project->delete'id = ' $this->_request->getParam('id') );
        
$this->_redirect'./gallery/' );
    } else {
        
$row $project->fetchRow'id = ' $this->_request->getParam('id') );
        
$this->view->paginaTitel 'Project verwijderen';
        
$this->view->titel 'Project verwijderen';
        
$this->view->id $row->id;
        
$this->view->ptitel $row->titel;
        
$this->render();
    }
    
}


code uitleg:
- $project->delete(...): de delete() functie zal dus een record wijzigen. Die heeft maar één parameter en dat is de WHERE. Deze ken je , dus niets nieuws meer.

Verdere uitleg heeft deze code niet nodig, aangezien jij nu een bijna volleert ZF'er bent.

8. Einde deel 4


Dit is het dan beste lezer. Jij bent nu in staat om een volledige website mbv Zend Framework te bouwen. Je hebt MVC nu live mogen scripten en ondervinden. Als je tot hiertoe alles begrepen hebt, geef ik alvast een applausje want simpel is dit niet als je dit voor de eerste ziet. Daarom moet je deze tutorial meerdere malen herlezen en uitproberen. Experimenteren is nooit verboden en zekers niet om eens de broncode van zend framework openleggen (zo leer je nieuwe functies/technieken kennen).

Dit is nog niet het einde, deel 5 komt er nog aan. Hierin gaan we verder dan het MVC model in Zend Framework. We gaan er onze contact pagina maken met Zend Mail en wat handige beveiligingen uitleggen.

De site werkt nu bijna compleet, het voorbeeld is nog steeds http://www.mindios.com/portfolio/

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 3/5 Volgende tutorial : Websites maken met Zend Framework: deel 5/5 »

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