editacni formular – hidden pole a dynamicky selectbox

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

vvv
Člen | 5
+
0
-

Nikdo netusite prosim? Kde plnite hodnoty do hidden pole nebo itemy do selectboxu vy? Diky

odin
Člen | 50
+
0
-

Formular vytvartim a hodnoty selectu plnim v createComponentxxx(). Vychozi hodnoty nastavuju v renderxxx().

worsik
Člen | 40
+
0
-

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)