Ako predavat parametre do komponenty po odoslani formularu (filter)

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

Zdravim. Viem, ze na tuto temu tu uz nejake vlakna su, ale dost stare. Potreboval by som poradit ohladom komponent a dat ktore sa do nich dostavaju.

Takze mam filter (formular) a komponentu (js kniznica kendoui pre vykreslenie tabulky).

Teraz ku komponente v prezenteri mam:

protected function createComponentConsuptionHistoryListControl()
{
    return new DataGridControl();
}

v latte:

{control consuptionHistoryListControl}

dalej mam triedu DataGridControl.php v ktorej je __construct ktory ma parametre fields a data. (tuto triedu by som uz editovat nechcel pretoze na projekte maka viac ludi a uz to pouzivaju tak ako je)

Moja otazka znie, ako po odoslani formularu (form success) dostanem data s filtra do komponenty?

Editoval MarekR (18. 5. 2016 15:39)

Felix
Nette Core | 1247
+
+1
-

Nevim, jestli jsem to dobre pochopil. Ale slo by treba.

public function processForm(Form $form) {
	$data = $form->values;
	// ....
	$this['consuptionHistoryListControl']->setData($data);
}
Barvoj
Člen | 60
+
+2
-

Osobně bych to dělal cca takto:

Filtrovací formulář jako komponenta s callbackem kterému se předají hodnoty z formuláře

use Nette\Application\UI\Control;
use Nette\Application\UI\Form;

/**
 * @method onSuccess(array $filterValues)
 */
class FilterForm extends Control
{
	public $onSuccess = [];

	public function createComponentForm()
	{
		$form = new Form();
		$form->addText('name', 'Name');

		$form->onSuccess[] = function (Form $form) {
			$this->onSuccess($form->getValues($asArray = true)); // volání callbacku
		}

		return $form;
	}

}

A dále presenter, který si uloží filtrovací hodnoty a při vytvoření gridu se použijí

use Nette\Application\UI\Presenter;

class GridPresenter extends Presenter
{
	protected $filterValues = [];

	public function createComponentFilterForm()
	{
		$form = $filterFormFactory->create();

		$fomr->onSuccess[] = function($filterValues) {
			$this->filterValues = $filterValues; // Uložení hodnot z filtrovacího formuláře
		}

		return $form;
	}

	public function createComponentSomeGrid()
	{
		$data = $this->repository->findBy($this->filterValues); // záskání dat z DB

		return new Grid($data);
	}
}

Editoval Barvoj (18. 5. 2016 16:07)

MarekR
Člen | 17
+
0
-

@Felix velmi pekne dakujem presne toto som hladal! :)
@Barvoj aj tebe vdaka, nad niecim takym som tiez premyslal (sice data neberiem z db ale API no pri tomto priklade je to vlastne jedno)

Palec hore vsetkym :)