životní cyklus presenteru, přepsání obsahu komponenty

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

Ahoj,

pravděpodobně jsem se nějak zamotal do životního cyklu presenteru spolu s komponentou a nevím jak z toho ven.

Mám komponentu Uploader, která vykreslí nějaký drag&drop box, po uploadu souboru se v komponentě zavolá metoda handleUpload(), která vytvoří Utils\Image objekt a poté zavolá callable[] onUpload($file) v presenteru si tedy obrázek vezmu a uložím do db atd..

Další metoda komponenty je addFile($id,$thumb) která přidá do pole $files[] obrázek a tohle pole poté v render() odesílám do template v komponentě

presenteru při vytváření komponenty createComponentUploader() přidám obrázky pomocí addFile(), zatím je vše ok.

Další metoda je handleRemove(), která zavolá callable[] onRemove($id) a poté v presenteru odstraním podle ID.

V presenteru, tedy odstraním ten obrázek z db a zavolám $this->redrawControl() ZDE nastává problém. Porotože nejprve se provede createComponent() a až poté se zavolá onRemove()

Zkoušel jsem plnit ten uploader i jinde než při vytváření komponenty, ale vždy byl výsledek stejný.

Editoval kleinpetr (24. 11. 2015 15:18)

David Matějka
Moderator | 6445
+
0
-

A kde je problem? ze ten smazany soubor si jiz pridal pres addFile? tak ho v komponente odeber. anebo jestli ty addFile jsou jen pro vykresleni, tak to volej v render* metode

kleinpetr
Člen | 480
+
0
-

No problém je v tom, že po zavolání handleRemove() se soubor smaže, ale neaktualizuje se mi ten seznam souborů, které jsou jak píšeš jen pro vykreslení.

v Presenteru mám metodu actionDetail($id) a když jsem zkoušel naplnit ten uploader v ní, tak byl výsledek stejný. Podle cyklu presenteru to dává smysl, že se nejdřív načte actionMetoda a až poté handle<Signal> ale i to funguje dost zvláštně, protože jsem zkoušel ověřovat, tak, že jsem vyzkoušel např. při výpisu nějakých dat, kde po smazání řádku také volám handleRemove() a vše funguje tak jsem zkusil renderList() , ve které předávám data, přepsat na actionList() ale i tak to stále funguje dobře. Takže jsem z toho trochu zmatenej

Editoval kleinpetr (24. 11. 2015 15:34)

kleinpetr
Člen | 480
+
0
-

Teď mě ještě napadlo volat z komponenty místo callable[] metod normálně třeba `$this->presenter->uploadFile($file) `, která mi bude vracet jestli presenter zpracoval soubor správně, a poté řešit to překreslování pouze v té komponentě

David Matějka
Moderator | 6445
+
0
-

A kde je problem s tim, co jsem psal? tedy bud

  • v handleRemove smazat z tech souboru ulozenych v komponente s tim id
  • nebo nastavit soubory az v renderList, ktere se vola po handleRemove
kleinpetr
Člen | 480
+
0
-

Jojo, s tím smazáním v komponentě je dobré, akorát nevím jestli může callable[] metoda něco vracet, protože když se v presenteru stane nějaký problém, tak samozřejmě nebudu chtít smazat ten soubor v komponentě.

K tomu druhýmu, tam je problém, že to používám na detailu a to je actionDetail() takže se také volá před handleRemove()

David Matějka
Moderator | 6445
+
0
-

jestli může callable[] metoda něco vracet, protože když se v presenteru stane nějaký problém, tak samozřejmě nebudu chtít smazat ten soubor v komponentě.

obvykle nic nevraci, mohl bys vyuzit vyjimku, pripadne volej removeItem z toho callbacku

K tomu druhýmu, tam je problém, že to používám na detailu a to je actionDetail()

tak tam pridej i renderDetail, ne?

kleinpetr
Člen | 480
+
0
-

:-O tak to jsem nevěděl, že můžu použít jak action tak zároveň i render. Už to šlape ! Díky

jen pro zajímavost se zeptám. Jak je možné že v tomhle případě se action zavolá až po handle ?

public function actionList(){
	$this->template->rows = $this->dbModel->findAll();
}

public function handleRemove($id){
	$this->dbModel->find($id)->delete();

	$this->redrawControl();
}

Je to tím, že $this->template = ... se volá až při renderu ?

David Matějka
Moderator | 6445
+
0
-

ne, action se vzdy vola pred handle

kleinpetr
Člen | 480
+
0
-

Tak jak je možné, že když zavolám v tomhle případě remove! $id tak se správně zaktualizuje ?

F.Vesely
Člen | 368
+
+2
-

Protoze ten dotaz do db se polozi az pri vypisovani polozek v template.

kleinpetr
Člen | 480
+
0
-

Díky za vysvětlení :)