Po odeslání formuláře zobrazení druhého

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

Řeším jeden problém a nak si nevím rady.

Mám jeden formulář , a po odeslání toho prvního by se mel vypsat druhy formular v kterym budou jako default hodnoty nastaveny udaje podle toho co bylo odeslano v tom prvním.
Zkoušel sem to nak sestavit, ale udělal sem jeden a pak už nevím jak kde vytvářet ten druhý.
Díky za rady.

Tomáš Votruba
Moderator | 1114
+
0
-

K tomu můžeš využít session, do které po odeslání prvního formuláře uložíš data, a nastavení defaultních hodnot formuláře

Domki
Člen | 310
+
0
-

No já sem to nějak zkoušel.
mam metodu protected function createComponentUpravaKategoriiVypisForm() kde vytvořím první formulář
pak protected function createComponentUpravitKategoriiForm() kde vytvořím druhy formulář

a pak takto metodu na odeslani prvního formuláre:

public function upravaKategoriiVypisFormSubmited(Form $form)
	{
		$detKategorie = $this->context->createKategorie()->where('id_kategorie = ?', $form->values->seznam_kategorii)->fetch();
		$this->vypsatUpravuKategorie = TRUE;
		$this->upravovanaKat = $detKategorie["nazev_kategorie_cz"];


		$this->formProUpravu["nazev_kategorie"]->setDefaultValue($detKategorie->nazev_kategorie);
		$this->formProUpravu["nazev_kategorie_cz"]->setDefaultValue($detKategorie->nazev_kategorie_cz);
		$this->formProUpravu["nadnazev_kategorii"]->setDefaultValue($detKategorie->nadnazev_kategorii);
	}

Pomocí teto promenne $this->vypsatUpravuKategorie = TRUE; rozlisuju zda se ma v sablone zobrazit druhej formular, a kdyz jo tak se v ty metode po odeslani prvního form má nastavit default hodnoty do toho prvního ale to mi nejde a hlásí chybu: Call to a member function setDefaultValue() on a non-object se
Jak se jí mam vyhnout?
$this->formProUpravu – toto je promenna formulare kterou mam definovanou mimo metody, chctel sem tim zajistit nak abych v teto metode mohl nastavit default. hodnoty toho predesliho form. Nevím jak k nemu jinak pristoupit, kdyz nejsem v metode vytvareni form

Díky

22
Člen | 1478
+
0
-

Napřed se zamysli, jak by jsi to řešil bez Nette a pak si vem na pomoc Nette. Jinak je to stejný princip, jako krokový formulář a to už se tu na fóru řešilo, takže hledej…

nanuqcz
Člen | 822
+
0
-

Já bych to Schmutzkovo řešení napsal nějak takhle:

class UserPresenter extends Presenter{
	function renderName(){
		// pro ukázku: nejdříve spustíme tuto akci, kde uživatel vyplní jméno.
		// pak bude přesměrován na akci 'surname', kde vyplní i příjmení.
	}

	function createComponentNameForm(){
		$form = new Form();
		$form->addText('name', 'Jméno');
		$form->addSubmit('next', 'Pokračovat');

		$form->onSuccess[] = callback($this, 'processNameForm');
		return $form;
	}

	function processNameForm(Form $form){
		$formSession = $this->getSession('user');

		$formSession->name = $form->values;

		$this->redirect('surname');
	}



	function renderSurname(){
		$nameValues = $this->getSession('user')->name;  // takto se dostanu k dříve uloženým hodnotám do session

		$this['surnameForm']->setDefaults($nameValues);  // $this[surnameForm] mi vrátí komponentu vytvořenou v createComponentSurnameForm()
	}

	function createComponentSurnameForm(){
		$form = new Form();
		$form->addText('name', 'Jméno');  // defaultní hodnotu vyplňujeme v renderSurname()
		$form->addText('surname', 'Příjmení');
		$form->addSubmit('save', 'Ulož hodnoty');

		$form->onSuccess[] = callback($this, 'processSurnameForm');
	}

