[PHP/MySQL/Zend] Weergeven gerelateerde data

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Blacksnak
  • Registratie: Oktober 2001
  • Laatst online: 07-07-2024
Ik ben sinds kort begonnen met het opzetten van een nieuwe website om tweedehands wagens weer te geven. Met dit project wil ik meteen afstappen van de klassieke manier van programmeren waar ik reeds wat jaren ervaring in heb en eindelijk overstappen naar OOP in PHP.

Omdat ik (buiten wat theoretische lessen en wat 'hello world' applicaties in java) zeer weinig kennis heb van het OO gebeuren heb ik besloten om een framework te gebruiken om toch ergens een houvast te hebben. Zend leek me boeiend en perfect wat ik zocht.

Na een aantal tutorials doorgenomen betreffende het Zend-framework ben ik dan ook begonnen aan het opzetten van de site. Het basisopzet van het framework begrijp ik en hiermee slaag ik ook wat basisgegevens weer te laten geven.

Nu ben ik echter aangekomen bij het weergeven van data uit meerdere tabellen en loop ik vast in de denkwijze die Zend gebruikt.

Om het probleem te schetsen eerst wat beknopte info over mijn project:

tabellen

Ik heb een heel DB-schema opgesteld maar dit is bij mijn probleem niet belangrijk. Daarom geef ik gewoon 2 basistabellen:

*tblWagen*
PK wagen_ID
wagen_merk (integer)
wagen_type (varchar)
wagen_versie (varchar)
etc...

*tblMerk*
PK merk_ID
merk_omschrijving

Code

Volgende code gebruik ik om gegevens weer te geven (niet-triviale data laat ik achterwegen):

PHP: controllers/IndexController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class IndexController extends Zend_Controller_Action{
            public function init()
            {
                         $this->initView();
                         
                         //variabelen declareren
                         $this->view->url = $this->_request->getBaseUrl();
                         
                         // Modellen laden
                         include './application/models/tblWagen.php';
                         include './application/models/tblMerk.php';
            }
            
            public function indexAction()
            {
                         $wagen = new Wagen();
                         
                         // gegevens ophalen en weergeven
                         $this->view->wagen = $wagen->fetchAll();

                         $this->render();
            }
}


code: views/scripts/index/index.phtml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php echo $this->render('header.phtml'); ?>
<?php echo $this->render('menu.phtml'); ?>

<div id="pageContent">
         <h1><?php echo $this->testHelper( $this->titel, '#663366' ); ?></h1>
         <p>Momenteel hebben we volgende wagens in voorraad:</p>
         
         <ol>
         <?php foreach( $this->wagen as $row ): ?>
                     
                     <li><?php echo $row->wagen_merk; ?> <?php echo $row->wagen_type." ".$row->wagen_versie;?> (id=<?php echo $row->wagen_ID ?>)</li>
         <?php endforeach; ?>
         </ol>
</div>

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


PHP: models/tblMerk.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Merk extends Zend_Db_Table
{
            protected $_name = 'tblMerk';
            
            public function getMerk($id) 
            { 
                         $where = $this->select()->where('id = ?',$id);
                         $row = $this->fetchRow($where);
                         
                         return $row['merk_omschrijving'];
                         
            }
}
?>

PHP: models/tblWagen.php
1
2
3
4
5
6
<?php
class Wagen extends Zend_Db_Table
{
            protected $_name = 'tblWagen';
}
?>

resultaat

Voorlopig heb ik volgende resultaat:

code:
1
2
3
4
5
Overzicht wagens

Momenteel hebben we volgende wagens in voorraad:

   1. 1 Laguna III Dynamique (id=1)


Het is echter de bedoeling dat die 1 achter de nummering vervangen wordt door het merk (Renault in dit geval). Ik heb al verschillende zaken geprobeerd (oa. door helper toe te voegen aan het model van tblMerk zoals te zien is in de code) maar ik krijg het niet voor mekaar. Doordat ik nu tal van tutorials gezien heb begint het eerder een bomen - bos verhaaltje te worden.

Met een simpele join-query uit te voeren in mijn controller zou m'n probleem wel opgelost zijn maar ergens heb ik het gevoel dat dit niet de bedoeling is van het framework. Ik zou het veel liever op de 'juiste' manier aanpakken maar hier loop ik dus compleet op vast. Kan iemand mij hierin terug op weg helpen of zit ik echt helemaal verkeerd te werken?

De structuur die ik gebruik is gebaseerd op de tutorial die ik heb gevonden op volgende site: Sitemasters.be

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Er is een prachtig hoofdstuk in de handleiding over Db Table Relationships: http://framework.zend.com....table.relationships.html Daarmee moet je het voor elkaar kunnen krijgen.

Nog wat kleine dingen:
- zet geen tbl voor je tabelnamen, het is vrij logisch dat het een tabel is, daarvoor hoeft er geen tbl voor te staan
- zet je includes niet in een functie, maar bovenaan in het bestand
- gebruik geen include, maar include_once of require_once

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Overigens is die tutorial héél oud. Neem liever de QuickStart van ZF door.