null parametry při volání signálu ajaxem

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

ahoj všem.
vím, že se to už řešilo tady https://forum.nette.org/cs/1367-ajax-signalu-controlu-se-nepreda-parametr, ale je to uzavřený, tak jsem to nemohl postnout tam.

Mám podobný problém.
Je definovaná komponenta:

<?php
class EditDataGrid extends Nette\Application\Control {
    private $driver;
    private $table;
    public function __construct($driver){
        parent::__construct();
        $this->driver=$driver;
    }
	public function Render($table,$tableId) {
		$template = $this->template;
		$template->setFile(dirname(__FILE__) . '/templates/EditDataGrid.phtml');
                $template->table=$this->driver->getTable($table);
                $template->tableId=$tableId;
                $template->tableName=$table;
		$template->render();

	}
        public function handleSaveValue($table,$row,$col,$index,$value){
            $response=$this->getParam();
            $this->presenter->terminate(new \Nette\Application\JsonResponse($response));
        }
}?>
ta má továrnu
<?php
    public function createComponentEditDataGrid(){
        $tmp=new EditDataGrid($this->data);
        return $tmp;
    }
?>

a volá se to ze šablony:

{widget editDataGrid "es_planets","id"}

všechno šlape, signál se zavolá ve tvaru:
http://localhost/document_root/admin/?col=type&row=1&table=es_planets&index=id&do=editDataGrid-saveValue&value=1
nechodilo mi to, tak jsem si přidal řádku $response=$this->getParam() a to vracím přes payload.
No a vypíše mi to [].
Netušíte kde by mohl být problém pls?

bazo
Člen | 620
+
0
-

podla mna ti chyba zavinac pred {widget}. predpokladam, ze sablona komponenty obsahuje snippet(y)

Ondřej Mirtes
Člen | 1536
+
0
-

Přepisuješ konstruktor, což bys neměl.

Etch
Člen | 403
+
0
-

To by nemělo vadit pokud volá

parent::__construct();

ale pro jistotu zkus vyseparovat

	$this->driver=$driver;

do jiné metody. Něco jako

<?php
class EditDataGrid extends Nette\Application\Control {
    private $driver;
    private $table;
    public function setDriver($driver){
        $this->driver=$driver;
    }
        public function Render($table,$tableId) {
                $template = $this->template;
                $template->setFile(dirname(__FILE__) . '/templates/EditDataGrid.phtml');
                $template->table=$this->driver->getTable($table);
                $template->tableId=$tableId;
                $template->tableName=$table;
                $template->render();

        }
        public function handleSaveValue($table,$row,$col,$index,$value){
            $response=$this->getParam();
            $this->presenter->terminate(new \Nette\Application\JsonResponse($response));
        }
}?>

a pak v továrně

<?php
    public function createComponentEditDataGrid(){
        $tmp=new EditDataGrid();
	$tmp->setDriver($this->data)
        return $tmp;
    }
?>
Ondřej Mirtes
Člen | 1536
+
0
-

Vadí to, protože v tom konstruktoru se nepřipojuje k rodiči. Myslím, že to bude příčina toho problému.

Rampa
Člen | 65
+
0
-

tak jsem prostudoval \Nette\Aplication\PresenterComponent.php a předělal konstruktor:

<?php
    public function __construct($parent,$name,$driver){
        parent::__construct($parent,$name);
        $this->driver=$driver;
    }
?>

a tovarnu:

<?php
    public function createComponentEditDataGrid(){
        $tmp=new EditDataGrid($this,'editDataGrid',$this->data);
        return $tmp;
    }
?>

a nepomohlo. Parametry pořád null :(

//edit
jo jestě jsem zapoměl uvest. Zkoušim pro 5.3 a snipety na te stránce nepoužívám.

P.S.: koukám, že se objevil nový post se stejným problémem. Možná bug v dev verzi.

//edit2
dělá to i ve verzi 0.9… stable

Editoval Rampa (26. 3. 2010 22:13)

Mikulas Dite
Člen | 756
+
0
-

Jak psal Ondra, pořád se snažíš přepisovat konstruktor. Nedělej to, místo toho si vytvoř nějakou metodu která to nastaví místo toho.

Rampa
Člen | 65
+
0
-

Mikulas Dite napsal(a):

Jak psal Ondra, pořád se snažíš přepisovat konstruktor. Nedělej to, místo toho si vytvoř nějakou metodu která to nastaví místo toho.

ok. vyhodil jsem konstruktor a dodělal seter na driver jak to tu psal Etch. Výsled pořád stejný.

Rampa
Člen | 65
+
0
-

no, dospěl jsem k názoru, že brát FW jako černou skřínku, do který zadám něco a něco vypadne prostě nestačí.
Takže jsem se podíval pořádně pod pokličku a do těď se tomu hrabal ve střevech.
No a úspěch se dostavil :)
Možná jsem došel k blbýmu záveru, ale přijde mi, že po vztvoření komponenty se neinicializuje její stav.
Takže jsem v Presenter.php upravil metodu processSignal a těsně před voláním signálu
$component->signalReceived($this->signal);
doplnil řádek
$component->loadState($this->params);.
No a ono se to zázračně rozjelo.
Možná to není čisté řešení, ale chodí to. :D

//edit
voláním konsruktoru parent::__construct() by se nemělo nic zkazit, protože ComponentContainer s tím počítá a doplňuje si sám.
PresenterComponent (předek komponenty) je dokonce definován na default null:
 public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL)

Editoval Rampa (27. 3. 2010 0:57)