Prenos údajov medzi komponentami
- greno
- Člen | 10
Zdravím,
som v Nette nový a momentálne riešim problém, akoby som mohol preniesť údaje z jednej komponenty do druhej.
Ak si spravím v template takúto situáciu:
{control filterControl}
{control listControl}
kde vo filterControl mám formulár, ktorý mi zbiera údaje a v listControl sa zase zobrazujú údaje na základe formuláru z filterControl.
Možno je to jednoduché, ale ako urobím to, že keď odošlem formulár vo filterControl, tak sa mi to dostane aj do listControl? A keby som chcel posielať údaje napr. z listControl ešte do nejakej inej komponenty, ako by sa to dalo spraviť?
Vopred ďakujem za odpoveď
- Oli
- Člen | 1215
Já bych to udělal všechno jako závislosti.
- Ten formulář bych si generoval v té komponentě
listControl
. Tam bys to měl potom jednoduchý předávat si ty data. - Druhou možností by bylo předat si
FiltrControl
a nad nim volat něco jakogetData()
. - Poslední možnost, která se mě líbí nejmíň, protože si nejsem
jistej, jeslti dokážeš zaručit aby se
filterControl
spustil vzdycky driv je, předat si do presenterugetData()
a do té komponentylistControl
už potom poslat jen ty data. Na druhou stranu, tahle možnost jako jediná nevytváří závislostlistControl
nafilterControl
, ale jen na nějakých datech.
- greno
- Člen | 10
Ďakujem za odpoveď :)
- To už potom ale stratím zase prístup z filterControl prístup do presenteru (resp. toho najvrchnejšieho control-u). Nebolo by potom jednoduchšie to vyrobiť ako jeden control?
- Ako by som si predával FilterControl? Toto si neviem predstaviť.
- To je pravda, nedá sa to zaručiť, nakoľko ak to má byť „znovu použiteľné“ tak sa to môže zrazu ocitnúť niekde inde a potom môže byť problém.
- Vojtěch Dobeš
- Gold Partner | 1316
Využil bych událostí a pomocí nich by vyjádřil závislost.
protected function createComponentFilterControl()
{
$form = new Nette\Application\UI\Form();
// ...
$form->onSuccess[] = function ($form, array $values) {
$this['listControl']->updateFilterCriteria($values);
};
// ...
return $form;
}
protected function createComponentListControl()
{
return new ListControl();
}
class ListControl extends Nette\Application\UI\Control
{
private $filterCriteria = [];
public function updateFilterCriteria(array $filterCriteria)
{
$this->filterCriteria = $filterCriteria;
}
public function render()
{
$data = $this->model->getData($filterCriteria);
// ...
$this->template->render();
}
}
- greno
- Člen | 10
Táto možnosť vyzerá sľubne, až na to, že mi nefunguje, neviem či tam mám ja nejakú chybu:
<?php
class ListControl extends BaseControl {
private $filterCriteria;
public function render() {
var_dump($this->filterCriteria); //nevypise sa
$this->template->test = $this->filterCriteria;
parent::render();
}
public function updateFilterCriteria($values) {
var_dump($values); //vypise sa
$this->filterCriteria = $values;
}
}
class FilterControl extends BaseControl
{
public function createComponentFilterForm()
{
$form = new Form;
// .....
$form->onSuccess[] = $this->successFilterForm;
return $form;
}
public function successFilterForm(\Nette\Application\UI\Form $form) {
$values = $form->values;
$this['list']->updateFilterCriteria($values);
}
protected function createComponentListControl() {
return new ListControl();
}
}
?>
Ono mi to tú funkciu aj zavolá, avšak pri renderovaní toho listu, už tie dáta nemám, zdá sa, akoby to nebol ten istý objekt.
Neviete poradiť čo robím zle?
- Felix
- Nette Core | 1245
greno napsal(a):
Tak, vyzerá to, že som to vyriešil :)
Funguje mi totok:
<?php $this->parent['list']->updateFilterCriteria($values); ?>
Spravne by jsi tohle navesovani udalosti mel mit v nejakem predku (tzn. v presenteru nejspise). Tak to myslel i @VojtěchDobeš. Timhle zanasis prime zavislosi jedne komponenty na druhe, lepsi je to mit obecne prave diky tem eventum.