Komponenta nenalezena

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

Ahoj, používám vlastní komponentu Datagrid. První zobrazení proběhne bezvadně, při volání nějaké akce se ale komponentu nepodaří nalézt. V presenteru mám takovýto kód:

$dataGrid = new DataGrid;
$dataGrid->bindDataTable(new ContactsDatasource());
$this->addComponent($dataGrid, 'dg');

V šabloně mám:

{control dg:paginator}
{control dg:grid}

No a chyba, kterou to píše je:

BadSignalException #403

The signal receiver component 'dg' is not found.

Ale zajímavé je že stacktrace je:

  • Application/Presenter.php (206) source ► Presenter→ processSignal ()
  • Application/Application.php (156) source ► Presenter→ run ()
  • app/bootstrap.php (37) source ► Application→ run ()
  • mailer_public/index.php (19) source ► require (arguments ►)

Takže to vůbec nešlo tím prezenterem, takže ji ani znát nemůže.

Nevíte na co jsem zapomněl?

Panda
Člen | 569
+
0
-

Nevytváříš náhodou tu komponentu v metodě render<action>()? Ta se totiž v životním cyklu presenteru volá až po zpracování signálů, takže pokud by jsi komponentě poslal signál, tak by to skončilo zmíněnou chybou.

Řešením by bylo přesunout definici komponenty do metody action<action>(), nebo použít továrničku:

class MyPresenter
{
	// ...

	protected function createComponentDg()
	{
		$dataGrid = new DataGrid;
		$dataGrid->bindDataTable(new ContactsDatasource());
		return $dataGrid;
	}

	// ...
}

Tato funkce se postará o vytvoření komponenty v momentě, kdy je potřeba – například před renderováním nebo zpracováním signálu.

//Doplnění: První! :P

Editoval Panda (27. 8. 2009 13:08)

jasir
Člen | 746
+
0
-

Použij na vytvoření datagridu továrničku, hledej zde na fóru.

<?php
protected function createComponentDg() {
       $dataGrid = new DataGrid;
       $dataGrid->bindDataTable(new ContactsDatasource());
       return $dataGrid;
?>

Btw, tahle evergreenová chyba je kandidát na zařazení do seznamu odkazovaných výjímek

Edit: pozdě… ;-)

Editoval jasir (27. 8. 2009 13:07)

Ondřej Brejla
Člen | 746
+
0
-

Používáš továrničku, nebo jak ji vytváříš?

//EDIT: Sakra, 3 posty během minuty…pěkné…:-D

Editoval Warden (27. 8. 2009 13:07)

tr.
Člen | 79
+
0
-

Pando, Jasire, Wardene, děkuji za trojpomoc. Přesunul jsem do prepareNECO() a funguje bezvadne.

Doporucuji pripojit info o zivotnim cyklu komponenty na stranku. https://doc.nette.org/cs/quickstart

Tak tedy dekuji pekne a ahoj.

T.

jasir
Člen | 746
+
0
-

Já ti to prepare<View> nedoporučuji, zkus jít moderní cestou továrniček

Ondřej Brejla
Člen | 746
+
0
-

Metody prepare<View> jsou zavržené, viz tento topic. Takže opět doporučuji použití továrniček, viz návod v tom samém topicu.

//EDIT: a zas pozdě…:)

Editoval Warden (28. 8. 2009 10:53)