Test naplnění proměnné z databáze v šabloně

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jarks
Člen | 94
+
0
-

Dobrý den, nevím jak otestovat, že proměnná v šabloně obsahuje nějaká data z databázové tabulky. Jde o použití Nette\Database.
V presenteru jen zavolám model:

$this->template->items = $this->getService('model')->getItems();

V šabloně:

{if $items} //<< co sem napsat, aby platilo následující:
    <h1>Tohle by se nemělo vypsat, pokud není co vypisovat</h1>
    {foreach $items as $i}
	{$i->name} <br/>
    {/foreach}
{/if}

Nápis se objeví i když je výsledek prázdný, protože proměnná $items obsahuje Nette\Database\Statement, takže vlastně prázdná není. Můžete mi prosím poradit?

Zdeno1981
Člen | 115
+
0
-

Ahoj, možná by ti pomohlo tohlle

<?php
{if count($items)}
.....
{else} Nejsou k dispozici žádná data {/if}
?>

Editoval Zdeno1981 (23. 11. 2011 14:37)

jarks
Člen | 94
+
0
-

Díky, ale to nepomůže. Ani count() ani !empty(). dump count($items) je pořád == 1. Proto se právě ptám.

nanuqcz
Člen | 822
+
0
-

To je zvláštní, count($items) by mělo fungovat. Zkus dump( $items->count() ), vypíše nějakou chybu, nebo taky 1? Jinak zkus sem vypsat obsah metody Model::getItems().

voda
Člen | 561
+
0
-

Dokumentace

{if}
    <h1>Výpis řádků z databáze</h1>

    {foreach $database->table as $row} ... {/foreach}
{/if $row}
jarks
Člen | 94
+
0
-

model:

 public function getItems($cat) {
    return $this->database->query("
        SELECT  iditems, name, DATE_FORMAT(date,'%d.%m.%Y') as datum
        FROM items
        LEFT JOIN categories on items.category_id = categories.idcategories
        WHERE cat = ?
        ORDER BY name", $cat);
}

Myslím, že na tom snad není nic zvláštního. query používám proto, že nemůžu dodržet konvence pojmenování klíčů. Jde o starou databázi, kterou využívají i jiné aplikace. Pokud výsledek nějaká data obsahuje, všechno funguje normálně. Nedaří se mi jen otestovat prázdný výsledek.

Proměnná $items obsahuje Nette\Database\Statement Object. $items->count() dává Call to undefined method Nette\Database\Statement::count(). Kdyby na tom záleželo: PHP 5.3.6, Nette 2.0-beta.

Claudie1
Člen | 21
+
0
-

Nepomohlo by {ifset} ?

Např:

{ifset $items}
....
{/ifset}

Editoval Claudie1 (23. 11. 2011 15:32)

jarks
Člen | 94
+
0
-

{ifset} taky ne a tohle

{if}
    {foreach $database->table as $row} ... {/foreach}
{/if $row}

nějak neumím použít. Musel bych předat celou databázi?
Jako funkční řešení mě napadlo jen překonvertovat to v prezenteru na array a pak teprve testovat, jestl i v tom něco je.

22
Člen | 1478
+
0
-

neměl by jsi ta data nějak fetchnout, aby jsi tam neměl statment?

jarks
Člen | 94
+
0
-

22 napsal(a):

neměl by jsi ta data nějak fetchnout, aby jsi tam neměl statment?

Díky! To je ono. Zatím jsem dělal jen s dibi a myslel jsem, že s Nette\Database to tam být nemusí.

$this->template->items = $this->getService('model')->getItems()->fetchAll();

a pak funguje {if count($items)}.

Editoval jarks (23. 11. 2011 16:06)

22
Člen | 1478
+
0
-

count() tam nemusí vůbec být, protože pokud není výsledek, tak v proměnné je NULL

Editoval 22 (23. 11. 2011 16:09)

jarks
Člen | 94
+
0
-

Pravda. Stačí {if $items}. Díky ještě jednou.

voda
Člen | 561
+
0
-

jarks napsal(a):
nějak neumím použít. Musel bych předat celou databázi?

Nepotřebuješ celou databázi. Byl to jen příklad, musíš si to samozřejmě upravit pro svoji konkrétní situaci:

{if}
	{foreach $items as $i}
		{$i->name} <br/>
	{/foreach}
{/if $i}