[ZF] Query: foutafhandeling?
Nu krijg ik een lelijke error dat mijn foreach niet klopt maar ik denk dat het aan mijn query ligt!
Foutmelding:
Code (php)
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)
Models/Client.php
Code (php)
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
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;
}
}
?>
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)
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
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;
}
}
?>
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)
Gewijzigd op 30/06/2012 16:08:24 door Jasper DS
Dus de view zal zoiets als dit worden:
En mag dat zo in de view staan of is het netter moest dit in de controller gefixt worden?
foreach gooi ik altijd in view.
Afhandeling ook zoals de count?
Doe ik wel, misschien dat Niels hier licht op kan schijnen :)
Code (php)
en in de view:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
maar wat gebeurt er nu met $this->clients in de view als er nog niet gepost is? want dan bestaat deze natuurlijk nog niet!
Dan gebeurt er; niks :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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; ?>
<?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; ?>
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.
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?
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.
zf heeft een simpele fiunctie count ingebouwd in Zend_Db