Prenos údajov medzi komponentami

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

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
+
0
-

Já bych to udělal všechno jako závislosti.

  1. Ten formulář bych si generoval v té komponentě listControl. Tam bys to měl potom jednoduchý předávat si ty data.
  2. Druhou možností by bylo předat si FiltrControl a nad nim volat něco jako getData().
  3. 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 presenteru getData() a do té komponenty listControl už potom poslat jen ty data. Na druhou stranu, tahle možnost jako jediná nevytváří závislost listControl na filterControl, ale jen na nějakých datech.
greno
Člen | 10
+
0
-

Ďakujem za odpoveď :)

  1. 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?
  2. Ako by som si predával FilterControl? Toto si neviem predstaviť.
  3. 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
+
+6
-

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
+
0
-

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?

greno
Člen | 10
+
0
-

Tak, vyzerá to, že som to vyriešil :)

Funguje mi totok:

<?php
$this->parent['list']->updateFilterCriteria($values);
?>
Felix
Nette Core | 1245
+
+3
-

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.