editacni formular – hidden pole a dynamicky selectbox
- vvv
- Člen | 5
Ahoj,
v nette jsem celkem zacatecnik. Pouzil jsem ho uz na jeden mensi staticky web, ale ted delam na necem vetsim. Poprve tedy pracuju s formulari a tam je taky kamen urazu.
V presenteru takhle vytvarim prazdny formular.
<?php
protected function createComponentForm()
{
$form = new AppForm();
...
$form->addGroup('General');
$form->addHidden('id');
$form->addSelect('type', 'Type');
...
$form->addSubmit('ok', 'ok');
$form->onSubmit[] = callback($this, 'formSubmitted');
return $form;
}
?>
V akci pak do formulare plnim hodnoty, coz jde v poradku.
Edit: funkce tu je neuplna – spatne, spravne o post niz
<?php
public function actionClientEdit()
{
$id = $this->params['id'];
$client = new ClientModel();
$client->load($id);
$this['form']->setDefaults(get_object_vars($client));
}
?>
Ale, nedari se mi do formulare vlozit hodnotu do hidden pole a nedari se mi naplnit selectbox, ktery se plni dynamicky z databaze. Resp. podari se mi hodnoty do formulare vlozit a pri praci s nim hodnoty vidim, ale kdyz formular submitnu, z hidden pole a selectboxu nedostanu zadna data. V sablone formular vkladam jako {control form}. Netusite a neporadite prosim co delam spatne? Diky
Editoval vvv (6. 7. 2010 21:51)
- odin
- Člen | 50
rekl bych, ze je to proto, ze hidden prvku se nenastavuje vychozi hodnota
(ale hodnota) a ze u selectu nejsou zadane zadne polozky
Cili pro hidden:
<?php
$this['form']['id']->setValue($client->id);
?>
a pro select:
<?php
$this['form']['id']->setItems(neco);
?>
nebo zrejme spis v createComponent:
<?php
$form->addSelect('type', 'Type', neco);
?>
pricemz to neco je pole typu, ze kterych se vybira.
- vvv
- Člen | 5
Aha, chybka v minulem postu. Ta akce vypada takhle.
<?php
public function actionClientEdit()
{
$id = $this->params['id'];
$client = new ClientModel();
$client->load($id);
$this['form']->getComponent('id')->setValue($id);
$this['form']->getComponent('type')->setItems($client->type_items, TRUE);
$this['form']->setDefaults(get_object_vars($client));
}
?>
Cili ty udaje tam jsou vyplnene, ale pri submitu tam zadna data nejsou.
Pokud ale data vyplnim staticky uz ve funkci createComponentForm, tak ty udaje jsou opet videt, ale jsou dokonce videt i po submitu. Jenze ja ta data nevyplnuji vzdy a jeste k tomu stejne, proto mi neprijde ok to delat ve funkci createComponentForm, ale az v akci.
Editoval vvv (6. 7. 2010 21:47)
- toka
- Člen | 253
Proč tam máš řádek
$this['form']->setDefaults(get_object_vars($client));
, když už
oba formulářové prvky nastavíš pomocí
$this['form']->getComponent('...')->setValue(...);
? Kdybys
měl klíče, které vrací metoda load()
, shodné s názvy
jednotlivých prvků formuláře (id
, type
), tak by ti
fungovalo setDefaults
v pohodě.
Navíc, load()
ti vrací právě jednu hodnotu pro prvek
select
. U výběrové nabídky se očekává více možností, a
ty bys měl tomuto prvku předávat již v createComponentForm()
jako třetí parametr
$form->addSelect('type', 'Type', $types);
.
- vvv
- Člen | 5
Protoze v tom formulari je jeste asi dalsich 50 kolonek. Ktere jsou schovane v tech „…“. A ty se prave nastavuji tim setDefaults.
Jak uz pisu po treti. Neni problem nastavit jak defaultni hodnoty, tak itemy u selectboxu. Formular se zobrazi ZCELA spravne. Ale chyba je az po odeslani, kdy hodnoty u hidden poli a selectboxu jsou jen null. Pokud ale nastavim hodnotu u hidden pole nebo itemy u selectboxu uz ve funkci createComponentForm, tak vse projde v poradku. Cili formular se pri nastaveni v akci nebo funkci create zobrazi UPLNE stejne, jen v tom prvnim pripade nefunguje. Ale ja to potrebuju nastavovat az v akci.
Editoval vvv (7. 7. 2010 14:48)
- worsik
- Člen | 40
Ve chvíli, kdy plníš Select v továrničce podle parametru, tak (tedy
alespoň mi) parametr v URL zmizí v obslužném handleru Formuláře.
Vzhledem k tomu, že se továrnička projíždí ještě jednou, bude Select
prázdný…
Stávalo se mi to taky.
Řešil jsem to většinou tak, že si v továrničce hodím parametr id do sessiony:
<?php
$id = $this->getParam('id');
$s = Environment::getSession('nazev_podle_tebe');
if ($id)
$s->id = $id;
else
$id = $s->id;
?>
V handleru pak nastavím
<?php
$s = Environment::getSession('nazev_podle_tebe');
$s->id = null;
?>
Druhou možností je měnící se SQL dotaz, nebo spíš WHERE část.
<?php
$id = $this->getParam('id');
$sql = "SELECT id, name FROM bla WHERE bla bla bla";
if ($id)
$sql .= " AND id_neceho = $id";
$items = dibi::query($sql)->fetchPairs();
$form->addSelect('name','neco',$items)
->skipFirst('Neuvedeno')
...
;
?>
Edit:
Ještě jsem zapomněl ty Hiddeny
<?php
$form->addHidden('id');
if ($id)
$form['id']->setValue($id);
?>
Editoval worsik (14. 7. 2010 10:20)