Form se nezpracuje přes checkbox. (jen v jednom případě, jinak funguje)

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

Ahoj,

mám tu problém. V následujicím kódu je formulář který vytvoří tři checkboxy. Ty se odesílají, přes onClick submit, následně ukládají do persistentní proměné. Z které se pak nastavují setDefaults. Všechno funguje docela dobře, až no to že když je zaškrtlý jeden check box, já ho odškrtnu, tak se nezpracuje formulář. Do url se sice přidá &do=form-submit, stránka se refreshuje, ale metoda proccessForm neproběhne. Jinak to funguje (dva zaškrtlé, přidává se třetí atd..), chyba je jen když zůstane poslední.

<?php

class DeepSkyPresenter extends BasePresenter {

    /**
     * @persistent
     */
    public $values;

    protected function createComponentForm($name) {
	$form = new \Nette\Application\AppForm($this, $name);

	$type = array(
	    'GALAXY' => 'Galaxy',
	    'PLNNB' => 'Planetary Nebula',
	    'LMCOC' => 'Open cluster in the LMC'
	);

	foreach ($type as $key => $value){
	    $form->addCheckbox($key, $value)->controlPrototype->onClick('submit();');
	}

	$form->onSubmit[] = callback($this, 'proccessForm');

	return $form;

    }

    public function proccessForm($form) {
	$values = $form->getValues();

	$this->values = $values;

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

    public function actionDefault($values) {
	if ($values != null)
	    $this['form']->setDefaults($values);
    }
}
?>

Nette build z 2010–12–15 php 5.3

Ani
Člen | 226
+
0
-

Problém vyřešen. Nette funguje asi tak, že když se odešlou prázdná data, tak se formulář nezpracuje. Takže stačí do formuláře přidat jeden hiden s nějakou libovolnou hodnotou.

hrach
Člen | 1834
+
0
-

Nette by imho mělo obsahovat tento jednoduchý fix, pri:

$form->addCheckbox('like', 'Máte tento produkt rádi?');

vygeneruje:

<input type=hidden name=frm-like value=0>
<input type=checkbox name=frm-like value=1>

to vede k tomu, ze pokud neni checkkbox zaskrnuty, posila se i dana „nezaskrnuta hodnota“, coz u boolean checkboxu je celkem i zadnouci.

kontrola drive:

if (isset($values['like']))

kontrola nyni:

if ($values['like'])
kravčo
Člen | 721
+
0
-

Nette pri spracovaní formulára konvertuje hodnotu checkboxu na boolean, teda pokiaľ máme checkbox „like“, po odoslaní formulára platí:

is_bool($values['like']) === TRUE

Problém je, že v prípade formulára len s checkboxami a bez odosielacieho tlačítka sa môžu odoslať prázdne dáta. Mám pocit, že ani v čistom PHP sa nedá overiť, či bol taký formulár odoslaný…

Nox
Člen | 378
+
0
-

Leda teda že by se tam hidden plácl vždy…