null parametry při volání signálu ajaxem
- Rampa
- Člen | 65
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?
- Etch
- Člen | 403
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
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
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
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
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)