[ZF] Query: foutafhandeling?

Overzicht Reageren

Direct weten hoe jij ervoor staat in de arbeidsmarkt?
Jasper DS

Jasper DS

30/06/2012 16:07:21
Quote Anchor link
Op welke manier vangt zend een foute query op?

Nu krijg ik een lelijke error dat mijn foreach niet klopt maar ik denk dat het aan mijn query ligt!

Foutmelding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Warning: Invalid argument supplied for foreach() in C:\wamp\www\project1\application\views\scripts\report\index.phtml on line 4


Models/DbTabel/Client.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
class Application_Model_DbTable_Client extends Zend_Db_Table_Abstract
{

    protected $_name = 'navision_data';
}

?>
    


Models/Client.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php

lass Application_Model_Company
{
    protected $_id;
    protected $_name;

    public function __construct(array $options = null)
    {

        if (is_array($options))
        {

            $this->setOptions($options);
        }
    }


    public function setOptions(array $options)
    {

        $methods = get_class_methods($this);
        foreach ($options as $key => $value)
        {

            $method = 'set' . ucfirst($key);

            if (in_array($method, $methods))
            {

                $this->$method($value);
            }
        }

        return $this;
    }


    // Deze functies kijken of de set / get bestaat en voeren hem eventueel uit
    public function __set($name, $value)
    {

        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method))
        {

            throw new Exception('Invalid Company property: set' . $name);
        }

        $this->$method($value);
    }


    public function __get($name)
    {

        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid Company property: get' . $name);
        }

        return $this->$method();
    }


    public function getId()
    {

        return $this->_id;
    }


    public function setId($id)
    {

        $this->_id = $id;
        return $this;
    }


    public function getName()
    {

        return $this->_name;
    }


    public function setName($name)
    {

        $this->_name = $name;
        return $this;
    }
}

?>


Models/ClientMapper.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php

class Application_Model_ClientMapper
{
    protected $_dbTable;

    public function setDbTable($dbTable)
    {

        if (is_string($dbTable))
        {

            $dbTable = new $dbTable();
        }

        
        if (!$dbTable instanceof Zend_Db_Table_Abstract)
        {

            throw new Exception('CompanyMapper: Invalid table data gateway provided :' . $dbTable);
        }

        
        $this->_dbTable = $dbTable;
        return $this;
    }

        

    public function getDbTable()
    {

        if (null === $this->_dbTable)
        {

            $this->setDbTable('Application_Model_DbTable_Client');
        }

        return $this->_dbTable;
    }
    

    public function fetchAll()
    {

        $resultSet = $this->getDbTable()->fetchAll();
        $entries   = array();
        foreach ($resultSet as $row)
        {

            $entry = new Application_Model_Client();
            $entry->setId($row->nav_id)
                  ->
setName($row->klantnaam);
            $entries[] = $entry;
        }

        return $entries;
    }

}

?>


View:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<dl>
    <?php foreach ($this->clients as $entry): ?>
    <dt><?php echo $this->escape($entry->id) ?></dt>
    <dd><?php echo $this->escape($entry->name) ?></dd>
    <?php endforeach ?>
</dl>
Gewijzigd op 30/06/2012 16:08:24 door Jasper DS
 
PHP hulp

PHP hulp

20/05/2013 21:00:45
 
Wout van der Vegt

Wout van der Vegt

02/07/2012 10:58:50
Quote Anchor link
Foreach itereert over $this->clients. Maar $this->clients is blijkbaar leeg dus je zult dat moeten afvangen met een if(count($this->clients) > 0).

Dus de view zal zoiets als dit worden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<dl>
<?php if(count($this->clients) > 0) { ?>
    <?php foreach ($this->clients as $entry): ?>
    <dt><?php echo $this->escape($entry->id) ?></dt>
    <dd><?php echo $this->escape($entry->name) ?></dd>
    <?php endforeach ?>
</dl>
<?php
} else {
   echo "Geen clients";
}

?>
 
Jasper DS

Jasper DS

