Po odeslání formuláře zobrazení druhého
- Domki
- Člen | 310
Ř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
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
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
- nanuqcz
- Člen | 822
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
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
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
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
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
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:
- 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í)
- 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
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)