	function processSurnameForm(Form $form){
		$values = $form->values;

		$values->name;  // obsahuje vyplněné jméno
		$values->surname;  // obsahuje vyplněné příjmení
	}
}
Domki
Člen | 310
+
0
-

No bez nette už jsem to dělal.
To jsem mel form1, a kdyz post promena byla nastavena tak se zobrazil druhy. a ty hodnoty jsem tam predal jako POST z toho prvního

Domki
Člen | 310
+
0
-

nanuqcz: Ano to vypadá dobře,
Mohu se ještě zeptat jak by to vypadalo v šabloně např to z render surname?

nanuqcz
Člen | 822
+
0
-

Šablona User/name.latte:

{control nameForm}

Šablona User/surname.latte:

{control surnameForm}

Čekal jsi něco jiného? :-)

Domki
Člen | 310
+
0
-

No=D

Trochu ale nechápu já ty dva formuláře chcu vypisovat na jedný stránce
otevru stranku zobrazi se jeden, ten vyplnim, odeslu, a zobrazi se mi pod ním druhy.

Nette jeste moc neznam, a nak tak beru ze k jednomu presenteru mam jednu sablonu, Tak nechápu jak v jednom presenteru na jednu stranku mam vypisovat na dve sablony?

nanuqcz
Člen | 822
+
0
-

Jo takhle, myslel jsem, že chceš vypsat nejdřív první, a pak jen druhý (ne oba současně) :-P

V tom případě se bude přesměrovávat vždycky jen na jednu akci, a v šabloně budeš kontrolovat, jestli chceš druhý formulář zobrazit.

{control nameForm}

{if $userSession->name}  // proměnnou $userSession si do šablony předáš v presenteru
	{control surnameForm}
{/if}

Hlavně se ale ujisti, že chápeš princip, jak tohle (i to předchozí) řešení funguje. Kopírováním se Nette nenaučíš :-P (pokud pochopíš princip toho prvního řešeni, na tuhle drubnou úpravu už bys přišel určitě sám ;-))

Domki
Člen | 310
+
0
-

Jo takže to vlastně udělám tou podmínkou co sem to dělal před tím.

Jo tak ted už to asi nak tak chápu.
Ty tam tou metodou function renderSurname()… uděláš vlastně výpis do šablony místo toho return $form? co je v prvním.?
a tímto $this->redirect(‚surname‘); se udělá že se načte (zobrazí ) ten druhy?
Ale misto toho redirect by ted mělo byt taky něco jiného? kdyz nechci presměrovat na jinou stranku ne?

I když ještě moc nechápu ty rendery třeba proc renderName je prazdy, to tam byt nemusí ne?
ono ja sem doted delal vpodstate tak Ze sem mel Sablonu, presenter, a v presenteru vzdy jen render k ty sablone, tak ted kdyz chci vypisovat oba tak tam bude zase jen jeden render?

Domki
Člen | 310
+
0
-

Tak jsem kód upravil.
Nyní po vybraní v pvním se zobrazí druhy, ale stale se nenastavi defaultní hodnoty, tam kde je ted nastavuju tak to píse ze dana komponenta neni známá.
Kde tedy a jak je mám nastavit?

<?php
use Nette\Application\UI\Form;
use Nette\Database\Connection;

/**
 * Presenter na výpis uprava kategorii
  *
 */
class UpravaKategoriiPresenter extends SecuredPresenter
{
	public $upravovanaKat;

	public function startup()
	{
		parent::startup();
	}

	protected function createComponentUpravaKategoriiVypisForm()
	{
		$kategorie = $this->context->createKategorie()->order('nazev_kategorie_cz ASC')->fetchPairs('id_kategorie', 'nazev_kategorie_cz');

		$form = new Form();
		$form->addSelect('upr_ategorii', 'Upravit kategorii:', $kategorie)->setPrompt('- Vyberte kategorii -')->addRule(Form::FILLED, 'Vyberte kategorii.');
		$form->addSubmit('zobraz_upravu_kategorie', 'Zobrazit úpravu kategorie')->setAttribute('class', 'vyplneni_udaju_form_odeslat');

		$form->onSuccess[] = callback($this, 'upravaKategoriiVypisFormSubmited');
		return $form;
	}

