predani pole hodnot z formulare do sablony

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

Zdravim,
snazim se prokousat zaklady Nette a narazil jsem hned na zacatku na problem. Jak predat z formulare pole hodnot do presenteru. Vychazim ze sandboxu 2.4. Jak se to ma spravne resit – prenaset redirectem? Nebo persistentni promennou? (pripadne mi to jako takovy necisty reseni)

<?php
class CustomerFindFormFactory
{
	use Nette\SmartObject;

	/** @var \App\Forms\FormFactory */
	private $factory;

	/** @var Model\CustomerManager */
	private $customerManager;

	public function __construct(\App\Forms\FormFactory $factory, Model\CustomerManager $customerManager)
	{
		$this->factory = $factory;
        $this->customerManager = $customerManager;
    }

	public function create(callable $onSuccess)
	{
		$form = $this->factory->create();
		$form->addText('id', 'ID zákazníka:');
        $form->addText('name', 'Jméno:');
		// ...
		$form->addSubmit('send', 'Hledej');
		$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
            // ...
			$onSuccess($values);
		};
        $form->setRenderer(new \App\Forms\Bs3FormRenderer());
		return $form;
	}
}
?>
<?php
class CustomerPresenter extends \App\Presenters\BaseSecuredPresenter
{
    /** @var Forms\CustomerFindFormFactory @inject */
	public $customerFindFactory;

    /** @var \App\DataModule\Model\CustomerManager @inject */
	private $customerManager;

    public function __construct(Model\CustomerManager $customerManager)
	{
		$this->customerManager = $customerManager;
	}


	protected function createComponentCustomerFindForm()
	{
		return $this->customerFindFactory->create(
			function ($values) { $this->redirect('Customer:Find', $values); }
        );
    }


    public function renderFind($values)
	{
            $this->template->customers = $this->customerManager->find($values);
	}

}
?>
Spectator
Člen | 48
+
0
-

Další možností je vytvoření property v rámci presenteru nebo jako proměnnou v session a tu v onSuccess plnit.

Editoval Spectator (13. 8. 2016 11:06)

CZechBoY
Člen | 3608
+
0
-

Ja bych si udelal komponentu a do ni dal dalsi „komponentu“ – ten tvuj frmular.
Pro tu obalovaci komponentu uz muzes mit vlastni sablonu a nemusis to tahat do presenteru.
Pak zvol asi libovolny pristup k predani promenne.
Lepsi by bylo napsat kde vubec tu promennou ten tvuj formular najednou vezme – jestli to je jen nejaka odeslana hodnota nebo vysledek volani nejaky funkce.

pp
Člen | 50
+
0
-

Diky za reakce ale porad mi to neni jasny.
Ok, takze $values nepredavam jako parametr pres redirect ale do presenteru si pridam

<?php
private $formdata = [];

public function setFormdata($values){
  $this->formdata = $values;
}
public function getFormdata(){
  return $this->formdata;
}
?>

ale pokud pak v tovarne vytvarim formular ve fci create(), prevezmu vyplnene hodnoty, nastavim si je do privatni promenne ‚formdata‘ v presenteru, tak pak stejne volam callback ‚onSuccess‘ s redirectem takze o data prijdu

<?php
public function create(callable $onSuccess) {
        $form = $this->factory->create();
        $form->addText('name', 'Jméno:');
        // ...
        $form->addSubmit('send', 'Hledej');
        $form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
            // ...
			$form->getPresenter()->setFormdata($values);
            $onSuccess();
        }
};
?>

neco mi unika, potreboval bych to asi trochu nazorneji.

Jde vlastne jen o to, ze mam vyhledavaci formular, kde je mozno vyplnit 1 az 10 poli a podle tech vyplnenych parametru vytahnout data z DB a predat sablone.

CZechBoY
Člen | 3608
+
0
-

Proč vlastně přesměrováváš když je to vyhledávání?
Já si při filtrování ověřím, že je formulář úspěšně odeslaný (když je tak vezmu data z formu, jinak nějaký default) a poté filtruju.

pp
Člen | 50
+
0
-

ok, diky

puvodne jsem vychazel z prispevku (i kdyz tady to je mezi ruznymi presentery):

https://forum.nette.org/…ny-presenter

prijde mi ze predavani filtru primo v URL je spravne, uzivatel ma moznost si ulozit odkaz na konkretni dotaz
ale narazim samozrejme na velikost pole (muze byt velke a asi muzu prekrocit nejaky limit – mam tuseni ze prohlizece meli limit nekde kolem 1000 znaku?)

Takze pokud je doporuceno predavat pres promennou presenteru, udelal jsem to takto.

A proc se snazim presmerovat? Protoze vsude v navodech ctu ze po odeslani POST je to treba. Viz „quickstart“

Toto je vhodné udělat po každém odeslání formuláře, pokud obsahoval validní data a callback provedl operaci tak jak měl. A taky pokud přesměrujeme stránku po odeslání formuláře, neuvidíme dobře známou hlášku Chcete odeslat data z formuláře znovu?, kterou občas můžeme v prohlížeči spatřit.

Kazdopadne pokud to udelam, prijdu o data v promenne formdata[] presenteru. Takze jsem redirect zakomentoval. Ale i kdyz to takto funguje, nevim jestli to je spravny postup. Kdyz se to zacinam ucit, nerad bych si hned na zacatku osvojoval chybny navyky.

$form->onSuccess[] = function (Form $form, array $values) use ($onSuccess) {
    $form->getPresenter()->setFormdata(array_filter((array) $values, function ($s) {return ($s === "" || $s === NULL || $s === [] ? FALSE : TRUE);}));
	$onSuccess();
};
protected function createComponentCustomerFindForm()
{
        return $this->customerFindFactory->create(
            function ($values) {
				//$this->redirect('this');
			}
        );
}

PS: to obalovani komponenty do dalsi komponenty a pouziti vlastni sablony jsem nepobral.
Porad v tom plavu, prosel jsem uz hodne prispevku ale nemam jasno. Uvital bych odkaz praktickou ukazku nebo odkaz na prispevek kde se to resilo.
Chtel bych vedet jak se to ma spravne delat, proc tak a proc je to jinak spatne.

CZechBoY
Člen | 3608
+
0
-

@pp ale pokud „odešleš“ data přes GET tak není přesměrování potřeba (přesměroval bys úplně na tu stejnou stránku).
Pokud to máš nějaký „pokročilý vyhledávání“ tak bych použil POST a třeba přesměroval na nějakou unikátní url (/vyhledavani?searchKey=fsdjfndj) po odeslání formuláře. Ty vyhledávaný data uložíš někam do session pomocí tohoto klíče.