Cannot read an undeclared property TaskPresenter::$listRepository

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

Zdravím,
projíždím guickstart a naskočila mi tato chyba:

Cannot read an undeclared property TaskPresenter::$listRepository.
…/app/presenters/TaskPresenter.php:12 source ► Nette\Object→ __get (arguments ►)

 2:
 3:    /**
 4:     * TaskPresenter presenter.
 5:     */
 6:    class TaskPresenter extends BasePresenter
 7:    {
 8:        private $list;
 9:
10:        public function actionDefault($id)
11:        {
12:            $this->list = $this->listRepository->find($id);
13:        }
14:
15:
16:        public function renderDefault()

Nevíte někdo kde dělám chybu? Jedu přesně podle návodu a jsem u po tuto šablonu: https://doc.nette.org/cs/quickstart#…

Mám NetteFramework-2.0.10-PHP5.3 a na serveru php5.4

David Matějka
Moderator | 6445
+
0
-

a pritom by stacilo se vratit o par radku vyse. https://doc.nette.org/cs/quickstart#…

Draffix
Člen | 146
+
0
-

Jinak řečeno ti tam chybí tohle:

// class TaskPresenter

/** @var @var Todo\ListRepository */
private $listRepository;

protected function startup()
{
    parent::startup();
    $this->listRepository = $this->context->listRepository;
}
Zerig
Člen | 70
+
0
-

Teď nevím, který řádek přesně myslíš, ale vše co je před tím jsem přesně udělal podle návodu.

Zerig
Člen | 70
+
0
-

Tady mám celý TaskPresenter.php

<?php

/**
 * TaskPresenter presenter.
 */
class TaskPresenter extends BasePresenter
{
	private $listRepository;

	protected function startup()
	{
		parent::startup();
		$this->listRepository = $this->context->listRepository;
	}

	private $list;

	public function actionDefault($id)
	{
		$this->list = $this->listRepository->find($id);
	}


	public function renderDefault()
	{
		$this->template->list = $this->list;
		$this->template->tasks = $this->listRepository->tasksOf($this->list);
	}
}

Takže by to tam mělo být

Draffix
Člen | 146
+
0
-

Chybí ti tam anotace:

/** @var Todo\ListRepository */
protected $listRepository;

/** @var \Nette\Database\Table\ActiveRow */
private $list;
Zerig
Člen | 70
+
0
-

To ale k funkčnosti kódu nic neřeší, ne?

Draffix
Člen | 146
+
0
-

Ale řeší, nějaké vysvětlení např. zde

Zerig
Člen | 70
+
0
-

V každém případě to nic nezměnilo.

Draffix
Člen | 146
+
0
-

A stále to hlásí chybu „Cannot read an undeclared property TaskPresenter::$listRepository.“?

Zerig
Člen | 70
+
0
-

chyba na stejném řádku, ale:
Call to undefined method Todo\ListRepository::find()
Toho jsem si nevšiml, ale to tak píše s anotací i bez ní

Draffix
Člen | 146
+
0
-

Ve třídě TaskPresenter v metodě actionDefault má být toto:

$this->list = $this->listRepository->findBy(array('id' => $id))->fetch();
Zerig
Člen | 70
+
0
-

Argument 1 passed to Todo\ListRepository::tasksOf() must be an instance of Nette\Database\Table\ActiveRow, boolean given, called in /www/sites/3/site16243/public_html/sandbox/app/presenters/TaskPresenter.php on line 27 and defined

File: …/app/model/ListRepository.php Line: 10

 1:    <?php
 2:    namespace Todo;
 3:    use Nette;
 4:
 5:    /**
 6:     * Tabulka list
 7:     */
 8:    class ListRepository extends Repository
 9:    {
10:        public function tasksOf(Nette\Database\Table\ActiveRow $list)
11:        {
12:            return $list->related('task')->order('created');
13:        }
14:    }
Draffix
Člen | 146
+
0
-

Abych to zkrátil, mrkni se na GitHub a zkus si porovnat, co máš špatně nebo co ti tam chybí. Trochu je rozdílný od quickstartu, nicméně dá se to z něj pochopit.

Zerig
Člen | 70
+
0
-

OK, to už nějakou chvíli provádím.

Zerig
Člen | 70
+
0
-

Tak už je to v pořádku.
Chyba byla opravena jak jsi mi Draffix poradil s tím array. Já to zkoušel, ale na špatně zadané adrese, proto to nefungovalo.
Takže místo toho co je v návodu v TaskPresenter.php:

$this->list = $this->listRepository->find($id);

jsem dal toto:

$this->list = $this->listRepository->findBy(array('id' => $id))->fetch();

Moc děkuji za radu.

Editoval Zerig (8. 4. 2013 16:17)