Grido se z ajaxu neinvaliduje
- Vanamas
- Člen | 20
Zdravím,
nevím co dělám špatně, ale z nějakého důvodu se mi nedaří invalidovat
Grido komponentu z ajaxu.
V latte mám
{snippet tableControl}
{control administratorsGrid}
{/snippet}
a v presenteru
<?php
public function actionAdd($id)
{
if ($this->isAjax()) {
$this->database->table(Table::TABLE_ADMIN)->insert(array("ID_admin" => 1, "ID_user" => $id));
$this->invalidateControl("tableControl");
}
$this->terminate();
}
?>
Ajaxově se přidá položka do DB (tohle určitě funguje) a pak by se to mělo invalidovat, ale bohužel se nic neděje.
Kde mám chybu?
Editoval Vanamas (8. 10. 2014 13:03)
- Vanamas
- Člen | 20
Děkuji za odpověď. Teď mám tedy jiný problém …
Jak ten snippet dostat do té komponenty? Zkoušel jsem hledat, ale na nic
jsem nenarazil. Ta komponenta má přímo metodu redrawControl($name), ale
v té metodě, kde bych to chtěl zavolat, není grido inicializovaný. Má
taky metodu getSnippetId() což bez názvu vypíše
„snippet-administratorsGrid-“ s názvem přidá název za pomlčku. Když
dám redrawControl s těmito snippet ids, tak to hlásí chybu, že tenhle
snippet nenašel.
Jediné co neřve je to co jsi psal ty
($this[‚administratorsGrid‘]->redrawControl();), ale nic se
nezmění.
- David Matějka
- Moderator | 6445
Kde mám chybu?
mas tam
$this->terminate();
coz ukonci beh presenteru
a mimochodem, na upravy (jak stavu aplikace tak dat) jsou vhodnejsi signaly, nez akce (ty reprezentuji urcity stav)
@cubic muze to byt i tak, jak pise @Vanamas , proste snippetem obalis komponentu…
- Vanamas
- Člen | 20
Když tam nebudu mít terminate, tak to po mě chce add.latte.
Chápu, že když to předělám na signál, tak to potom asi už řvát nebude, ale nějak se mi nedaří vytvořit odkaz z javascriptu pro signal. Javascriptu to musí být, protože se ty odkazy tvoří z našeptávače.
Když do odkazu dám něco jako ?do=add&id=123, tak to id na konci odmazává. Tím pádem nezískám id.
Poradíš jak na to?
- David Matějka
- Moderator | 6445
a nemas „id“ parametr uz v route? masku routy tedy nejak
<presenter>/<action>/<id>
?
- Vanamas
- Člen | 20
Aha, to mě nenapadlo, že to je rezervovaný. Když to změním, funguje to.
Předěláno tedy na signál a metoda actionAdd přejmenována na handleAdd. Smazal jsem terminate, ale stále se to nerefreshuje.
$this['tableControl']->redrawControl(); // tohle řve, že nenašel ten snippet
$this->invalidateControl("tableControl"); // tohle projde, ale nic se nestane
- David Matějka
- Moderator | 6445
> tohle řve, že nenašel ten snippet
ne, to rve, ze neexistuje ta komponenta – ta se totiz
jmenuje administrationGrid
mas 2 moznosti:
- snippet pridas dovnitr komponenty (tedy obalis vnitrek sablony komponenty snippetem)
a pak zavolas
$this['administrationGrid']->redrawControl()
- jak to delas ted, obalis vykreslovani komponenty snippetem a zavolas
$this->redrawControl('tableControl')
(invalidateControl je deprecated nazev, ale zatim bude taky fungovat)
to, ze se to nerefreshne, bude spis problem v prohlizeci. Co pouzivas na zpracovani tech snippetu? doporucuji nette.ajax.js
a pri volani toho ajax pozadavku je nutne, aby to slo pres tenhle nette.ajax.js, konkretne pomoci
$.nette.ajax(tady jsou stejne (podobne) parametry jako pro $.ajax z jquery)
//tedy treba
$.nette.ajax({url: 'foo/bar?id=1'});