invalidace všech komponent

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

Ahoj, nevím jak to přesně popsat.

Mám komponentu

class DataGrid extends Control {...}

v presenteru si pak vytvořím:

        public function createComponentOrders(){
            return new \MyComponents\DataGrid($this->context->database);
        }

        public function createComponentStornoOrders(){
            return new \MyComponents\DataGrid($this->context->database);
        }

první datagrid zobrazí objednávky bez stornovaných, druhý zobrazý pouze stornované

a teď když změním pomocí selectboxu (ajaxově) stav na storno, tak se mi podaří invalidovat order, ale už nevím, jak invalidovat i stornoOrders

Editoval Paradiso (8. 5. 2013 16:58)

Šaman
Člen | 2668
+
0
-

Pokud jsi v komponentě, tak budeš muset přes $this->presenter->invalidateControl('StornoOrders').

Editoval Šaman (8. 5. 2013 18:19)

Paradiso
Člen | 101
+
0
-

ano jsem v komponentě

to mi hlásí Call to a member function invalidateControl() on a non-object

Vždy jsem se do presenteru dostával $this->getPresenter(). To sice nehodí error, ale stejně se nic nestane.

Editoval Paradiso (8. 5. 2013 18:49)

thunderbuff
Člen | 164
+
0
-

$this->presenter a $this->getPresenter() vrací to samé, ale jde to použít až v momentě, kdy je komponenta připojená do stromu komponent. Tedy ne v konstruktoru, ale až v nějaké metodě volané během životního cyklu komponenty. Pokud se ti stornoOrders nedaří invalidovat, zkus se podívat, co ti vrátí response z ajaxového requestu.

//EDIT: názvy snippetů jsou case sensitive, takže $this->presenter->invalidateControl(‚StornoOrders‘) není to samé, co $this->presenter->invalidateControl(‚stornoOrders‘), pozor na to

Editoval thunderbuff (8. 5. 2013 22:06)

Paradiso
Člen | 101
+
0
-

Nevím, jestli jsem to dobře popsal, tak to zkusím raději ještě trošku přiblížit

v šabloně DataGrid mám:

{snippet table}
tabulka
{/snippet}

komponenta invaliduje snippet takto:

class DataGrid extends Control {
....
    public function handleEditableSelect($id, $val){
	....
        $this->invalidateControl('table');
	....
    }
...
}

a v presenteru mám

public function createComponentOrders(){
    return new \MyComponents\DataGrid($this->context->database);
}

public function createComponentStornoOrders(){
    return new \MyComponents\DataGrid($this->context->database);
}

v šabloně v presenteru pak jen {control orders}{control stronoOrders}

Když udělám akci nad Orders, tak se zavolá ..?do=orders-editableSelect&…
takže se zavolá správně pouze handle pro Orders

pokud nastavím $this->getPresenter()->invalidateControl(‚table‘); tak se nestane nic ani s aktuální komponentou, pokud $this->invalidateControl(‚table‘); tak se invaliduje, alespoň ta aktuální

peter.z
Člen | 37
+
0
-

Pokial chces invalidovat control, musis pouzit nieco taketo:
$this->presenter['komponenta']->invalidateControl()

To tvoje riesenie invaliduje len snippet a nie komponentu :)