Zpracování dat z formuláře v metodě render
- fikusir
- Člen | 27
Ahoj,
z zcela amaterského soudku (samouk).
Mám v šabloně tabulku s daty a formulář, který se mi daří zobrazit a také odeslat s tím, že se mi zobrazí flashmsg. Formulář má sloužit k tomu, aby si uživatel omezil data (filtr), která se dolují z databáze v renderOthers a následně zobrazují v šabloně.
Dotaz zní, jak si načtu odeslané hodnoty z fomuláře v metodě renderOthers, tak abych je mohl použít pro úpravu toho databázového dotazu, prosím?
Moc díky
<?php
public function renderOthers(): void
{
$httpRequest = $this->getHttpRequest();
$this->template->records = $this->database->table('Records')
->order('Id DESC')
->limit(100);
}
protected function createComponentFilterForm(): Form
{
$form = new Form; // means Nette\Application\UI\Form
$form->addText('inputsap', 'SAP:');
$form->addText('inputline', 'Linka:');
$form->addText('inputfrom', 'Od:');
$form->addText('inputto', 'Do');
$form->addSubmit('send', 'Potvrdit');
$form->onSuccess[] = [$this, 'filterFormSucceeded'];
return $form;
}
public function filterFormSucceeded(Form $form, \stdClass $values): void
{
$this->flashMessage('Děkuji za komentář', 'alert-info');
$this->redirect('this');
}
?>
- Kamil Valenta
- Člen | 820
- renderOthers bude mít parametry sap, linka, od, do
- po odeslání formu přesměruješ s těmi hodnotami parametrů
public function renderOthers($sap = null, $linka = null, $od = null, $do = null)
public function filterFormSucceeded(Form $form, \stdClass $values): void
{
$this->flashMessage('Děkuji za komentář', 'alert-info');
$this->redirect('this', ['sap' => $values->inputsap, 'linka' => ...]);
}
V render metodě si můžeš předat parametry do šablony, nebo provést filtraci, nebo cokoliv dalšího…
Editoval kamil_v (10. 7. 2020 14:14)
- fikusir
- Člen | 27
kamil_v napsal(a):
- renderOthers bude mít parametry sap, linka, od, do
- po odeslání formu přesměruješ s těmi hodnotami parametrů
public function renderOthers($sap = null, $linka = null, $od = null, $do = null)
public function filterFormSucceeded(Form $form, \stdClass $values): void { $this->flashMessage('Děkuji za komentář', 'alert-info'); $this->redirect('this', ['sap' => $values->inputsap, 'linka' => ...]); }
V render metodě si můžeš předat parametry do šablony, nebo provést filtraci, nebo cokoliv dalšího…
Funguje parádně. Ještě k tomu, když si chci hodnotu zapamatovat a vypsat ve formuláři. Je toto dobrý postup? V podstatě jsem si hodnotu z formuláře na tvou radu předal do render metody a tam ji uložil do atributu třídy. Tento atribut následně použil ve vytváření komponenty.
<?php
/** @var Nette\Database\Context */
private $database;
private $inputsap;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderOthers($sap=null): void
{
$this->template->records = $this->database->table('Records')
->order('Id DESC')
->limit(100);
$this->inputsap=$sap;
}
protected function createComponentFilterForm(): Form
{
$form = new Form; // means Nette\Application\UI\Form
$form->addText('inputsap', 'SAP:')
->setDefaultValue($this->inputsap);
$form->addText('inputline', 'Linka:');
$form->addText('inputfrom', 'Od:');
$form->addText('inputto', 'Do');
$form->addSubmit('send', 'Potvrdit');
$form->onSuccess[] = [$this, 'filterFormSucceeded'];
return $form;
}
public function filterFormSucceeded(Form $form, \stdClass $values): void
{
$this->flashMessage('Děkuji za komentář', 'alert-info');
$this->redirect('this',['sap' => $values->inputsap]);
}
?>
- MajklNajt
- Člen | 498
@fikusir ak chceš zachovať vybraný parameter, nastav mu anotáciu
@persistent
(musí byť public
) + by som trošku
upravil ten render. A ak chceš vybranú hodnotu zobraziť vo formulári ako
default, nastav ju pri vytváraní formu
<?php
/** @var Nette\Database\Context */
private $database;
/** @persistent */
public $inputsap;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderOthers($sap=null): void
{
if($sap !== null) {
$this->inputsap=$sap;
}
$this->template->records = $this->database->table('Records')
->order('Id DESC')
->limit(100);
}
protected function createComponentFilterForm(): Form
{
$form = new Form; // means Nette\Application\UI\Form
$form->addText('inputsap', 'SAP:')
->setDefaultValue($this->inputsap);
$form->addText('inputline', 'Linka:');
$form->addText('inputfrom', 'Od:');
$form->addText('inputto', 'Do');
$form->addSubmit('send', 'Potvrdit');
$form->onSuccess[] = [$this, 'filterFormSucceeded'];
if($this->inputsap !== null) {
$form->setDefaults(['inputsap' => $this->inputsap]);
}
return $form;
}
public function filterFormSucceeded(Form $form, \stdClass $values): void
{
$this->flashMessage('Děkuji za komentář', 'alert-info');
$this->redirect('this', ['sap' => $values->inputsap]);
}
?>
EDIT: až teraz som si všimol riadku ->setDefaultValue($this->inputsap); – to je samozrejme tiež možnosť ->setDefaults([…]) robí to isté…
Editoval MajklNajt (10. 7. 2020 16:13)