Grido se z ajaxu neinvaliduje

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

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)

cubic
Člen | 45
+
0
-

Ten snippet tableControl je tu zbytečný, musí být uvnitř té komponenty administratorsGrid. A pak v presenteru zavoláš jenom:

$this['administratorsGrid']->redrawControl(); // = dříve invalidateControl();
Vanamas
Člen | 20
+
0
-

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

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

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

a nemas „id“ parametr uz v route? masku routy tedy nejak <presenter>/<action>/<id>?

Vanamas
Člen | 20
+
0
-

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

> tohle řve, že nenašel ten snippet
ne, to rve, ze neexistuje ta komponenta – ta se totiz jmenuje administrationGrid

mas 2 moznosti:

  1. snippet pridas dovnitr komponenty (tedy obalis vnitrek sablony komponenty snippetem)

a pak zavolas $this['administrationGrid']->redrawControl()

  1. 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'});
Vanamas
Člen | 20
+
0
-

Aha, tak to bylo tím, že jsem to nevolal přes ten nette.ajax. Už to chodí.

Navíc funguje

$this['administratorsGrid']->redrawControl();

Díky!

Editoval Vanamas (8. 10. 2014 13:40)