Problem s predavanim params do handle<signal> v komponente
- misiak
- Člen | 28
Zdravím,
narazil som na jeden veľmi zvláštny problém. Mám svoju komponentu EventViewer. V nej mám deklarovaný handler pre signál napríklad:
<?php
class EventViewer extends Control
{
/* ... */
public function handleEdit($slug)
{
$event = $this->entityManager->getRepository('Models\Entities\Event')->findOneBySlug($slug);
/* ... */
}
}
?>
pre tento control mám šablónu v ktorej mám
<?php
<a href="{link edit!, $event->slug}">Edituj</a>
?>
Avšak, keď kliknem na tento link, tak mi vyskočí ladenka s exception z doctrine, že do findOneBySlug musim passnut parameter. Lenže tento parameter sa niekde v polovici spracovania stratil aspoň podľa toho čo som videl v Ladenke.
Každopádne keď v handleEdit() zavolám:
<?php
Debug::dump($this->getPresenter()->getRequest()->getParams());
?>
tak dostanem napríklad tento výpis:
<?php
array(6) {
"action" => "default" (7)
"id" => NULL
"filename" => NULL
"slug" => NULL
"eventViewer-slug" => "2010-10-17-19-40-haluz-novy-clanok-je-na-svete" (46)
"do" => "articleViewer-delete" (20)
}
?>
neviete kde je problém? Samozrejme to nefungovalo ani keď som v bootstrap.php z rout odstránil <slug> a jeho default hodnotu.
Editoval misiak (18. 10. 2010 11:17)
- Gringo
- Člen | 32
No právě jsem narazil na přesně tenhle problém a nevím co s tím…
Zkoušel jsem:
<?php
public function handleUnlike($post)
{
dump($this->presenter->getRequest()->getParams());
dump($this->presenter->getParam());
dump($this->getParam());
}
?>
S výstupem:
array(4) {
"action" => "default" (7)
"id" => NULL
"feed-post" => "7"
"do" => "feed-unlike" (11)
}
array(3) {
"action" => "default" (7)
"id" => NULL
"do" => "feed-unlike" (11)
}
array(0)
Někde se to ztratilo po cestě :(
Editoval Gringo (20. 10. 2010 12:01)
- Milanov
- Člen | 51
Mám podobný problém, ale ve fázi render v komponentě. Dostane úplně jiné ID, než signál. Říkal jsem si, jestli za to nemůže „špatně“ vytvořená šablona komponenty, která objekt $this = XXXControl v komponentě zamění za $this = XXXPresenter. Pokud jsem OT, tak se omlouvám.
EDIT: Budu nejspíš OT, výše uvedený problém je celkem jiný. Dotaz beru zpět.
Editoval Milanov (22. 10. 2010 22:19)
- phx
- Člen | 651
Jak se jmenuje komponenta?
Mas ten handler na komponente?
Ta carka za edit! je tam zbytecka – asi jen kosmetika:
<a href="{link edit! $event->slug}">Edituj</a>
Nemas nekde v prezenteru ci nekde v predkach perzistenti promenou $slug (premazaval by sis ji).
Mozna nekam dej cely kod.
- misiak
- Člen | 28
Zdravím,
nemám nikde perzistentne premenné, akurát niektore handlery v presenteroch majú tiež ako vstup $slug a tento mam aj v bootstrap.php deklarovaný v routach. Ale nepomohlo ani keď som to odtiaľ zmazal. Komponenta sa volá EventViewer… vytváram ju v presenteri ako:
<?php
$c = new EventViewer;
?>
EventViewer komponenta je tuto https://gist.github.com/641544 ale upozorňujem, je to len vývojová verzia nakoľko som sa veľmi s ňou kvôli tomu problému nepohol.
- phx
- Člen | 651
Hlavne to musis nejak spojit s presenterem!!!
Mas tyto moznosti
- v konstruktoru predas jmeno + presenter → nemuzes prepisovat konstruktor
- zavolas na presenteru metodu addComponent s komponentou a nazvem
Viz napr zde: https://doc.nette.org/…n/presenters#…
- Gringo
- Člen | 32
Já jsem komponentu vytvářel přes továrničku
createComponentXY() { $xy = new XY; return $xy; }
, ta by to měla
sama připojit k Presenteru ne?
Včera jsem upgradoval nette na 2.0-alpha ze dne 14. 10. 2010 (pozor na BC-break u třídy Template) a dneska to vypadá, že to začalo fungovat…
Editoval Gringo (23. 10. 2010 11:05)
- misiak
- Člen | 28
Ja funkciu vytváram takto:
<?php
protected function createComponentEventViewer()
{
$eventViewer = new EventViewer;
return $eventViewer;
}
?>
pozrel som sa na ten link od phx, cekol som aj zdrojáky iných komponent z Nette no nenašiel som žiaden rozdiel akurát som upravil konštruktor komponenty na:
<?php
public function __construct()
{
parent::__construct();
/* inicializacia */
}
?>
Ani v príklade fifteen nie je rozdiel v konštruktore a tam tie signály fungujú.
- Gringo
- Člen | 32
Juknul jsem do zdrojáku Nette (tuším to bylo v ComponentContainer.php), po zavolání createComponent() se zkoumá, jestli má vytvořená komponenta rodiče, když ne, tak se připojí k $this.
Jak už jsem psal, signály mi začaly fungovat (asi) po upgradu Nette.
Editoval Gringo (23. 10. 2010 12:05)