Ako spravne refreshnut snippet vo vnorenej komponente?
- steelbull
- Člen | 241
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)
- steelbull
- Člen | 241
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)
- steelbull
- Člen | 241
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
- Unlink
- Člen | 298
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.
- Unlink
- Člen | 298
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)