02/07/2012 14:41:12
Quote Anchor link
En mag dat zo in de view staan of is het netter moest dit in de controller gefixt worden?
 
Chi Lion

Chi Lion

02/07/2012 14:43:18
Quote Anchor link
foreach gooi ik altijd in view.
 
Jasper DS

Jasper DS

02/07/2012 14:46:02
Quote Anchor link
Afhandeling ook zoals de count?
 
Chi Lion

Chi Lion

02/07/2012 14:49:39
Quote Anchor link
Doe ik wel, misschien dat Niels hier licht op kan schijnen :)
 
Jasper DS

Jasper DS

02/07/2012 14:53:49
Quote Anchor link
Oke, en stel nu ik wil een stukje laten zien als er op submit gedrukt is in mijn formulier dan krijg je in de controller zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if ($request->isPost())
        {


            if ($form->isValid($request->getPost()))
            {

                // we can do something!

                // show list of clients!

                $client = new Application_Model_ClientMapper();
        
                $this->view->clients = $client->fetchAll();
                    
            }

        }

?>


en in de view:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php echo $this->form->setAction($this->url()); ?>

<table>
    <tr>
        <td>klantID</td>
        <td>Klantnaam</td>
    </tr>    
    <?php foreach ($this->clients as $entry): ?>
    <tr>
           <td><?php echo $this->escape($entry->id) ?></td>
        <td><?php echo $this->escape($entry->name) ?></td>
    </tr>    
    <?php endforeach ?>
</table>


maar wat gebeurt er nu met $this->clients in de view als er nog niet gepost is? want dan bestaat deze natuurlijk nog niet!
 
Chi Lion

Chi Lion

02/07/2012 15:05:18
Quote Anchor link
Dan gebeurt er; niks :)
 
Jasper DS

Jasper DS

02/07/2012 15:18:30
Quote Anchor link
Jawel, hij geeft een error dat de foreach niet goed is doordat het er geen objecten zijn. Ik heb het zo opgelost:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php echo $this->form->setAction($this->url()); ?>

<?php if(count($this->clients) > 0): ?>
    
    <table>
        <tr>
            <td>klantID</td>
            <td>Klantnaam</td>
        </tr>
        
        <?php foreach ($this->clients as $entry): ?>
        <tr>
               <td><?php echo $this->escape($entry->id) ?></td>
            <td><?php echo $this->escape($entry->name) ?></td>
        </tr>    
        <?php endforeach ?>
        
    </table>

<?php endif; ?>
 
Wouter J
Tutorial mod

Wouter J

02/07/2012 15:22:46
Quote Anchor link
Die count mag je gewoon in je view hebben. In je view moet je geen logic plaatsen, dit is geen logic maar gewoon een check. Je kijkt of er items zijn, zijn die er niet dan moet je dat stukje niet tonen. Dat hoort gewoon in de view.
 
Jasper DS

Jasper DS

02/07/2012 15:24:10
Quote Anchor link
Bedankt wouter! Stel nu dat er een situatie is dat er indien er geen records zijn een andere view moet ingeladen worden dat hoort het wel in de controller of is er dan een fout in de logica?
 
Wouter J
Tutorial mod

Wouter J

02/07/2012 15:26:39
Quote Anchor link
Dat hoort dan wel in de controller. De controller beslist welke view ingeladen wordt. Als je bij 1 of meerdere resultaten view A wilt inladen en bij 0 resultaten view B dan regel je dat in de controller.
Wil je bij 1 of meer resultaten de resultaten tonen en anders niet en de rest van de view is gelijk dan hoort dat in de view thuis.

Wil je de 3 recentste resultaten tonen in de sidebar dan krijg je te maken met 2 views en 2 controllers die elk hun eigen view aanroepen, maar dat is hierbij niet van toepassing.
 

02/07/2012 16:25:35
Quote Anchor link
Waarom handel je niet in de model de count af?

zf heeft een simpele fiunctie count ingebouwd in Zend_Db
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$result
= $_table->fetchall();

if ($result->count() < 1) {
    return null;
}

return $result->toArray();
?>
 



Overzicht Reageren