Pohřešovaný parametr handle ve vizuální komponentě
- VojtaSim
- Člen | 55
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
- Nepřepsal jsi konstruktor? Pokud jo, voláš
předka?
parent::__construct()
- Jak registruješ komponentu?
- 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
pave.kucera napsal(a):
- 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');
...
- 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;
}
- 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
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
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
:-) 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()).