Ako spravne refreshnut snippet vo vnorenej komponente?

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

Ako spravne refreshnut snippet vo vnorenej komponente? Mam formular, v ktorom mam vnoreny dalsi formular:

function success($form)
{
    $model = new ArticleTypeModel($this->context);

    try {
        $data = $form->getValues();
        $model->saveType($data);
        $this->flashMessage($this->translator->translate('flash.record_was_saved'), 'success');
    } catch (\PDOException $e) {
        $this->flashMessage($this->translator->translate('flash.error_while_saving_record'), 'danger');
    }

    if ($this->presenter->isAjax()) {
			/*
			 * Teraz to funguje, ale ked komponent predam ako instanciu dalsiemu,
			 * potom by som mal urobit $this->parent->parent->...tolko krat, kolko krat
         * formular vnorim do ineho komponentu...->redrawControl('typeItem');
			 *
			 * Formular chcem vediet pouzit samostatne priamo v presemteri alebo moze byt n-krat
			 * vnoreny v inej komponente (potomkovi UI\Control)
			 */
        $this->parent->redrawControl('typeItem');
        $this->presenter->redrawControl('flashmessages');
    }
}

Editoval steelbull (1. 7. 2015 18:52)

Unlink
Člen | 298
+
0
-

Presne nechápem čo chceš, ale nešlo by to vyriešiť pomocou eventov?

a tam kde to potrebuješ si pridáš callback ktorý refreshne ten snippet.

steelbull
Člen | 241
+
0
-

Problem mam v tom, ze mam formular, ktory moze byt volany:
A – priamo z prezentera
B – z ineho formulara
C – z ineho formulara, ktory vola komponentu(napr. modal window) a tato komponenta vola spominany formular.

No a potom neviem, ako mam osetrit redrawControl(), ked jeho volanie zavisi od toho, ako je volany tento formular.

Editoval steelbull (1. 7. 2015 20:40)

Unlink
Člen | 298
+
0
-

Stále nechápem, a prekresliť potrebuješ ten formulár alebo iný snippet?

steelbull
Člen | 241
+
0
-

Napr. FORMULAR-A, ktory ma selectbox, vedla ktoreho mas tlacidlo Pridat a v modal okne sa Ti otvori FORMULAR-B pre zaranie udajov. Po ajaxovom submite refreshnem selectbox vo FORMULARI-A, aby sa tam ta nova polozka objavila.

No a FORMULAR-B pouzivam ako som pisal:
1 – priamo v prezenteri
2 – vo formulari A
C – vo formulari A, ktory vola komponentu(napr. modal window) a tato komponenta pouziva FORMULAR-B

Martk
Člen | 661
+
0
-

Odpovídám, jenom na toto: potom by som mal urobit $this->parent->parent->…tolko krat, kolko krat

Použij na to

$this->lookup('Nazev\Třídy\Které\Hledáš');
Unlink
Člen | 298
+
0
-

Ideálne by bolo ukázať kód, ako to používaš.

Lebo ak máš teraz niekde v tom formulári

$this->onSuccess[] = [$this, 'success']; //Zavolá tu metódu success čo si sem dal

Tak to tak isto môžeš potom použiť v presenteri, formulári alebo proste tam, kde tento tvoj formulár pripájaš pridať ďalší handler, ktorý spracuje to prekreslenie snippetu.

$form->onSuccess[] = [$this, 'formSuccessed'];

Imho lepšie by bolo asi na toto spraviť vlastný event, pretože principiálne je poradie spracovania negarantované a teoreticky by sa mohlo stať, že najskôr sa ti refreshne snippet a potom sa ti vložia tie údaje do db.

steelbull
Člen | 241
+
0
-

jj, mas pravdu, hovorime o riadku 308.

Example

Tiez by ma zaujimalo, ako by ste riesili riadok 286. Ale priorita je 308.

Dakujem a vazim si kazdu pripomienku.

Editoval steelbull (2. 7. 2015 10:01)

Unlink
Člen | 298
+
0
-

Takže do TypeFormFactory by som pridal (musí byť public a začínať na on)

public $onTypeSubmit;

v metode success by som namiesto celej časti s ajaxom dal len

$this->onTypeSubmit();

A nakoniec, v MainFormFactory by som si spravil metodu

protected function createTypeForm() {

	$form = new TypeFormFactory($this->translator, $this->context);
	//Callack po odoslaní type form
	$form->onTypeSubmit[] = function() {
		if ($this->presenter->isAjax()) {
			$this->redrawControl('typeItem'); //Teraz si na urovni tej main komponenty takže by malo stačiť toto
            $this->presenter->redrawControl('flashmessages');
        }
	});
	return $form;
}

a potom tam kde to potrebuješ (createComponentTypeForm a createComponentTypeFormModal) namiesto new … zavoláš

$this->createTypeForm();

Teda ten main form factory vytvorí aj ten type form, naviaže naňho callback, a potom ho buď vykreslí on, alebo ho dá tej modal komponente, ale to mu je úplne jedno, lebo keď sa ten formulár odošle, vykoná čo potrebuje a potom zavolá ten callback definovaný v main form factory.


No a ďalej, čo sa týka toho kódu, Context $context by sa nemal takto priamo používať, ale injectovať by si si mal len to čo potrebuješ.
V tvojom prípade je to ten Model\TypesModel a Model\XXXModel ktoré by nemal vytvárať ručne, ale získať ich pomocou DI.

$form->method = 'post'; myslím netreba, form je by default post.

Editoval Unlink (2. 7. 2015 10:46)