Problém s třídou Contact dědící z DibiRow

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

Ahoj,
mám problém s třídou Contact. V presenteru v akci show předávám šabloně výsledek, jenže při renderingu mi laděnka hlásí, že pracuji s nedefinovanou property.

Contact:

class Contact extends DibiRow
{
	public function __construct($arr = array())
	{
        return parent::__construct($arr);
	}

	public function save()
	{
		return dibi::update('[contact]', (array) $this)->execute();
	}

	public function delete()
	{
		return dibi::delete('[contact]')->execute();
	}

	public function read()
	{
		return dibi::select('*')->from('[contact]')->execute()->setRowClass('Contact');
	}
}

ContactPresenter

class ContactPresenter extends BasePresenter
{

	private $__contact;

	public function actionShow()
	{
	}

	public function renderShow()
	{
		$this->template->contact = $this->contact->read();
	}

	public function getContact()
	{
		if (!isset($this->__contact))
		{
			$this->__contact = new Contact();
		}

		return $this->__contact;
	}
}

a šablona

{block content}

<p>Email: {$contact->email}</p>
<p>ICQ: {$contact->icq}</p>
<p>MSN: {$contact->msn}</p>
<p>Skype: {$contact->skype}</p>

Můžete mi poradit, v čem může být problém..?

westrem
Člen | 398
+
0
-

No po zbeznom prezreti kodu ma napada zfleku iba ze ten kod:

<?php
$this->contact->read();
?>

Ti vracia pole, nie jeden kontakt.

To bude potom problem v sablone, ze ti k tomu kontaktu pristupujes ako k jednemu pricom v nom mas pole kontaktov.

Mesiah
Člen | 240
+
0
-

Děkuji, opravdu to bylo tím.

Na druhou stranu, bylo by fajn, kdybych ve view nemusel pracovat s polem, ale přímo s objektem Contact…
Zkoušel jsem předtím, než do template dostanu $this->contact->read(); přetypovat na typ (Contact)

$this->template->contact = (Contact) $this->contact->read();

Jenže to není správný přístup (dostávám chybu „Parse error“), jak by šlo něčeho podobného docílit? Změnou modelu, rep. jeho metody read(), aby vracela jiný typ? Jaký?

redhead
Člen | 1313
+
0
-

setRowClass nevrací rovnou objekt. Ten musíš ještě vrátit přes metodu fetch (nebo fetchAll).

return dibi::select('*')->from('[contact]')->execute()->setRowClass('Contact')->fetchAll();

Editoval redhead (3. 8. 2010 15:57)

Mesiah
Člen | 240
+
0
-

Jejda, to mě mohlo napadnout. :) Děkuji

BTW: zajímalo by mě, kam se v adresářové struktuře aplikace dávají objekty komponent?

Blizzy
Člen | 149
+
0
-

Mesiah napsal(a):

Jejda, to mě mohlo napadnout. :) Děkuji

BTW: zajímalo by mě, kam se v adresářové struktuře aplikace dávají objekty komponent?

Záleží to na tobě, stačí to umístit tam, kam došáhne RobotLoader (většinou složky libs a app). Jednou z možností je složka app/compnents.