	function upravaKategoriiVypisFormSubmited(Form $form){
		$session = $this->getSession('mySession');
		$session->kategorie = $form->values->upr_ategorii;
	}



	protected function createComponentUpravitKategoriiForm()
	{
		$form = new Form();

		$form->addText('nazev_kategorie', 'Název kategorie:')->addRule(Form::FILLED, 'Název kategorie musí být vyplněný.')->addRule(Form::MAX_LENGTH, 'Název kategorie nesmí mít vice jak 30 znaků.', 30);
		$form->addText('nazev_kategorie_cz', 'Název kategorie CZ:')->addRule(Form::FILLED, 'Název kategorie CZ musí být vyplněný.')->addRule(Form::MAX_LENGTH, 'Název kategorie CZ nesmí mít vice jak 30 znaků.', 30);
		$form->addText('nadnazev_kategorii', 'Nadnázev kategorií:')->addRule(Form::MAX_LENGTH, 'Nadnázev kategorií nesmí mít vice jak 30 znaků.', 30);
		$form->addSubmit('upravitKategorii', 'Upravit kategorii')->setAttribute('class', 'vyplneni_udaju_form_odeslat');

		$form->onSuccess[] = callback($this, 'upravitKategoriiFormSubmited');

		return $form;
	}

	function upravitKategoriiFormSubmited(Form $form){
		dump($form->values);
	}


	public function renderUpravaKategorii()
	{
		$session = $this->getSession('mySession');

		$kategorie = $session->kategorie;  // takto se dostanu k dříve uloženým hodnotám do session

		if(strlen($kategorie) > 0)
		{
			$detKategorie = $this->context->createKategorie()->where('id_kategorie = ?', $kategorie)->fetch();
			$this->upravovanaKat = $detKategorie->nazev_kategorie_cz;
			$defHod = array(
				'nazev_kategorie' => $detKategorie->nazev_kategorie,
				'nazev_kategorie_cz' => $detKategorie->nazev_kategorie_cz,
				'nadnazev_kategorii' => $detKategorie->nadnazev_kategorii
			);
			$this['upravitKategorii']->setDefaults($defHod);
		}

		$this->template->upravKat = $this->upravovanaKat;
		$this->template->uprKategorie = $session->kategorie;
	}
}

Editoval Domki (16. 8. 2012 8:08)

nanuqcz
Člen | 822
+
0
-

Jo takže to vlastně udělám tou podmínkou co sem to dělal před tím.

Jj, když se na to teď dívám, tak jsi to měl vlastně původné dobře. Až na to, že:

  1. Jsi si hodnoty předchozího formuláře ukládal do lokálních proměnných v presenteru, místo do sessions (což klidně můžeš, jenom je musíš označit jako persistentní, aby ti jejich hodnota vydržela i po přesměrování)
  2. Jsi nevěděl, jak se dostat v kódu k formuláři (místo $this->formProUpravu je správně $this['formProUpravu'])

K tomu kódu, co jsi teď napsal: místo $this['upravitKategorii']->setDefaults($defHod); má být $this['upravitKategoriiForm']->setDefaults($defHod); :-)

Domki
Člen | 310
+
0
-

No tak sem to opravil za $this[‚upravitKategoriiForm‘]->setDefaults($defHod);
A řekl bych že to už celý chodí tak jak bych si představoval.

Co se týče bodu 1. těch session to myslíte
toto:?

function upravaKategoriiVypisFormSubmited(Form $form){
		$session = $this->getSession('mySession');//dalsí z možností pouziti SESSION
		$session->kategorie = $form->values->upr_ategorii;
	}

Jestli jo tak jn, a asi necham ty session sou mi nak tak bližší nez persistentní promenný

Tak velmi děkuji za pomoc se sprovozněním kódu.

To je paráda když člověk vidí že už to funguje. :-)

Editoval Domki (16. 8. 2012 18:28)