Problem s predavanim params do handle<signal> v komponente

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

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)

phx
Člen | 651
+
0
-

Je v URL neco jako slug=NECO ? Pokud ne tak v odkazu asi neexistuje $event->slug nebo je NULL.

misiak
Člen | 28
+
0
-

V URL mám to takto:

http://localhost/kostol/www/?eventViewer-slug=skusobny-event&do=eventViewer-edit

Myslím, že takto je to správne nakoľko to odosielam do komponenty alebo sa mýlim?

Editoval misiak (18. 10. 2010 11:09)

Jan Tvrdík
Nette guru | 2595
+
0
-

Spíš si dumpni přímo $this->params.

misiak
Člen | 28
+
0
-

to som tiež skúšal ale vyhodilo mi to Array(0). Proste ako by sa to do tej koponenty už nedostalo.

Editoval misiak (18. 10. 2010 17:29)

misiak
Člen | 28
+
0
-

Nikto nemal podobný problém? Btw nové snippety funguju rovnako ako staré ale už netreba @ ?

Gringo
Člen | 32
+
0
-

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)

Gringo
Člen | 32
+
0
-

Rychlý workaround:

<?php
public function handleUnlike($post)
{
	if(!$post) $post = $this->presenter->request->params[$this->name . '-post'];

	...
}
?>
misiak
Člen | 28
+
0
-

No ten workaround som si spravil tiež ale nepáči sa mi to riešenie nakoľko by to malo fungovať nativne.

Milanov
Člen | 51
+
0
-

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)

pepakriz
Člen | 246
+
0
-

Zdravím,
střílím od boku. Jak vytváříš komponentu? Předáváš konstruktoru správné parametry?

$c = new Komponenta($this, "jmeno_instance");
phx
Člen | 651
+
0
-

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
+
0
-

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
+
0
-

Hlavne to musis nejak spojit s presenterem!!!

Mas tyto moznosti

  1. v konstruktoru predas jmeno + presenter → nemuzes prepisovat konstruktor
  2. zavolas na presenteru metodu addComponent s komponentou a nazvem

Viz napr zde: https://doc.nette.org/…n/presenters#…

Gringo
Člen | 32
+
0
-

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)

phx
Člen | 651
+
0
-

Nejsem si jist, zda se pripoji sama. Ja pokazde a) nebo b) delam.

misiak
Člen | 28
+
0
-

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
+
0
-

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)

misiak
Člen | 28
+
0
-

a konštruktor máš spravený podobne ako ja?

Nette mám zo včera z git repozitára stiahnute.

misiak
Člen | 28
+
0
-

Ok nesprávne som mal deklarovaý konštruktor a nevolal som parent::__construct($parent, $name);