predani pole hodnot z formulare do sablony
- pp
- Člen | 50
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);
}
}
?>
- CZechBoY
- Člen | 3608
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
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.
- pp
- Člen | 50
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
@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.