Zpracování dat z formuláře v metodě render

fikusir
Člen | 27
+
0
-

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
+
+1
-
  1. renderOthers bude mít parametry sap, linka, od, do
  2. 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
+
0
-

kamil_v napsal(a):

  1. renderOthers bude mít parametry sap, linka, od, do
  2. 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
+
0
-

@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)

lukyn
Člen | 21
+
0
-

Ahoj,
jsem také samouk a tak se možná hloupě budu ptát.

Lze nějak šikovně docílit toho, abych si parametr „sap“ nepředal přes redirect (bez použití AJAxu) a měl tak čisté url ?

Editoval lukyn (3. 10. 2020 10:21)