Pohřešovaný parametr handle ve vizuální komponentě

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

V návaznosti na: https://forum.nette.org/…e-neziska-id

Zdravím,
narazil jsem na chybu, kde handler umístěný v komponentě neobdrží parametr ajaxovým ani non-ajaxovým voláním. Při bližším zkoumání call stacku jsem zjistil že parametr se vytrácí někde v okolí Nette\Application\UI\PresenterComponent->tryCall() kde je $params | array(0) a místo něj dojde jen NULL.
Možnost že dochází k záměně id pro prezenter a imageBrowser-id pro komponentu jsem odzkoušel změnou na imageBrowser-fileId a furt to samé.
Požadavek je routovaný normálně a všechny parametry projdou i s názvem komponenty v prefixu viz. routovací tabulka http://i.imgur.com/pXA7VTi.png

Laděnka: zde
Verze Nette: 2.0.11

// dotyčný handler
public function handleChangeFolder($id)
{
	$this->snippetMode = TRUE;

	try {
		$folderInfo = $this->media->changeFolder($id);
		$this->fileSystem->trace[] = $this->fileSystem->folder_id = $folderInfo->id;
		$this->fileSystem->parent_id = $folderInfo->parent_id;

		$this->invalidateControl('mediaBrowser');
	} catch (Nette\Application\ApplicationException $e) {
		$this->presenter->flashMessage($this->translator->translate($e->getMessage()), 'error');
		$this->presenter->invalidateControl('flashMessages');
	}

	if (!$this->presenter->isAjax())
		$this->redirect('this');
}
<!-- Volání handleru, btw. nepomáhá ani {link changeFolder! $item->id} -->
<a n:href="changeFolder! $item->id" class="thumbnail">
	<i class="icon-40 folder"></i>
	<span>{$item->name}</span>
</a>
pave.kucera
Člen | 122
+
0
-
  1. Nepřepsal jsi konstruktor? Pokud jo, voláš předka? parent::__construct()
  2. Jak registruješ komponentu?
  3. Zkus teda přejmenovat parametr $folderId na něco jiného

Máš obří plus za dodání Laděnky a verze Nette.

VojtaSim
Člen | 55
+
0
-

pave.kucera napsal(a):

  1. Nepřepsal jsi konstruktor? Pokud jo, voláš předka? parent::__construct()

Volám parent::__construct();

public function __construct($name, Media $media, $mode = self::SINGLE, $accept = self::ALL)
{
	parent::__construct();
	$this->monitor('Nette\Application\UI\Presenter');
	...
  1. Jak registruješ komponentu?
protected function createComponentImageBrowser()
{
	$browser = new \Media\Browser('ImageBrowser', $this->context->media, \Media\Browser::SINGLE, \Media\Browser::IMAGES);
	$browser->setTranslator($this->translator);

	$browser->onSelect[] = function($url) {
		// do something
	}

	return $browser;
}
  1. Zkus teda přejmenovat parametr $folderId na něco jiného

Zkoušel jsem ten parametr přejmenovat na $sdasfads (úplný nesmysl) a ani to nepomohlo, + navíc jsem objevil že ani jiné handlery v komponentě nefungují a to jsou volány ajaxovým $.get(). Provede se handler ale nedoručí se parametr.
Zkusím stáhnou jiné komponenty z Addons a uvidím jestli je to nette nebo jen dané komponenta.

VojtaSim
Člen | 55
+
0
-

Otestoval funkčnost na komponentě EventCalendar a vše funguje správně. Takže se vyloučil problém v Nette a Prezenteru. Takže asi překopu celou komponentu v naději že to bude fungovat.

VojtaSim
Člen | 55
+
0
-

Got it!

při volání monitor v konstruktoru jsem měl monitorování prezenteru:

$this->monitor('Nette\Application\UI\Presenter');

a potom v samotné funkci attached jsem zapomenul na parent::attached();

protected function attached($presenter)
{
	if ($presenter instanceof UI\Presenter) {
		...
	}

	parent::attached($presenter);
}
pave.kucera
Člen | 122
+
0
-

:-) pokud dědíš od Nette\Application\UI\Control, presenter je monitorovaný automatický, tzn. attached se při připojení k presenteru volá vždy (nemusíš volat $this->monitor()).