Vykreslitelná komponenta jako služba nepřijímá parametry signálu

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

nette 2.0.10

Vytvořil jsem komponentu Basket .. nechci se starat o předávání parametrů, vytvářím ji tedy přes config.

konstruktor komponenty:

<?php
class Basket extends Control {
..
    public function __construct(Nette\Http\Session $session, ModelLoader $modelLoader,\Oggy\Helpers $helpers) {
        parent::__construct();
 	....
    }

}
?>

config:

<?php
  services:
	basket: Basket
?>

BasePresenter:

<?php
abstract class BasePresenter extends \BasePresenter {

    /* @var \Basket */
    private $basket;

    //inject sluzby
    public function injectBasket(\Basket $basket)
    {
        $this->basket = $basket;
    }

    //tovarnicka
    protected function createComponentBasket() {

        return $this->basket;
    }
?>

bohužel signál komponenty nepřijímá parametry:

<?php
public function handleMetoda($moje_id) {
   \Nette\Diagnostics\Debugger::barDump($moje_id);
}
?>

$moje_id je NULL

Problém bývá, že komponenta není připojena k rodiči. Přímo v komponentě používám $this->presenter->user, pokud si celou komponentu dumpnu, v handle metodě, vidím, že připojena je.

Otázky kolem DI, inject, atd .. je plné fórum, hledal jsem, ale na podobný problém jsem nenarazil. Většinou je problém v nevolání konstruktoru předka.

Možná jsem celý princip pojmul špatně.

PavelJurasek
Člen | 39
+
0
-

Pošli i odkaz, kterým ten signál posíláš

mkoubik
Člen | 728
+
0
-

Rozhodně by bylo lepší si na tu komponentu udělat factory a tu předávat do presenteru. Instanci komponenty pak vytvářej až v createComponentBasket. Problém bude ale asi někde jinde.

Oggy
Člen | 306
+
0
-

PavelJurasek napsal(a):

Pošli i odkaz, kterým ten signál posíláš

Tak odkaz dělám přes nette.ajax ..ale je klasický link
v template kompenenty

<script type="text/javascript">

        function chooseShipMethod(shipmethod_id) {
            $.nette.ajax({
                url: {link chooseShipMethod!},
                data: {"shipmethod_id": shipmethod_id},
                type: 'get'
            });
        }

</script>

url linku
…?do=basket-chooseShipMethod&shipmethod_id=1

Editoval Oggy (4. 4. 2013 12:26)

David Matějka
Moderator | 6445
+
0
-

ten parametr ma totiz byt basket-shipmethod_id=1, aby tam nemusel davat nazev komponenty na tvrdo, muzes pouzit getUniqueId

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Přesně tak, komponenta je napsaná správně. Pro hlubší pochopení – klíčové je tam to volání parent::__construct(), ale to je důležité kvůli tomu, že se v tom předkovi volá $this->monitor('Nette\Application\UI\Presenter'). Právě tohle volání je zddpovědné za načtení parametrů do komponenty. Jak říkám, ty to máš správně, jde jen o ten název parametru v odkazu :).

Oggy
Člen | 306
+
0
-

Super. děkuji..
Jasně, konstruktor rodiče jsem kontroloval hned, to bývá taková nejčastější příčina.